2023. 3. 29. 16:59ใSpring
์๋์ ๋ณด์ฌ์ง๋ ์ํ ๋ฑ๋ก ํ๋ฉด์ CATEGORY select ๋ฐ์ค์๋ ํ์ฌ ์ฌ์ฉ์ค์ธ ์นดํ ๊ณ ๋ฆฌ๋ง ๊ฐ์ง๊ณ ์์ผ ํจ.
์ํ ๋ฑ๋ก ํ์ด์ง๋ก ์ด๋ํ ๋ ์ด์ ์ ์์ฑํ ์ฌ์ฉ์ค์ธ ์นดํ ๊ณ ๋ฆฌ ๋ชฉ๋ก ์กฐํ ๋ฉ์๋ ์ฌ์ฉ
๋ฉ์๋ ์ฌ์ฉ์ ์ํด AdminController์ itmeService ์์กด์ฑ ์ฃผ์ ํ ๋ฉ์๋ ์คํ
//์ํ ๋ฑ๋ก ํ์ด์ง
@GetMapping("/regItem")
public String regItemForm(Model model, AdminSubMenuVO adminSubMenuVO) {
//์ฌ์ฉ์ค์ธ ์นดํ
๊ณ ๋ฆฌ ๋ชฉ๋ก ์กฐํ
model.addAttribute("categoryList", itemService.getCateListInUse());
return "content/admin/reg_item";
}
reg_item.html์ ์นดํ ๊ณ ๋ฆฌ ์ ํํ๋ select ๋ฐ์ค์์ for๋ฌธ ์ฌ์ฉ
<div class="col-3">
<label for="" class="form-label">CATEGORY</label>
<select id="" name="cateCode" class="form-select">
<th:block th:each="category : ${categoryList}">
<option th:value="${category.cateCode}">[[${category.cateName}]]</option>
</th:block>
</select>
</div>
์ํ ๋ฑ๋ก ๊ธฐ๋ฅ
itemVO ์์ฑ
์ํ ๋ฑ๋ก ์ฟผ๋ฆฌ ์์ฑ.
์ํ๋ฑ๋ก์ ๊ด๋ฆฌ์ ๊ถํ์ด๊ธฐ ๋๋ฌธ์ admin-mapper์ ์์ฑ.
itemCode๋ ์ถํ์ ๋ฑ๋ก๋ itemCode ์กฐํํ๋ ์ฟผ๋ฆฌ ๋ฐ๋ก ์์ฑํด์ ์ฒ๋ฆฌ.
<!-- ์ํ ๋ฑ๋ก -->
<insert id="regItem">
INSERT INTO SHOP_ITEM (
ITEM_CODE
, CATE_CODE
, ITEM_NAME
, ITEM_PRICE
, ITEM_STOCK
, ITEM_INTRO
, ITEM_STATUS
) VALUES (
#{itemCode}
, #{cateCode}
, #{itemName}
, #{itemPrice}
, #{itemStock}
, #{itemIntro}
, #{itemStatus}
)
</insert>
AdminService ๋ฉ์๋ ์์ฑ
//์ํ ๋ฑ๋ก
void insertItem(ItemVO itemVO);
AdminServiceImpl ๋ฉ์๋ ๊ตฌํ
//์ํ ๋ฑ๋ก
@Override
public void insertItem(ItemVO itemVO) {
sqlSession.insert("adminMapper.insertItem", itemVO);
}
๋ค์์ ์ฌ itemCode ์กฐํ ์ฟผ๋ฆฌ ์์ฑ.
<!-- ๋ค์์ ์ฌ itemCode ์กฐํ -->
<select id="getNextItemCode" resultType="String">
SELECT 'ITEM_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(ITEM_CODE, 6))), 0) + 1, 3, '0')
FROM SHOP_ITEM
</select>
AdminService ๋ฉ์๋ ์์ฑ
//๋ค์ ๋ฑ๋ก๋ ์ํ ์ฝ๋ ์กฐํ
String getNextItemCode();
AdminServiceImpl ๋ฉ์๋ ๊ตฌํ
//๋ค์ ์ํ ์ฝ๋ ์กฐํ
@Override
public String getNextItemCode() {
return sqlSession.selectOne("adminMapper.getNextItemCode");
}
reg_item.html์์ form ํ๊ณ ์ ๋ ฅํ ๋ฐ์ดํฐ๋ก ์ํ ๋ฑ๋ก๋์ด์ผ ํจ.
๋ฑ๋ก ๋ฒํผ submit์ผ๋ก ์์ ํ๊ณ form ํ๊ทธ ์์ฑ ๋ฃ์ด์ ์ค์ ๋ก ์ํ ๋ฑ๋กํ๋ AdminController๋ก ์ด๋.
<th:block layout:fragment="content">
<div class="row">
<div class="col-12">
<form id="" class="row g-3" th:action="@{/admin/regItem}" method="post">
<div class="col-3">
<label for="" class="form-label">CATEGORY</label>
<select id="" name="cateCode" class="form-select">
<th:block th:each="category : ${categoryList}">
<option th:value="${category.cateCode}">[[${category.cateName}]]</option>
</th:block>
</select>
</div>
<div class="col-9">
<label for="" class="form-label">ITEM NAME</label>
<input type="text" class="form-control" id="" name="itemName">
</div>
<div class="col-6">
<label for="" class="form-label">ITEM PRICE</label>
<input type="text" class="form-control" id="" name="itemPrice">
</div>
<div class="col-6">
<label for="" class="form-label">ITEM STOCK</label>
<input type="number" class="form-control" value="10" min="10" max="100" id="" name="itemStock">
</div>
<div class="col-12">
<label for="" class="form-label">ITEM INTRODUCTION</label>
<textarea rows="5" class="form-control" name="itemIntro"></textarea>
</div>
<div class="col-6">
<label for="" class="form-label">MAIN IMAGE</label>
<input type="file" class="form-control" id="" name="">
</div>
<div class="col-6">
<label for="" class="form-label">MAIN IMAGE</label>
<input type="file" class="form-control" id="" name="">
</div>
<div class="col-12">
<div class="form-check form-check-inline">
<input class="form-check-input" value="1" type="radio" id="" name="itemStatus" checked>
<label class="form-check-label" for="">ํ๋งค์ค</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" value="2" type="radio" id="" name="itemStatus">
<label class="form-check-label" for="">์ค๋น์ค</label>
</div>
<div class="form-check form-check-inline">
<input class="form-check-input" value="3" type="radio" id="" name="itemStatus">
<label class="form-check-label" for="">ํ์ </label>
</div>
</div>
<div class="col-3">
<button id="" type="submit" class="btn btn-primary">REGISTRATION ITEM</button>
</div>
</form>
</div>
</div>
</th:block>
AdminController ์์ฑ.
์ํ ๋ฑ๋ก ์ ์ ๋ฑ๋ก๋ ์ํ ์ฝ๋ ์กฐํํ๋ ๋ฉ์๋ ๋จผ์ ์คํ
ItemVO์ ๋ฐ์ดํฐ ์ธํ ํด์ค ํ ์ํ ๋ฑ๋ก ๋ฉ์๋ ์คํ.
//์ํ ๋ฑ๋ก
@PostMapping("/regItem")
public String regItem(ItemVO itemVO) {
//๋ฑ๋ก๋ ์ํ์ฝ๋ ์กฐํ
String itemCode = adminService.getNextItemCode();
itemVO.setItemCode(itemCode);
//์ํ ๋ฑ๋ก ์ฟผ๋ฆฌ
adminService.insertItem(itemVO);
//์ํ ๋ฑ๋ก ํ์ ์๋ธ ๋ฉ๋ด์ ์ ์ฃผ๊ธฐ ์ํด subMenuCode ๊ฐ์ ธ๊ฐ๊ธฐ
return "redirect:/admin/regItem?subMenuCode=SUB_MENU_002";
}
์ํ ๋ฑ๋ก ํ ๋ค์ regItem controller๋ก ์ด๋ํ๋ฉด ์๋ธ๋ฉ๋ด์ธ ์ํ๋ฑ๋ก์ ์์ด ์ฌ๋ผ์ง.
ํ์ด์ง ์ด๋ํ ๋ ๊ฐ์ ๋ก(? subMenuCode ๊ฐ์ ธ๊ฐ๊ฒ ํจ.
์ํ ์ด๋ฏธ์ง ํ์ผ ์ ๋ก๋
์ฒจ๋ถํ์ผ๋ form ํ๊ทธ submit ๋ฒํผ์ผ๋ก ๊ฐ์ ธ๊ฐ์ผํจ.
itemVO์๋ ์ด๋ฏธ์ง ๋ณ์ ์์
์ค๋ฌด์์๋ ์ด๋ฏธ์งํ์ผ์ ์ํ๊ณผ ํ ์ด๋ธ, VO ๋ฑ ๋ถ๋ฆฌํจ
> ์ํ์ด ๋ฑ๋ก๋ ๋ ์ด๋ฏธ์ง๋ ์ฌ๋ฌ๊ฐ ๋ฑ๋ก๋๊ธฐ ๋๋ฌธ์ ๋ถ๋ฆฌํ๋ ๊ฒ.
mainImg๋ 1๊ฐ subImg๋ ์ฌ๋ฌ๊ฐ ํ์ผ ๋ฑ๋ก ๊ฐ๋ฅํ๊ฒ ์ค์ .
input ํ๊ทธ์ multiple ์์ฑ์ ์ฃผ๋ฉด ํ๋์ input์ ์ฌ๋ฌ๊ฐ ์ฌ์ง ์ ๋ก๋ ๊ฐ๋ฅ
<div class="col-6">
<label for="" class="form-label">MAIN IMAGE</label>
<input type="file" class="form-control" id="" name="mainImg">
</div>
<div class="col-6">
<label for="" class="form-label">SUB IMAGE</label>
<input type="file" class="form-control" id="" name="subImg" multiple>
</div>
์ด๋ฏธ์ง ๊ฐ์ธ๊ณ ์๋ form ํ๊ทธ์ enctype="multipart/form-data ์์ฑ ๊ผญ ๋ฃ์ด์ค์ผ ์ฒจ๋ถํ์ผ ๋ฐ์ดํฐ ๊ฐ์ ธ๊ฐ!
<form id="" class="row g-3" th:action="@{/admin/regItem}" method="post" enctype="multipart/form-data">
controller์์ ์ํ ๋ฑ๋ก์ ํ ๋ ์ด๋ฏธ์ง ์ธ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ itemVO ์ปค๋งจ๋ ๊ฐ์ฒด๊ฐ ์ฒ๋ฆฌํจ
itemVO๋ ์ด๋ฏธ์ง ํ์ผ ์ ๋ฐ์์ด.
์ด๋ฏธ์ง ํ์ผ์ ์ฒ๋ฆฌํ๋ ๊ฐ์ฒด ๋ฐ๋ก ํ์!
ํ์ผ์ฒจ๋ถ ์ ํ์ผ๋ช ์ด ์ค๋ณต๋๋ฉด ์๋จ.
์๋ณธํ์ผ๋ช ์ ๋ฐ์์์ ์๋ฒ์ ์ฌ๋ผ๊ฐ ํ์ผ๋ช ์ ์์ฑํด์ค.
์๋ณธํ์ผ๋ช ์ด abc.jpg > ๋๋ค๋ฌธ์์ด.jpg์ ํ์์ผ๋ก ์์ฑ
์๋ณธํ์ผ๋ช ์์ ํ์ฅ์ ์ถ์ถํ์ฌ ๋๋ค๋ฌธ์์ด๊ณผ ๋ถ์ฌ์ฃผ๋ฉด ๋จ.
๋ฌธ์์ด ์ถ์ถ ์ฝ๋ subString๊ณผ ๋ฌธ์์ด ์์ ์ ์ ์๋ indexOf ์ฝ๋ ์ฌ์ฉ.
//์ํ ๋ฑ๋ก
@PostMapping("/regItem") //์ด๋ฏธ์ง ๋ฐ์์ค๋ ๊ฐ์ฒด, ๋ณ์๋ช
์ mainImg inputํ๊ทธ์ name , subImg๋ ์ ๋ฐ์์ด.
public String regItem(ItemVO itemVO, MultipartFile mainImg) {
//---ํ์ผ ์ฒจ๋ถ---
//์๋ณธํ์ผ๋ช
๋ฐ์์ค๊ธฐ
String originFileName = mainImg.getOriginalFilename();
//์๋ฒ์ ์ฌ๋ผ๊ฐ(์ฒจ๋ถ๋ ) ํ์ผ๋ช
์์ฑ(ํ์ผ๋ช
์ด ์ค๋ณต๋์ง ์๊ฒ)
//UUID : ์ค๋ณตX ๋๋คํ ๋ฌธ์์ด์ ์์ฑ
String uuid = UUID.randomUUID().toString();
//์๋ณธํ์ผ๋ช
์ด abc.jpg > ๋๋ค๋ฌธ์์ด.jpg์ ํ์์ผ๋ก ์ฒจ๋ถ๋ ํ์ผ๋ช
์ ์์ฑ
//์ฒจ๋ถ๋ ํ์ผ์ ํ์ฅ์ ์ถ์ถ
String extension = originFileName.substring(originFileName.lastIndexOf(".")); //๋ง์ง๋ง "."๋ฌธ์์์ ๋๊น์ง
//์๋ฒ์ ์ฌ๋ฆด(์ฒจ๋ถ๋ ) ํ์ผ๋ช
String attachedFileName = uuid + extension;
System.out.println("์๋ณธํ์ผ๋ช
: " + originFileName);
System.out.println("์ฒจ๋ถ๋ ํ์ผ๋ช
: " + attachedFileName);
//๋ฑ๋ก๋ ์ํ์ฝ๋ ์กฐํ
String itemCode = adminService.getNextItemCode();
itemVO.setItemCode(itemCode);
//์ํ ๋ฑ๋ก ์ฟผ๋ฆฌ
adminService.insertItem(itemVO);
//์ํ ๋ฑ๋ก ํ์ ์๋ธ ๋ฉ๋ด์ ์ ์ฃผ๊ธฐ ์ํด subMenuCode ๊ฐ์ ธ๊ฐ๊ธฐ
return "redirect:/admin/regItem?subMenuCode=SUB_MENU_002";
}
์ฒจ๋ถํ์ผ์ด ๋ฑ๋ก๋ ๊ฒฝ๋ก ์ค์ .
static ํด๋ ๋ฐ์ ์ด๋ฏธ์ง ์ ๋ก๋ํ ํด๋ upload ์์ฑ
upload ํด๋ ๊ฒฝ๋ก ์ฐพ์๊ฐ๋ ๋ฒ
ํ๋ก์ ํธ - ์ค๋ฅธ์ชฝ ๋ง์ฐ์ค - properties ์๋ ์ฌ์ง์ ์ฒดํฌ ๋ฒํผ ๋๋ฅด๋ฉด ํด๋ ๋ธ
ํด๋์์ upload ํด๋ ์ฐพ์๊ฐ์ ๊ฒฝ๋ก ๋ณต์ฌํด์ค๋ฉด ๋จ.
์ฌ์ง ํด๋ ๊ฒฝ๋ก๋ ์ฌ๋งํ๋ฉด ๋ณํ์ง ์์ > ์์๋ก ์ค.
์์๋ ํด๋์ค ๋ฐ๋ก ๋ง๋ค์ด์ ๊ด๋ฆฌํจ.
util ํจํค์ง - ConstVariable ํด๋์ค ์์ฑ
์ฒจ๋ถ ํ์ผ ๊ฒฝ๋ก ๋ฃ์ด์ค.
package com.study.shop.util;
public class ConstVariable {
//์ฒจ๋ถ ํ์ผ ๊ฒฝ๋ก
//์ ๊ทผํ๊ธฐ ์ํด public ๊ผญ ๋ถ์ด๊ณ ์ ์ญ๋ณ์(๊ณต์ฉ)๋ก static ๋ถ์ด๊ธฐ
//ํ์ผ ์
๋ก๋ ์์น
//๋ฐ๋๋ฉด ์๋๋ ๊ฐ์ final ๋ถ์ฌ์ ์์๋ก ๋ง๋ค์ด์ค.
//์์๋ ๋ค๋ฅธ ๋ณ์์ ๊ตฌ๋ถ์ ์ํด ๋๋ฌธ์๋ก ์์ฑํ๊ณ ์์๋ค๋ผ๋ฆฌ ํด๋์ค๋ก ๋ฐ๋ก ๊ด๋ฆฌ
//""์ ๊ฒฝ๋ก ๋ถ์ฌ๋ฃ์ผ๋ฉด \\ 2๊ฐ ์๊น.
public static final String UPLOAD_PATH = "D:\\dev\\workspaceSTS\\Shop\\src\\main\\resources\\static\\upload\\";
//ํด๋์ค๋ช
์ผ๋ก ์ ๊ทผ > static ๋ณ์
//System.out.println(ConstVariable.UPLOAD_PATH);
}
์ํ ๋ฑ๋ก์ ์ฒจ๋ถ ํ์ผ ์์ผ๋ฉด ์ค๋ฅ
> ์ฒจ๋ถ ํ์ผ ์์ ๋๋ง ํ์ผ ์ ๋ก๋ ์ฝ๋ ์คํ๋๊ฒ if๋ฌธ์ ๊ฐ์ธ์ฃผ๊ธฐ.
@PostMapping("/regItem") //์ด๋ฏธ์ง ๋ฐ์์ค๋ ๊ฐ์ฒด, ๋ณ์๋ช
์ mainImg inputํ๊ทธ์ name , subImg๋ ๋ฐ๋ก ๋ฃ์ด์ค์ผํจ.
public String regItem(ItemVO itemVO, MultipartFile mainImg) {
//---ํ์ผ ์ฒจ๋ถ---
//๋ฉ์ธ ์ด๋ฏธ์ง ์
๋ก๋
//์ฒจ๋ถ ๋์ผ๋ฉด(true) ํ์ผ ์
๋ก๋ ์ฝ๋ ์คํ.
if(!mainImg.isEmpty()) {
//์๋ณธํ์ผ๋ช
๋ฐ์์ค๊ธฐ
String originFileName = mainImg.getOriginalFilename();
//์๋ฒ์ ์ฌ๋ผ๊ฐ(์ฒจ๋ถ๋ ) ํ์ผ๋ช
์์ฑ(ํ์ผ๋ช
์ด ์ค๋ณต๋์ง ์๊ฒ)
//UUID : ์ค๋ณตX ๋๋คํ ๋ฌธ์์ด์ ์์ฑ
String uuid = UUID.randomUUID().toString();
//์๋ณธํ์ผ๋ช
์ด abc.jpg > ๋๋ค๋ฌธ์์ด.jpg์ ํ์์ผ๋ก ์ฒจ๋ถ๋ ํ์ผ๋ช
์ ์์ฑ
//์ฒจ๋ถ๋ ํ์ผ์ ํ์ฅ์ ์ถ์ถ
String extension = originFileName.substring(originFileName.lastIndexOf(".")); //๋ง์ง๋ง "."๋ฌธ์์์ ๋๊น์ง
//์๋ฒ์ ์ฌ๋ฆด(์ฒจ๋ถ๋ ) ํ์ผ๋ช
String attachedFileName = uuid + extension;
System.out.println("์๋ณธํ์ผ๋ช
: " + originFileName);
System.out.println("์ฒจ๋ถ๋ ํ์ผ๋ช
: " + attachedFileName);
//ํ์ผ ์
๋ก๋
try { //๊ฒฝ๋ก\\์ด๋ฏธ์ง๋ช
.ํ์ฅ์๋ก ๋์์ผ ํจ. \\ํ์ > ๊ฒฝ๋ก ๋ณ์ ๋ง์ง๋ง์ \\์ถ๊ฐ
File file = new File(ConstVariable.UPLOAD_PATH + attachedFileName);
mainImg.transferTo(file);
} catch (Exception e) {
e.printStackTrace();
}
}
//๋ฑ๋ก๋ ์ํ์ฝ๋ ์กฐํ
String itemCode = adminService.getNextItemCode();
itemVO.setItemCode(itemCode);
//์ํ ๋ฑ๋ก ์ฟผ๋ฆฌ
adminService.insertItem(itemVO);
//์ํ ๋ฑ๋ก ํ์ ์๋ธ ๋ฉ๋ด์ ์ ์ฃผ๊ธฐ ์ํด subMenuCode ๊ฐ์ ธ๊ฐ๊ธฐ
return "redirect:/admin/regItem?subMenuCode=SUB_MENU_002";
}
ํ์ฌ mainImg๋ง ๋ฐ์์ด.
์ํ ๋ฑ๋ก ๋งค๊ฐ๋ณ์์ subImg๋ ์ถ๊ฐ
subImg๋ ์ฒจ๋ถํ์ผ์ด ์ฌ๋ฌ๊ฐ ๋ค์ด์ฌ ์ ์์.
MultipartFile์ ํ์ผ ํ๋๋ง ๋ค์ด์ฌ ์ ์์ด์ ๋ฐฐ์ด์ธ MultipartFile[]๋ก ๋ง๋ค์ด์ค์ผํจ.
๋งค๊ฐ๋ณ์ ์ถ๊ฐ ํ subImg ์ฒจ๋ถ ํ์ผ ์ ๋ก๋ ์ฝ๋๋ ์์ฑ.
๋ฐฐ์ด์ด๊ธฐ ๋๋ฌธ์ for๋ฌธ์ผ๋ก subImg ํ๋์ฉ ๋นผ์ฃผ๋ฉด ๋จ.
//์๋ธ ์ด๋ฏธ์ง๋ค ์
๋ก๋ (subImg๋ MultipartFile[]์. ๊ฑฐ๊ธฐ์ img ํ๋ ๋นผ๋ฉด ์๋ฃํ MultipartFile๋ก ๋ฐ์์ผ ํจ.
for(MultipartFile img : subImg) {
if(!img.isEmpty()) {
//์๋ณธ ํ์ผ๋ช
String originFileName = img.getOriginalFilename();
//์๋ฒ์ ์ฌ๋ฆด(์ฒจ๋ถ๋ ) ํ์ผ๋ช
์์ฑ
String uuid = UUID.randomUUID().toString();
String extension = originFileName.substring(originFileName.lastIndexOf("."));
String attachedFileName = uuid + extension;
try {
File file = new File(ConstVariable.UPLOAD_PATH + attachedFileName);
img.transferTo(file); //์ค์ ์
๋ก๋.
} catch (Exception e) {
e.printStackTrace();
}
}
}
์์ฒ๋ผ Controller์ ํ์ผ ์ฒจ๋ถ ์ฝ๋ ์์ฑํด๋ ๋จ. ๊ทธ๋ฌ๋ ๋ณด๊ธฐ ๋ณต์กํจ.
** ์ฌ์ง ์ ๋ก๋ ํ ๋๋ง๋ค ์ฝ๋ ์์ฑ ์์ด ๋ฉ์๋๋ง ๋ถ๋ฌ์์ ์ฌ์ฉํ ์ ์๊ฒ UploadUtil ํด๋์ค ์์ฑ.
package com.study.shop.util;
import java.io.File;
import java.util.UUID;
import org.springframework.web.multipart.MultipartFile;
public class UploadUtil {
//static : ์ ์ญ๋ณ์, ๊ฐ์ฒด ์์ฑ์์ด ํด๋์ค๋ช
.๋ฉ์๋๋ก ํธ์ถ ๊ฐ๋ฅ!
//๋จ์ผ ํ์ผ ์
๋ก๋ ๋ฉ์๋
public static void uploadFile(MultipartFile img) {
//์ฒจ๋ถ ๋์ผ๋ฉด(true) ํ์ผ ์
๋ก๋ ์ฝ๋ ์คํ.
if (!img.isEmpty()) {
// ์๋ณธํ์ผ๋ช
๋ฐ์์ค๊ธฐ
String originFileName = img.getOriginalFilename();
// ์๋ฒ์ ์ฌ๋ผ๊ฐ(์ฒจ๋ถ๋ ) ํ์ผ๋ช
์์ฑ(ํ์ผ๋ช
์ด ์ค๋ณต๋์ง ์๊ฒ)
// UUID : ์ค๋ณตX ๋๋คํ ๋ฌธ์์ด์ ์์ฑ
String uuid = UUID.randomUUID().toString();
// ์๋ณธํ์ผ๋ช
์ด abc.jpg > ๋๋ค๋ฌธ์์ด.jpg์ ํ์์ผ๋ก ์ฒจ๋ถ๋ ํ์ผ๋ช
์ ์์ฑ
// ์ฒจ๋ถ๋ ํ์ผ์ ํ์ฅ์ ์ถ์ถ
String extension = originFileName.substring(originFileName.lastIndexOf(".")); // ๋ง์ง๋ง "."๋ฌธ์์์ ๋๊น์ง
// ์๋ฒ์ ์ฌ๋ฆด(์ฒจ๋ถ๋ ) ํ์ผ๋ช
String attachedFileName = uuid + extension;
System.out.println("์๋ณธํ์ผ๋ช
: " + originFileName);
System.out.println("์ฒจ๋ถ๋ ํ์ผ๋ช
: " + attachedFileName);
// ํ์ผ ์
๋ก๋
try { // ๊ฒฝ๋ก\\์ด๋ฏธ์ง๋ช
.ํ์ฅ์๋ก ๋์์ผ ํจ. \\ํ์ > ๊ฒฝ๋ก ๋ณ์ ๋ง์ง๋ง์ \\์ถ๊ฐ
File file = new File(ConstVariable.UPLOAD_PATH + attachedFileName);
img.transferTo(file);
} catch (Exception e) {
e.printStackTrace();
}
}
}
//๋ค์ค ํ์ผ ์
๋ก๋ ๋ฉ์๋
public static void multiFileUpload(MultipartFile[] imgs) {
for(MultipartFile img : imgs) {
uploadFile(img); //๋งค๊ฐ๋ณ์๋ก ์ฒจ๋ถํ์ผ ํ๋ ๋ค์ด์ฌ ๋ ์
๋ก๋ ์์ผ์ฃผ๋ ๋ฉ์๋
}
}
}
์ํ ๋ฑ๋ก controller์์ ๋ฉ์๋ ํธ์ถํ๋ฉด ๋จ.
//์ํ ๋ฑ๋ก
@PostMapping("/regItem") //์ด๋ฏธ์ง ๋ฐ์์ค๋ ๊ฐ์ฒด, ๋ณ์๋ช
์ mainImg inputํ๊ทธ์ name , subImg๋ ๋ฐ๋ก ๋ฃ์ด์ค์ผํจ.
public String regItem(ItemVO itemVO, MultipartFile mainImg, MultipartFile[] subImg) {
//---ํ์ผ ์ฒจ๋ถ---
//๋ฉ์ธ ์ด๋ฏธ์ง ์
๋ก๋
UploadUtil.uploadFile(mainImg);
//์๋ธ ์ด๋ฏธ์ง๋ค ์
๋ก๋
UploadUtil.multiFileUpload(subImg);
//๋ฑ๋ก๋ ์ํ์ฝ๋ ์กฐํ
//String itemCode = adminService.getNextItemCode();
//itemVO.setItemCode(itemCode);
//์ํ ๋ฑ๋ก ์ฟผ๋ฆฌ
//adminService.insertItem(itemVO);
//์ํ ๋ฑ๋ก ํ์ ์๋ธ ๋ฉ๋ด์ ์ ์ฃผ๊ธฐ ์ํด subMenuCode ๊ฐ์ ธ๊ฐ๊ธฐ
return "redirect:/admin/regItem?subMenuCode=SUB_MENU_002";
}
์ฒจ๋ถํ์ผ ์ฉ๋ ์ค์ .
application.properties์ ์๋ ์ฝ๋ ์ถ๊ฐ
#์
๋ก๋์ฉ๋ ์ค์ (๊ธฐ๋ณธ ๊ฐ : ์ฝ 1MB)
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
ํ์ฌ๊น์ง ์ํ ์ด๋ฏธ์ง spring์ ์ ๋ก๋๋ ๋ ์ํ.
์ํ ์ด๋ฏธ์ง DB insert ์์ ํ์.
**์ฃผ์
์ํ 1๊ฐ insert ๋ ๋ ์ด๋ฏธ์ง๋ ์ฌ๋ฌ๊ฐ insert ๋จ > ๋ค์ค insert๋ฌธ ์ฌ์ฉํด์ผ ํจ.
UNION ALL์ ๋ฃ์ด์ SELECT ์ฌ๋ฌ๋ฒ
์ด๋ฏธ์ง INSERT ์ฟผ๋ฆฌ ์์ฑ
<!-- ์ํ ์ด๋ฏธ์ง ๋ฑ๋ก -->
<insert id="insertImgs">
INSERT INTO ITEM_IMG (
IMG_CODE
, ORIGIN_FILE_NAME
, ATTACHED_FILE_NAME
, IS_MAIN
, ITEM_CODE
) <!-- imgVO -->
<foreach collection="imgList" item="img" separator="UNION ALL" index="i">
SELECT (SELECT 'IMG_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(IMG_CODE, 5))), 0) + 1 + #{i}, 3, '0')
FROM ITEM_IMG) <!-- db์ IMG_002๊น์ง ์๋ค๋ฉด ์ด๋ฏธ์ง insert ์ 003, ๊ทธ๋ฌ๋ ํ๋ฒ์ ์ฌ๋ฌ๊ฐ ์ฒจ๋ถ ํ๋ฉด 003์ผ๋ก ์ค๋ณต ๋จ -->
, #{img.originFileName} <!-- db IMG_CODE ์ต๋๊ฐ + 1 ๊ฐ์ ๋ ์ฒจ๋ถ ์๋งํผ +1์ฉ ์ฆ๊ฐํด์ผ ํจ for๋ฌธ์ index ํ์ฉํ์ฌ i๊ฐ ๋ํด์ค -->
, #{img.attachedFileName}
, #{img.isMain}
, #{itemCode}
FROM DUAL
</foreach>
</insert>
ImgVO๋ ์ฒจ๋ถ๋ ํ์ผ ํ๋์ ์ ๋ณด๋ฅผ ๋ค ๋ด์.
์ฒจ๋ถํ์ผ ์๋งํผ ImgVO๊ฐ ํ์ํจ.
์ํ ๋ฑ๋ก ์ ์ฌ๋ฌ๊ฐ์ ์ฒจ๋ถ ํ์ผ์ ๋ค ๋ฐ์์ค๋ ค๋ฉด list๋ก ๋ฐ์ดํฐ ๋ฐ์์์ผ ํจ.
> ์ฒจ๋ถํ์ผ์ ์๋งํผ ๋ฐ๋ณต ๋๋ฉด์ ImgVO์ธ ๊ฐ๊ฐ ํ๋์ ์ฒจ๋ถ ํ์ผ ์ ๋ณด ๋นผ์ผ ํจ.
์ฟผ๋ฆฌ ๋น๊ฐ์ ์ฑ์ฐ๊ธฐ ์ํด controller์์ ์ค์ ์ฒจ๋ถ๋ ImgVO ์ ๋ณด๊ฐ ํ์ํ ์ํ.
์ฒจ๋ถํ์ผ ๋ฑ๋ก ํ๋ ํด๋์ค๋ฅผ ์์ ํ์ฌ imgVO ์ ๋ณด๋ฅผ controller์์ ์ฌ์ฉํ ์ ์๊ฒ ํจ.
๋จ์ผ ํ์ผ ์ ๋ก๋ ๋ฉ์๋ ์์ .
ImgVO ์์ฑํ์ฌ ์ฒจ๋ถํ์ผ ๋ฑ๋ก ํ imgVO(์ด๋ฏธ์ง ์ ๋ณด)๋ฅผ controller์ ๋ฆฌํด์์ผ์ค.
public class UploadUtil {
//static : ์ ์ญ๋ณ์, ๊ฐ์ฒด ์์ฑ์์ด ํด๋์ค๋ช
.๋ฉ์๋๋ก ํธ์ถ ๊ฐ๋ฅ!
//๋จ์ผ ํ์ผ ์
๋ก๋ ๋ฉ์๋
public static ImgVO uploadFile(MultipartFile img) {
//imgVO ๋ฆฌํดํ๊ธฐ ์ํด ์ ์ธ(controller์์ ์ฒจ๋ถ๋ ํ์ผ ์ ๋ณด ์ฌ์ฉํ๊ธฐ ์ํจ)
ImgVO imgVO = null;
//์ฒจ๋ถ ๋์ผ๋ฉด(true) ํ์ผ ์
๋ก๋ ์ฝ๋ ์คํ.
if (!img.isEmpty()) {
imgVO = new ImgVO(); //์ฒจ๋ถํ์ผ์ด ์์ผ๋ฉด imgVO ๊ฐ์ฒด ์์ฑ
// ์๋ณธํ์ผ๋ช
๋ฐ์์ค๊ธฐ
String originFileName = img.getOriginalFilename();
// ์๋ฒ์ ์ฌ๋ผ๊ฐ(์ฒจ๋ถ๋ ) ํ์ผ๋ช
์์ฑ(ํ์ผ๋ช
์ด ์ค๋ณต๋์ง ์๊ฒ)
// UUID : ์ค๋ณตX ๋๋คํ ๋ฌธ์์ด์ ์์ฑ
String uuid = UUID.randomUUID().toString();
// ์๋ณธํ์ผ๋ช
์ด abc.jpg > ๋๋ค๋ฌธ์์ด.jpg์ ํ์์ผ๋ก ์ฒจ๋ถ๋ ํ์ผ๋ช
์ ์์ฑ
// ์ฒจ๋ถ๋ ํ์ผ์ ํ์ฅ์ ์ถ์ถ
String extension = originFileName.substring(originFileName.lastIndexOf(".")); // ๋ง์ง๋ง "."๋ฌธ์์์ ๋๊น์ง
// ์๋ฒ์ ์ฌ๋ฆด(์ฒจ๋ถ๋ ) ํ์ผ๋ช
String attachedFileName = uuid + extension;
System.out.println("์๋ณธํ์ผ๋ช
: " + originFileName);
System.out.println("์ฒจ๋ถ๋ ํ์ผ๋ช
: " + attachedFileName);
// ํ์ผ ์
๋ก๋
try { // ๊ฒฝ๋ก\\์ด๋ฏธ์ง๋ช
.ํ์ฅ์๋ก ๋์์ผ ํจ. \\ํ์ > ๊ฒฝ๋ก ๋ณ์ ๋ง์ง๋ง์ \\์ถ๊ฐ
File file = new File(ConstVariable.UPLOAD_PATH + attachedFileName);
img.transferTo(file); //์ค์ ์ด๋ฏธ์ง ์
๋ก๋
//imgVO์ ์ด๋ฏธ์ง ์ ๋ณด ์ ์ฅ
imgVO.setOriginFileName(originFileName);
imgVO.setAttachedFileName(attachedFileName);
imgVO.setIsMain("Y"); //๋ฉ์ธ ์ด๋ฏธ์ง : Y **subImg ๋ฃ์ ๋๋ ๋ฉ์๋ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ subImg์์๋ N๋ก ๋ฐ๊ฟ์ค์ผํจ
} catch (Exception e) {
e.printStackTrace();
}
}
return imgVO; //์ด๋ฏธ์ง ์ ๋ณด ๋ฆฌํด
}
๋ค์ค ํ์ผ ์ ๋ก๋ ๋ฉ์๋ ์์ .
์ฒจ๋ถ๋ ์ฌ๋ฌ๊ฐ์ ์ด๋ฏธ์ง ์ ๋ณด๋ฅผ ๋ด์ ์ ์๋ list(ํต)์ ์์ฑํ์ฌ
for๋ฌธ ๋ ๋ ํ๋์ ์ด๋ฏธ์ง ์ ๋ณด๋ฅผ ๋ฝ์ ๊ทธ ๋ฐ์ดํฐ๋ฅผ imgVO vo์ ๋ด์์ฃผ๊ณ
vo๋ฅผ ์ฒจ๋ถ๋ ์ด๋ฏธ์ง ์ ๋ณด๋ฅผ ๋ค ๋ด์ ์ ์๋ list์ ๋ฐ์ดํฐ ์ธํ ํ์ฌ controller๋ก ๋ฆฌํด.
//๋ค์ค ํ์ผ ์
๋ก๋ ๋ฉ์๋
public static List<ImgVO> multiFileUpload(MultipartFile[] imgs) {
//์ฒจ๋ถ๋ ํ์ผ ์ ๋ณด๋ฅผ ๋ค ๋ด์ ์ ์๋ ํต
List<ImgVO> result = new ArrayList<>();
for(MultipartFile img : imgs) {
ImgVO vo = uploadFile(img); //๋งค๊ฐ๋ณ์๋ก ์ฒจ๋ถํ์ผ ํ๋ ๋ค์ด์ฌ ๋ ์
๋ก๋ ์์ผ์ฃผ๋ ๋ฉ์๋
vo.setIsMain("N");
result.add(vo);
}
return result;
}
controller๋ก ๋์์์ return๋ ์ด๋ฏธ์ง ์ ๋ณด๋ค ๋ฐ์ผ๋ฉด ๋จ.
return๋ List<ImgVO>๋ ์ฒจ๋ถ๋ ๋ชจ๋ ์๋ธ ์ด๋ฏธ์ง๋ค์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์์.
List<ImgVO> ์ ์ฒจ๋ถ๋ ๋ฉ์ธ ์ด๋ฏธ์ง ์ ๋ณด๋ฅผ ์ถ๊ฐ๋ก ๋ฐ์ดํฐ ์ธํ ํ๋ฉด List<ImgVO> imgList๋ ์ฒจ๋ถ๋ ๋ชจ๋ ์ด๋ฏธ์ง ์ ๋ณด๋ฅผ ๊ฐ์ง๊ฒ ๋จ.
ํ์ฌ๊น์ง controller์์ ์ฟผ๋ฆฌ ๋น ๊ฐ ์ค ์ด๋ฏธ์ง ์ ๋ณด๋ imgList์ ์ธํ ๋์๊ณ , itemCode๋ง ์ธํ ํ๋ฉด ๋จ.
itemCode๊ฐ์ ์ด์ ์ ์์ฑํ ๋ฑ๋ก๋ ์ํ์ฝ๋ ์กฐํ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ธํ ๊ฐ๋ฅ.
imgList๋ฅผ for๋ฌธ ๋๋ ค์ ํ๋์ img ๋ฐ์ดํฐ ๋นผ์ ๊ฐ๊ฐ itemCode ๊ฐ ์ธํ .
imgList์๋ ์ฒจ๋ถ๋ ๋ชจ๋ ์ด๋ฏธ์ง ์ ๋ณด๊ฐ ๋ด๊ฒจ์์.
//์ํ ๋ฑ๋ก
@PostMapping("/regItem") //์ด๋ฏธ์ง ๋ฐ์์ค๋ ๊ฐ์ฒด, ๋ณ์๋ช
์ mainImg inputํ๊ทธ์ name , subImg๋ ๋ฐ๋ก ๋ฃ์ด์ค์ผํจ.
public String regItem(ItemVO itemVO, MultipartFile mainImg, MultipartFile[] subImg) {
//---ํ์ผ ์ฒจ๋ถ---
//๋ฉ์ธ ์ด๋ฏธ์ง ์
๋ก๋
ImgVO attachedImgVO = UploadUtil.uploadFile(mainImg);
//imgVO์ ์ฒจ๋ถ ์ด๋ฏธ์ง ์ ๋ณด ์ ์ฅ๋์ด์์. ์ฟผ๋ฆฌ ๋น๊ฐ ์ฑ์ฐ๊ธฐ ์ํจ.
//์๋ธ ์ด๋ฏธ์ง๋ค ์
๋ก๋
List<ImgVO> attachedImgList = UploadUtil.multiFileUpload(subImg);
//---์ํ ์ ๋ณด DB ๋ฑ๋ก---
//๋ฑ๋ก๋ ์ํ์ฝ๋ ์กฐํ
String itemCode = adminService.getNextItemCode();
itemVO.setItemCode(itemCode);
//---์ํ ์ด๋ฏธ์ง DB ๋ฑ๋ก---
//์ํ ์ด๋ฏธ์ง ๋ฑ๋ก ์ฟผ๋ฆฌ ์คํ ์ ๋ชจ๋ ๋น ๊ฐ์ ์ฑ์์ค ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ๋ฆฌ์คํธ (imgCode, itemCode ์ ์ธ)
List<ImgVO> imgList = attachedImgList; //๋ค์ค์ผ๋ก ์ฒจ๋ถ๋ ํ์ผ ๋ฆฌ์คํธ(์๋ธ ์ด๋ฏธ์ง)
imgList.add(attachedImgVO); //๋ฉ์ธ ์ด๋ฏธ์ง ์ฒจ๋ถ ์ ๋ณด๋ฅผ ์ถ๊ฐ๋ก ๋ฆฌ์คํธ์ ๋ฃ์ด์ค.
//itemCode ๋ฐ์ดํฐ ์ถ๊ฐ
for(ImgVO img : imgList) {
img.setImgCode(itemCode); //๋ฑ๋ก๋ ์ํ ์ฝ๋ ์กฐํํ ๊ฒ์ผ๋ก ์ธํ
.
}
//์ํ ๋ฑ๋ก ํ์ ์๋ธ ๋ฉ๋ด์ ์ ์ฃผ๊ธฐ ์ํด subMenuCode ๊ฐ์ ธ๊ฐ๊ธฐ
return "redirect:/admin/regItem?subMenuCode=SUB_MENU_002";
}
์ํ ํ๋๋ ์ฒจ๋ถํ ์ฌ๋ฌ๊ฐ์ ์ด๋ฏธ์ง(๋ฉ์ธ, ์๋ธ ์ด๋ฏธ์ง) ์ ๋ณด๋ฅผ ๋ค ๊ฐ์ง๋ค.
์ฆ, itemVO๋ฅผ ์ํ์ด๋ฏธ์ง ๋ฑ๋ก ํ ๋ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ ์ ์๋ค.
์ ๋ฆฌํ์๋ฉด, ์ํ ๋ฑ๋ก controller์์ itemVO ๋ฐ์ดํฐ๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋๊ฒจ์ ์ํ์ ๋ฑ๋กํ๋๋ฐ
์ํ ์ ๋ณด ๋ฑ๋ก, ์ด๋ฏธ์ง ๋ฑ๋ก์ 1๊ฐ์ ์ํ์ ๋ฑ๋ก์ ํ ๋ ๊ฐ์ด ์ฐ์ด๋ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์ imgList๋ฅผ itemVO์ ์ธํ ํ์ฌ ๋ฐ์ดํฐ ๊ฐ์ด ๋๊ฒจ์ค.
๋ฐ์ดํฐ ์ธํ ์ ์ํด itemVO์ List<ImgVO> ๋ณ์ ์ถ๊ฐ.
private List<ImgVO> imgList; //์ํ ํ๋๋ imgVO๋ฅผ ์ฌ๋ฌ๊ฐ ๊ฐ์ง๊ณ ์์.
itemVO์ imgList ๋ฐ์ดํฐ ์ธํ .
//itemVO์ ์ํ ๋ฑ๋กํ ๋ ํ์ํ ๋ชจ๋ ์ด๋ฏธ์ง ์ ๋ณด๋ฅผ ์ธํ
itemVO.setImgList(imgList);
์ํ, ์ด๋ฏธ์ง ๋ฑ๋ก ํธ๋์ ์ ์ฒ๋ฆฌ
์ํ ์ ๋ณด ๋ฑ๋ก , ์ด๋ฏธ์ง ๋ฑ๋ก์ 1๊ฐ์ ์ํ ๋ฑ๋ก์ ์๋ํ๋ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์ ํ๋๋ก ๋ฌถ์ด์ฃผ๋ ๊ฒ ์ข์.
๋ ์ค ํ๋๋ผ๋ ์ ๋ก๋ ์คํจ ์ ๋ฑ๋ก ๊ธฐ๋ฅ ์๋ ์ ํ๊ฒ ์ฒ๋ฆฌ.
AdminService์ ์ด๋ฏธ์ง ์ ๋ณด ๋ฉ์๋ ์์ฑํ ๊ฒ ์ญ์ ํ๊ณ
AdminServiceImpl์์ ์ํ ์ ๋ณด ๋ฑ๋ก ๋ฉ์๋ ๊ตฌํํ ๋ ์ด๋ฏธ์ง ๋ฑ๋ก ๋ฉ์๋ ๊ฐ์ด ๊ตฌํ.
ํธ๋์ ์ ์ฒ๋ฆฌ๋ฅผ ์ํด ์๋ ์ด๋ ธํ ์ด์ ๋ฌ์์ฃผ๋ฉด ๋จ.
@Transactional(rollbackFor = Exception.class)
//์ํ ๋ฑ๋ก @Transactional : ํด๋น ๋ฉ์๋ ๋ด์ ์ฟผ๋ฆฌ ์คํ์ ํธ๋์ ์
์ฒ๋ฆฌ
//rollbackFor : ์ธ์ ๋กค๋ฐฑ? (์ด๋ค ์ค๋ฅ๋ผ๋ ๋ฐ์ํ๋ฉด ๋กค๋ฐฑ)
@Override
@Transactional(rollbackFor = Exception.class)
public void insertItem(ItemVO itemVO) {
sqlSession.insert("adminMapper.insertItem", itemVO); //์ํ ๋ฑ๋ก
sqlSession.insert("adminMapper.insertImgs", itemVO); //์ด๋ฏธ์ง ๋ฑ๋ก
}
์ํ ๋ฑ๋ก controller๋ก ์์ ๋งจ ๋ง์ง๋ง์ ์ํ ๋ฑ๋ก ์ฟผ๋ฆฌ ์คํ์์ผ์ฃผ๋ฉด ์ํ ๋ฑ๋ก ๊ธฐ๋ฅ ์๋ฃ.
//์ํ ๋ฑ๋ก
@PostMapping("/regItem") //์ด๋ฏธ์ง ๋ฐ์์ค๋ ๊ฐ์ฒด, ๋ณ์๋ช
์ mainImg inputํ๊ทธ์ name , subImg๋ ๋ฐ๋ก ๋ฃ์ด์ค์ผํจ.
public String regItem(ItemVO itemVO, MultipartFile mainImg, MultipartFile[] subImg) {
//---ํ์ผ ์ฒจ๋ถ---
//๋ฉ์ธ ์ด๋ฏธ์ง ์
๋ก๋
ImgVO attachedImgVO = UploadUtil.uploadFile(mainImg);
//imgVO์ ์ฒจ๋ถ ์ด๋ฏธ์ง ์ ๋ณด ์ ์ฅ๋์ด์์. ์ฟผ๋ฆฌ ๋น๊ฐ ์ฑ์ฐ๊ธฐ ์ํจ.
//์๋ธ ์ด๋ฏธ์ง๋ค ์
๋ก๋
List<ImgVO> attachedImgList = UploadUtil.multiFileUpload(subImg);
//---์ํ ์ ๋ณด DB ๋ฑ๋ก---
//๋ฑ๋ก๋ ์ํ์ฝ๋ ์กฐํ
String itemCode = adminService.getNextItemCode();
itemVO.setItemCode(itemCode);
//---์ํ ์ด๋ฏธ์ง DB ๋ฑ๋ก---
//์ํ ์ด๋ฏธ์ง ๋ฑ๋ก ์ฟผ๋ฆฌ ์คํ ์ ๋ชจ๋ ๋น ๊ฐ์ ์ฑ์์ค ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง ๋ฆฌ์คํธ (imgCode, itemCode ์ ์ธ)
List<ImgVO> imgList = attachedImgList; //๋ค์ค์ผ๋ก ์ฒจ๋ถ๋ ํ์ผ ๋ฆฌ์คํธ(์๋ธ ์ด๋ฏธ์ง)
imgList.add(attachedImgVO); //๋ฉ์ธ ์ด๋ฏธ์ง ์ฒจ๋ถ ์ ๋ณด๋ฅผ ์ถ๊ฐ๋ก ๋ฆฌ์คํธ์ ๋ฃ์ด์ค.
//itemCode ๋ฐ์ดํฐ ์ถ๊ฐ
for(ImgVO img : imgList) {
img.setImgCode(itemCode); //๋ฑ๋ก๋ ์ํ ์ฝ๋ ์กฐํํ ๊ฒ์ผ๋ก ์ธํ
.
}
//itemVO์ ์ํ ๋ฑ๋กํ ๋ ํ์ํ ๋ชจ๋ ์ด๋ฏธ์ง ์ ๋ณด๋ฅผ ์ธํ
itemVO.setImgList(imgList);
//์ํ ๋ฑ๋ก ์ฟผ๋ฆฌ(์ด๋ฏธ์ง ๊ฐ์ด ๋ฑ๋ก)
adminService.insertItem(itemVO);
//์ํ ๋ฑ๋ก ํ์ ์๋ธ ๋ฉ๋ด์ ์ ์ฃผ๊ธฐ ์ํด subMenuCode ๊ฐ์ ธ๊ฐ๊ธฐ
return "redirect:/admin/regItem?subMenuCode=SUB_MENU_002";
}
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ผํ๋ชฐ ํ๋ก์ ํธ(9) - ์ํ ๊ด๋ฆฌ (์์ ) (0) | 2023.04.03 |
---|---|
์ผํ๋ชฐ ํ๋ก์ ํธ(9) ์ํ ๊ด๋ฆฌ (0) | 2023.03.30 |
์์ง๋ ๋์ด๋ Intercepter (0) | 2023.03.29 |
์ผํ๋ชฐ ํ๋ก์ ํธ(7) ๋ฉ๋ด (0) | 2023.03.28 |
์ผํ๋ชฐ ํ๋ก์ ํธ(6) ์ํ (0) | 2023.03.28 |