2023. 3. 2. 17:27ใSpring
**์ฐธ๊ณ ์ฌํญ
์ค๋ฅ ๋ณด๋ ๋ฒ
CREATE TABLE SHOP_MEMBER (
MEM_ID VARCHAR2(50) PRIMARY KEY
, MEM_NAME VARCHAR2(50)
);
INSERT INTO SHOP_MEMBER VALUES ('java1', '๊น์๋ฐ');
์์ 'java1'์ด๋ผ๋ ์์ด๋๋ก ๋ INSERT ํ์ ๋ ์ค๋ฅ์ฐฝ์ ๋ณด๋ฉด ์๋์ฒ๋ผ ๋จ๋๋ฐ
์ ์ฝ ์กฐ๊ฑด๋ช ์ ์ค์ ํด์ ์ด๋์ ์ค๋ฅ ๋ด๋์ง ์ ์ ์๊ฒ ํ๋ ๋ฐฉ๋ฒ
ํ ์ด๋ธ ์์ฑ ์
CREATE TABLE SHOP_MEMBER (
MEM_ID VARCHAR2(50) CONSTRAINT MEMBER_PK PRIMARY KEY
, MEM_NAME VARCHAR2(50)
);
CONSTRAINT ํค์๋ + ์ ์ฝ์กฐ๊ฑด๋ช (๊ฐ๋ฐ์ ์ง์ ) ๋ฃ์ผ๋ฉด ์๋์ฒ๋ผ ์ด๋์ ์ค๋ฅ ๋ฐ์ํ๋์ง ์์๋ณด๊ธฐ ์ฌ์!
**์ฐธ๊ณ ์ฌํญ
PK ์๋์์ฑ
๋ค์์ ๋ค์ด๊ฐ CATE_CODE ๊ฐ์ ์กฐํ
ํ ์ด๋ธ :
ํ์ ํ
์ด๋ธ, ์ํ ์นดํ
๊ณ ๋ฆฌ ํ
์ด๋ธ, ์ํ ํ
์ด๋ธ, ์ํ ์ด๋ฏธ์ง ํ
์ด๋ธ
์ฅ๋ฐ๊ตฌ๋ ํ
์ด๋ธ, ๊ตฌ๋งค ํ
์ด๋ธ
์ดํด๋ฆฝ์ค ์์ ํ์ํ lib์ ์๋ jar ํ์ผ ๋ค ์ฎ๊ฒจ์ค๊ณ src/main/java ๋ค ๋ณต์ฌํด์จ ํ ์ญ์ ํ๋ฉด์ ์ ๋ฆฌ
wepapp์ index.jsp ๋ง๋ค์ด์ ํ์ด์ง ์ด๋ ์ํค๊ธฐ
wepapp ํด๋ 3๊ฐ ์์ฑ view, css, js(์๋ฐ์คํฌ๋ฆฝํธ)
view ํด๋ ์์ template, member(ํ์๊ณผ ๊ด๋ จ๋ jsp ํด๋),
admin(๊ด๋ฆฌ์๋ง ์ ๊ทผ ๊ฐ๋ฅํ jsp ํด๋), item(์ํ๊ณผ ๊ด๋ จ jsp ํด๋)
template ํด๋์ template.jsp, menu.jsp
item ํด๋์ item_list.jsp
์ฐ์ template.jsp ์์
์์๋ ๋ฉ๋ด ๋จ๊ณ ์๋๋ ๋ด์ฉ๋ถ
<div>
<div class="container">
<jsp:include page="menu.jsp"></jsp:include>
</div>
<div>
<jsp:include page="../item/item_list.jsp"></jsp:include>
</div>
</div>
css ์์ ๋ ๋ถ๋ฆฌ jsp๋ณ๋ก(?
css์์ template ํด๋ ๋ฐ์ template.css ๋ง๋ค์ด์ template.jsp์์ template.css ํ์ผ ๋ก๋ฉ.
jsp์ ์คํ์ผ ํ๊ทธ ์ง์ฐ๊ณ
<link rel="stylesheet" type="text/css" href="css/common.css?v=8"> ์ถ๊ฐ
๋ณด์ฌ์ง ํ๋ฉด ์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๊ตฌ์ฑ
menu_list.jsp css ์์ ์ด๊ฒ๋ template์ ๋์ผํ๊ฒ cssํด๋์ menu.css๋ก ๋ชจ์์ค.
ํ์๊ฐ์ ๊ธฐ๋ฅ
view member ํด๋์ join.jsp ๋ง๋ค๊ธฐ
template๋ก ๊ฐ์ join.jsp๋ก ๊ฐ ์ ์๊ฒ ์ฝ๋ ์ถ๊ฐ
<jsp:include page="../member/join.jsp"></jsp:include>
์ ๋ด์ฉ ์ค ๋ด์ฉ๋ถ page๋ ๋งค๋ฒ ๋ฐ๋. ๋ณ์๋ก ์ค์ผ ํจ ์ด์ ๋ ํด๋ ์์น๊น์ง ๋ฐ๋๊ธฐ ๋๋ฌธ์
<jsp:include page="../${contentPage }"></jsp:include>
์์ ๊ฐ์ด ์ฃผ๊ณ controller์์๋ ์๋์ ๊ฐ์ด ํด๋๋ช ๊น์ง ์ ์ด์ค์ผ ํจ.
//ํ์๊ฐ์
ํ์ด์ง๋ก ์ด๋
if (command.equals("/")) {
contentPage = "member/join.jsp";
}
join.jsp์ ์ฐํธ๋ฒํธ ๊ฒ์ํ๋ ๊ธฐ๋ฅ ์ถ๊ฐ (์ฃผ์๋ก API)
daum์์ ์ ๊ณตํ๋ ์์ค ์ฝ๋ ํ์ฉํ์ฌ ๊ธฐ๋ฅ ๊ตฌํ
join.jsp์ ์๋ ์ฝ๋ ๋ถ์ฌ๋ฃ๊ธฐ(bodyํ๊ทธ ๋ซํ๋ ์๋ฆฌ ๋ฐ)
<script src="//t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
js ๊ธฐ๋ฅ ๋ฐ๋ก ๋บ
jsํด๋ ๋ฐ์ member/join.js ๋ง๋ค๊ธฐ
๊ทธ ๋ฐ์ jsp์ js ๊ณต์ ๋๊ฒ ์๋ ํ๊ทธ ์ถ๊ฐ
<script type="text/javascript" src="js/member/join.js"></script>
js์ ํจ์ ๋ง๋ค๊ณ jsp์ ๊ฒ์ input์ onclick ์์ฑ์ผ๋ก ํจ์ ์คํ.
//์ฃผ์๋ก api
function searchAddr(){
new daum.Postcode({
oncomplete: function(data) {
//๋๋ก๋ช
์ฃผ์
var roadAddr = data.roadAddress;
document.querySelector('#addr').value = roadAddr;
}
}).open();
}
์ฃผ์ ์ ํํ์ฌ ๋์ค๋ input ํ๊ทธ ์์ ์๋๊ฒ readonly ์์ฑ ์ถ๊ฐ
์ฃผ์ ๋ถ๋ฌ์์ง๋ input ํ๊ทธ๋ฅผ ํด๋ฆญํ๋ ๊ฒฝ์ฐ์๋ ์ฃผ์ ๊ฒ์์ฐฝ ๋จ๊ฒ ์ค์
<input onclick="searchAddr();" type="text" class="myInput" name="addr" id="addr" required readonly style="width: 78.4%; vertical-align: middle;">
<input onclick="searchAddr();" type="button" class="btn" value="๊ฒ ์" style="width: 20%; vertical-align: middle;">
์ฃผ์!!!
ํ์๊ฐ์ ์ ์ ๋ ฅํ ๋ฐ์ดํฐ ๋ฐ์์ฌ ๋
memTell, memEmail์ ๋ฐฐ์ด๋ก ๋ฐ์์์ผ ํจ.
String memTell[] = request.getParameterValues("memTell");
String memEmail[] = request.getParameterValues("memEmail");
๋ฐ์ดํฐ ์ธํ ํ ๋๋ ์๋ฃํ์ด ๋ฌ๋ผ์ ์ผ๋ฐ์ ์ผ๋ก ๋ฐ์์ฌ ์ ์์
MemberDTO ํด๋์ค๋ก ๊ฐ์ ์๋ setter ์ถ๊ฐ ์์ฑ (์๋ฃํ์ String[ ]๋ก setter ํ๋ ๋ ๋ง๋ฆ)
public void setMemTell(String[] memTell) {
this.memTell = memTell[0] + "-" + memTell[1] + "-" + memTell[2];
}
public void setMemEmail(String[] memEmail) {
this.memEmail = memEmail[0] + "@" + memEmail[1];
}
ํ์๊ฐ์ ์ฑ๊ณต ํ ๋ก๊ทธ์ธ ํ์ด์ง ์ด๋
๋ก๊ทธ์ธ ๊ธฐ๋ฅ ๊ตฌํ (๋ก๊ทธ์ธ ์ฑ๊ณต์ alert()์ผ๋ก '๋ฐ๊ฐ์ต๋๋ค memName๋' ๋์ด์ฃผ๊ธฐ)
๋ก๊ทธ์ธ ์ฑ๊ณต > ๋ก๊ทธ์ธํ ํ์์ id,name,๊ด๋ฆฌ์ ์ฌ๋ถ ์ ๋ณด๋ฅผ ์ธ์ ์ ์ ์ฅํจ.
๋ก๊ทธ์ธ ์คํจ > ์์ด๋ ๋น๋ฐ๋ฒํธ ๋ค์ ํ์ธ alert ๋ค์ ๋ก๊ทธ์ธ ํ์ด์ง ์ด๋
๋ก๊ทธ์ธ ์ฑ๊ณตํ๋ฉด ์ต์ข ํ์ด์ง ์ํ ๋ชฉ๋ก ํ์ด์ง๋ก ์ด๋.
๋ก๊ทธ์ธ์ ๊ด๋ฆฌ์๊ฐ ๋ก๊ทธ์ธ ํ์ ๋๋ง ๋ฉ๋ด์ ๊ด๋ฆฌ์ ๋ฉ๋ด๊ฐ ๋ณด์ด๊ฒ ์ฝ๋ ๊ตฌํ
๋ก๊ทธ์ธ ํ์ ๋๋ ์๋จ์ login join ๊ธ์ ๋์ memId๋ ๋ฐ๊ฐ์ต๋๋ค.์ ๋ก๊ทธ์์ ๋ฒํผ.
๋ก๊ทธ์์ ํด๋ฆญ์ ๋ก๊ทธ์์ ๊ธฐ๋ฅ ๊ตฌํ, ์ํ๋ชฉ๋กํ์ด์ง๋ก.
์ํ๋ฑ๋ก ๊ธฐ๋ฅ
๊ด๋ฆฌ์ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์ adminController ๋ง๋ค๊ธฐ ์ํ๋ฑ๋ก if๋ฌธ ๋ง๋ค์ด์ผ ํจ.
ํ์ด์ง ์ด๋ํ ๋ ํด๋๊น์ง ์ง์ ํด์ ๋ฐ๊ฟ์ฃผ๋ ๊ฑฐ ์์ง ๋ง๊ธฐ!!
์ํ ๋ฑ๋ก์ ITEM_CODE๊ฐ ์๋์ผ๋ก ์์ ์ง์ ๋๋ฉฐ ๋ค์ด๊ฐ์ผ ๋จ.
์ฃผ์์ฌํญ!! (์ค๋ฌด์์ select box for๋ฌธ์ผ๋ก ๋ค์ด์ค๋ ๊ฒ ๋ง์ด ์)
CATE_CODE๋ ์ ๋ ํธ ๋ฐ์ค๋ก ํ๋, ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ์ํ ์นดํ ๊ณ ๋ฆฌ ํ ์ด๋ธ์ CATE_NAME์ ๋ชฉ๋ก์ ์กฐํํด์ ๊ฐ์ ธ์์ผ ํ๋ฉฐ CATE_CODE ๊ฐ๋ value ๊ฐ์ผ๋ก ๋ฐ์์ผ ์์ผ ๋จ!!
์ํ ํ ์ด๋ธ์๋ ์ธ๋ํค๋ก CATE_CODE ์ปฌ๋ผ์ด ์๊ธฐ ๋๋ฌธ์ NAME์ด ์๋๋ผ CODE ๊ฐ์ ๋๊ฒจ์ผ ๋๋ค.
<select class="myInput" name="cateCode">
<c:forEach items="${list}" var="cate">
<option value="${cate.cateCode}">${cate.cateName}</option>
</c:forEach>
</select>
itemMapper์์ ์นดํ ๊ณ ๋ฆฌ ์กฐํ ์ฟผ๋ฆฌ ์์ฑ.
cateDTO ํด๋์ค ์์ฑ getter setter ์์ฑํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์ ๋ฐ์ดํฐ ๋ฐ์์ฌ ์ ์๊ฒ ํจ.
์กฐํ > resultMap ๋จผ์ ์์ฑ ํ ์ฟผ๋ฆฌ ์์ฑ
itemService, itemServiceImpl ์์ฑ ๋ฉ์๋ ์์ฑ ๋ฐ ๊ตฌํ
๋ชฉ๋ก ์กฐํํ ๋ฆฌ์คํธ๋ฅผ jsp์ ์ ๋ฌ.
List<CateDTO> list = itemService.selectCategory();
request.setAttribute("list", list);
jsp์ ๋ฐ์ดํฐ ๋ฟ๋ ค์ฃผ๊ธฐ (์์ select box๋๋ก)
๋ฑ๋ก ๋ฒํผ ๋๋ฅด๋ฉด ์ํ ๋ฑ๋ก์ ์ํด
itemController์ if๋ฌธ์ผ๋ก ์ํ ๋ฑ๋ก์ ๋์ด์ค๋ ์ ๋ ฅ ๋ฐ์ดํฐ ๋ค ๋ฐ์ ์ค๊ธฐ
์ํ INSERT ์ฟผ๋ฆฌ ์์ฑํ๊ธฐ > ๊ด๋ฆฌ์ ๊ธฐ๋ฅ์ด๊ธฐ ๋๋ฌธ์ adminMapper ์์ฑ ํ ์์ฑ
itemCode๋ ๋ฐฉ๋ฒ1.์๋ธ์ฟผ๋ฆฌ๋ก ๋ฐ์์ค๊ธฐ
<!--์ํ ๋ฑ๋ก ์ฟผ๋ฆฌ -->
<insert id="regItem">
INSERT INTO SHOP_ITEM (
ITEM_CODE
, CATE_CODE
, ITEM_NAME
, ITEM_PRICE
, ITEM_INTRO
) VALUES (
(SELECT 'ITEM_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(ITEM_CODE, 6))), 0) + 1, 3, '0') FROM SHOP_ITEM)
, #{cateCode}
, #{itemName}
, #{itemPrice}
, #{itemIntro}
)
</insert>
๋ฐฉ๋ฒ2. ์ผ๋ฐ์ ์ธ #{itemCode}๋ก ์ฟผ๋ฆฌ ์์ฑํ์ฌ ๋ฐ์์ค๊ธฐ.
<!--์ํ ๋ฑ๋ก ์ฟผ๋ฆฌ -->
<insert id="regItem">
INSERT INTO SHOP_ITEM (
ITEM_CODE
, CATE_CODE
, ITEM_NAME
, ITEM_PRICE
, ITEM_INTRO
) VALUES (
, #{itemCode}
, #{cateCode}
, #{itemName}
, #{itemPrice}
, #{itemIntro}
)
</insert>
itemController์์ ์ํ ๋ฑ๋ก ๋๋ฅด๋ฉด ๋์ด์ค๋ ๋ฐ์ดํฐ ๋ฐ์์จ ํ
๋ค์์ ๋ค์ด๊ฐ ITEM_CODE๋ฅผ ๋จผ์ ์กฐํํ๋ ์ฟผ๋ฆฌ๋ฌธ์ ์คํ.
์กฐํ ์ฟผ๋ฆฌ๋ฌธ ์์ฑ (ITEM_001๋ก ๋์ค๊ฒ > ๋ฌธ์์ด ํ๋ ์กฐํํ๋ ๊ฒ)
<!-- int, String์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ฌ ๋๋ resultType ์ฌ์ฉ -->
<select id="selectNextItemCode" resultType="String">
SELECT 'ITEM_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(ITEM_CODE, 6))), 0) + 1, 3, '0')
FROM SHOP_ITEM
</select>
์ฟผ๋ฆฌ ์คํ์ ๋ฐ์ดํฐ๊ฐ ํ๋ ๋์ค๋ ๊ฒฝ์ฐ resultType ์ฌ์ฉ (๋ฌธ์์ด ๋ฐ์ดํฐ or ์ซ์ ๋ฐ์ดํฐ)
์กฐํ ๋ฐ์ดํฐ๊ฐ DTO๊ฐ์ฒด(์ฌ๋ฌ๊ฐ) ๋์ค๋ ๊ฒฝ์ฐ resultMap ์ฌ์ฉ
AdminService์ AdminServiceImple ์์ฑ ๋ฉ์๋ ์์ฑ ๋ฐ ๊ตฌํ
adminController์์ ๋ฉ์๋ ์คํ ์ํด ๊ฐ์ฒด ์์ฑ ํ ๋ฉ์๋ ์ฌ์ฉ
//๋ค์์ ๋ค์ด๊ฐ ITEM_CODE๋ฅผ ์กฐํ
String nextItmeCode = adminService.selectNextItemCode();
๋ฐ์ดํฐ ์ ์ฅํ ํต ๋ง๋ค์ด์ ๋ฐ์ดํฐ ์ธํ ์กฐํํ nextItemCode ๊ฐ itemCode์ ์ธํ ํ๋ค.
โ โ ์ํ ๋ฑ๋ก์ ์ด๋ฏธ์ง ๋ฃ๊ธฐ
๋ฉ์ธ ์ด๋ฏธ์ง : ์ธ๋ค์ผ
์๋ธ ์ด๋ฏธ์ง : ์์ธ(?์ด๋ฏธ์ง
์ํ์ด ๋ฑ๋ก๋๋ ๊ณผ์ ์์ ์์์ผ ํ ์ฌํญ
SHOP_ITEM ํ ์ด๋ธ์๋ ์ํ์ด INSERTํ ๋ฐ์ดํฐ 1๊ฐ ์ ์ฅ
ITEM_IMG ํ ์ด๋ธ์๋ ์ฒจ๋ถํ ํ์ผ ์๋งํผ ๋ฐ์ดํฐ ์ ์ฅ
webapp/images ํด๋์ ์ฌ์ฉ์๊ฐ ์ฒจ๋ถํ ํ์ผ์ด ์ ์ฅ๋จ.
<div>
<div>๋ฉ์ธ ์ด๋ฏธ์ง</div>
<div><input type="file"></div>
</div>
<div>
<div>์๋ธ ์ด๋ฏธ์ง</div>
<div><input type="file"></div>
</div>
ํ์ผ์ ์ ํํ์ฌ ์ฒจ๋ถํ๋ค๋ ๊ฒ > ์ฐ๋ฆฌ ํ๋ก๊ทธ๋จ ์์ผ๋ก ์ฌ์ฉ์๊ฐ ์ฌ์ง์ ์ ์ฅํ ์ ์๋ค๋ ๊ฒ
์ฐ์ cos.jar ํ์ผ lib ํด๋์ ๋ฃ๊ธฐ
webapp ๋ฐ์ images ํด๋ ์์ฑ
์ฌ์ฉ์๊ฐ ํ์ผ์ ์ฒจ๋ถ ํ๋ฉด images ํด๋์ ์ ์ฅ๋จ.
์ฒจ๋ถํ์ผ์ฒ๋ผ ๊ธ์๊ฐ ์ซ์๊ฐ ์๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๋ ค๊ฐ๋ ค๋ฉด form ํ๊ทธ์
enctype="multipart/form-data"์์ฑ ์ถ๊ฐ ํด์ผ ํ๊ณ ๋๊ฐ์ด input ํ๊ทธ์ name ์ค์
<form action="regItem.ad" method="post" enctype="multipart/form-data">
adminController๋ก ์์ ์ํ๋ฑ๋ก if๋ฌธ์ ๋ฐ์ดํฐ ๋ฐ๊ธฐ ์ ์ ํ์ผ ์ฒจ๋ถ ์์ ํจ.
ํ์ผ ์ ์ฅ๋ ์์น ๋ณ์๋ก ์ ์ธ ์์น ์ฐพ์์ ์ด๊ธฐํ.
์์น ๋ณด๋ ๋ฒ : ํ๋ก์ ํธ ์ค๋ฅธ์ชฝ ๋ง์ฐ์ค properties์ location ๋ฒํผ ๋๋ฅด๋ฉด ํ๋ก์ ํธ ์์น ํด๋ ๋ธ.
๊ฑฐ๊ธฐ์ images ์ ์ฅ๋ ํด๋ ๊ฒฝ๋ก ์ฐพ์๊ฐ. ๊ฒฝ๋ก ๋ณต์ฌํด์ ํ์ผ ์์น ๋ณ์์ ๋ฃ์ด์ค.
์ด๋ฏธ์ง ์ฉ๋ ์ ํ๋ ๋ณ์๋ก ์ ์ธํ์ฌ ์ด๊ธฐํ
//ํ์ผ ์ฒจ๋ถ
//ํ์ผ์ด ์ ์ฅ๋ ์์น
String uploadPath = "D:\\dev\\workspace_HTML_CSS\\Shop\\src\\main\\webapp\\images";
//์
๋ก๋ ์ฉ๋ ์ ํ
int uploadSize = 10 * 1024 * 1024; //10๋ฉ๊ฐ
//ํ์ผ ์ฒจ๋ถ ์คํ
//cos.jar ํ์ผ์ด ์์ด์ผ ์๋ ํด๋์ค MultipartRequest ์ธ ์ ์์. ์์ฑ์ ํธ์ถ.
MultipartRequest multi = new MultipartRequest(
request
, uploadPath
, uploadSize
, "UTF-8"
, new DefaultFileRenamePolicy() //ํ์ผ๋ช
๊ฒน์น๋ฉด ๋ค์ _์ซ์ ๋ถ์ฌ์ค
);
์ํ ๋ฑ๋กํ ๋ ์ด๋ค ์ํ์ ๋ํ ์ด๋ฏธ์ง์ธ์ง์ ๋งค์นญ์ด ํ์ํ๋ค
> ์ํ ํ
์ด๋ธ์ ์ปฌ๋ผ ์ถ๊ฐํด์ ์ด๋ฏธ์ง ์ปฌ๋ผ์ ๋ง๋ ๊ฒฝ์ฐ
ํด๋น ์ํ์ ์ฌ๋ฌ ์ด๋ฏธ์ง๋ฅผ ๋ฃ์ด์ผ ํ ๊ฒฝ์ฐ ๋ฐ์ดํฐ ๋ฃ๊ณ ๋นผ๋ ๊ฒ์ด ๋ณต์กํจ.
์ด๋ฏธ์ง ํ ์ด๋ธ์ ๋ฐ๋ก ๋ง๋ค์ด์ ๊ด๋ฆฌํ๋ ๊ฒ์ด ํธํ๋ค.
์ํ์ฝ๋ | ์ํ๋ช | ๊ฐ๊ฒฉ |
ITEM_001 | ์์ | 1000 |
์ด๋ฏธ์ง์ฝ๋ | ์ด๋ฏธ์ง๋ช | ์ํ์ฝ๋ |
IMG_001 | 1.JPG | ITEM_001 |
IMG_002 | 2.JPG | ITEM_001 |
IMG_003 | 3.JPG | ITEM_001 |
์ด๋ฏธ์ง ํ ์ด๋ธ ์์ฑ ํ ImgDTO ์์ฑ getter, setter ์์ฑ
admincontroller๋ก ๋์์์
์ฒจ๋ถํ์ผ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ด ๋์ด์จ ๊ฒฝ์ฐ์๋ request๋ก ๋ฐ์ดํฐ๋ก ๋ฐ๋ ๊ฒ ์๋๋ผ multi ๊ฐ์ฒด๋ก ๋ฐ์ดํฐ ๋ฐ์์ผ ํจ.
if(command.equals("/regItem.ad")) {
//ํ์ผ ์ฒจ๋ถ
//ํ์ผ์ด ์ ์ฅ๋ ์์น
String uploadPath = "D:\\dev\\workspace_HTML_CSS\\Shop\\src\\main\\webapp\\images";
//์
๋ก๋ ์ฉ๋ ์ ํ
int uploadSize = 10 * 1024 * 1024; //10๋ฉ๊ฐ
//ํ์ผ ์ฒจ๋ถ ์คํ
//cos.jar ํ์ผ์ด ์์ด์ผ ์๋ ํด๋์ค MultipartRequest ์ธ ์ ์์. ๊ฐ์ฒด ์์ฑ ๋ฐ ์์ฑ์ ํธ์ถ.
MultipartRequest multi = new MultipartRequest(
request
, uploadPath
, uploadSize
, "UTF-8"
, new DefaultFileRenamePolicy() //ํ์ผ๋ช
๊ฒน์น๋ฉด ๋ค์ _์ซ์ ๋ถ์ฌ์ค
);
//์ฒจ๋ถํ์ผ ๋ฐ์ดํฐ๊ฐ ๊ฐ์ด ๋์ด์จ ๊ฒฝ์ฐ์๋
//request๋ก ๋ฐ์ดํฐ๋ก ๋ฐ๋ ๊ฒ ์๋๋ผ multi ๊ฐ์ฒด๋ก ๋ฐ์ดํฐ ๋ฐ์์ผ ํจ.
String itemName = multi.getParameter("itemName");
String cateCode = multi.getParameter("cateCode");
int itemPrice = Integer.parseInt(multi.getParameter("itemPrice"));
String itemIntro = multi.getParameter("itemIntro");
์ํ ์ ๋ณด ๋ฑ๋ก ํ ์ํ ์ด๋ฏธ์ง ์ ๋ณด๋ ๋ฑ๋กํด์ผ ํจ.
์ํ ์ด๋ฏธ์ง ์ ๋ณด ๋ฑ๋ก ์ฟผ๋ฆฌ ์์ฑ
์ํ ์ด๋ฏธ์ง ๋ฑ๋กํ ๋ ๊ด๋ฆฌ์ ์ด๋ฏธ์ง ์ ์ํ๋๋งํผ ๋ฑ๋ก ๊ฐ๋ฅํด์ผ ํจ.(foreach๋ฌธ ์ฌ์ฉ)
> INSERT๋ฌธ ๋ค์ค INSERT๋ฌธ ์ฌ์ฉํด์ผ ํ๋ค.
์๋์ ์์ ๊ฐ์ด(์ด๋ฏธ์ง 2๊ฐ ์ ๋ก๋ ๊ฒฝ์ฐ)
INSERT INTO ITEM_IMG (IMG_CODE, ORIGIN_FILE_NAME, ATTACHED_FILE_NAME, ITEM_CODE, IS_MAIN)
SELECT 'IMG_001', 'ABC.JPG', 'ABC-1.JPG', 'ITEM_001', 'Y' FROM DUAL
UNION ALL
SELECT 'IMG_002', 'CCC.JPG', 'CC-1.JPG', 'ITEM_001', 'N' FROM DUAL
์ํ ์ด๋ฏธ์ง ๋ฑ๋ก ์ฟผ๋ฆฌ ์๋์ ๊ฐ์ด ์์ฑํด์ผ ๋ง์.
item_list ํ์ด์ง ์์
ํ ์ค์ ์ด 5๊ฐ์ ์ํ์ด ๋์์ผ ํ๊ณ
์ํ์ด๋ฏธ์ง(์ด๋ฏธ์ง์ ์ฒจ๋ถ๋ ํ์ผ๋ช ), ์ํ๋ช , ์ํ ๊ฐ๊ฒฉ, ์ํ์ฝ๋(PK) ์กฐํ๋์ด์ผ ํจ.
> ์กฐ์ธ ์จ์ผ ๋จ.
์กฐ์ธ ์ฐ๊ฒ ๋๋ฉด ์ํ ํ๋๋น ์ฒจ๋ถ๋ ์ด๋ฏธ์ง ํ์ผ์ ์๋งํผ ๋ฐ์ดํฐ๊ฐ ๋์จ๋ค.
listํ์ด์ง์๋ ๋ฉ์ธ ์ด๋ฏธ์ง๋ง ๋์์ผ ํ๊ธฐ ๋๋ฌธ์ ์กฐ๊ฑด์ผ๋ก IS_MAIN์ด Y ๊ฑธ์ด์ผ ๋จ.
์ด๋ฏธ์ง๋ ์ด๋ฏธ์ง ํ ์ด๋ธ์ ์ฒจ๋ถ๋ ํ์ผ๋ช ์ด ์์
๊ทธ ์ฒจ๋ถ ํ์ผ๋ช ์ด ๋ณด์ฌ์ค ์ด๋ฏธ์ง์ src="์ด๋ฏธ์ง์ด๋ฆ.ํ์ฅ์ "์ ๋ค์ด๊ฐ๋ฉด ๋จ.
- css
item_list.jsp ์ํ ๋ฑ๋ก์ ๋ฉ์ธ ์ด๋ฏธ์ง div ๋๋ํ 5๊ฐ ๋ณด์ฌ์ง.
float ์์ฑ ์ฌ์ฉํ์ฌ ๊ฐ๋ก๋ก ๋ฐฐ์ดํ๊ณ
๋ฐฐ๊ฒฝ์ ์ค์ ์์ญ ํ์ธํ๊ณ ์์ญ ๋ง์ถฐ์ง๋ฉด ์ญ์ !
.itemListDiv{
padding: 16px;
overflow: auto; /* flaot ์ฌ์ฉ์ผ๋ก ๋ถ๋ชจ ํ๊ทธ ๋ฒ์ด๋๋ ๊ฒ ๋ฐฉ์ง */
}
.itemDiv{
width: 20%;
float: left;
margin-bottom: 16px;
}
.itemDiv > div{
text-align: center;
}
์ํ ์กฐํ ์ฟผ๋ฆฌ ์์ฑ
<select id="selectItemList" resultMap="item">
SELECT ITEM.ITEM_CODE
, ITEM_NAME
, ITEM_PRICE
, ATTACHED_FILE_NAME
FROM SHOP_ITEM ITEM, ITEM_IMG IMG
WHERE ITEM.ITEM_CODE = IMG.ITEM_CODE
AND IS_MAIN = 'Y'
ORDER BY ITEM.ITEM_CODE DESC
</select>
์ํ ๋ชฉ๋ก์ ์กฐํํ๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ฉด item์ด๋ผ๋ resultMap์์ itemDTO๋ก ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์ค๋๋ฐ
์ํ ๋ชฉ๋ก ์กฐํ ์ฟผ๋ฆฌ๋ฅผ ์กฐ์ธ์ผ๋ก ์์ฑํ๊ธฐ ๋๋ฌธ์ itemDTO์๋
ATTACHED_FILE_NAME << ์ปฌ๋ผ์ item์ด๋ผ๋ resultMap์ ์ ์๋์ด ์์ง ์์์ ๋ฐ์ดํฐ ๊ฐ์ ธ์ฌ ์ ์์.
> resultMap์ result๋ฌธ ์ถ๊ฐํ๊ณ itemDTO์ ํด๋น ์ปฌ๋ผ ๋ฐ์์ฌ ์ ์๊ฒ ๋ณ์ ์์ฑ ํ getter/setter ์์ฑ.
์ํ ์ด๋ฏธ์ง ๋๋ฅด๋ฉด ํด๋น ์ํ ์์ธ ํ์ด์ง ์ด๋ ๊ธฐ๋ฅ
์์ธ ํ์ด์ง ์๋์ ๊ฐ์ด ๊ตฌํ.
์์ธ ํ์ด์ง ์กฐํ ์ฟผ๋ฆฌ.
์กฐ์ธ ์จ์ผ ๋จ.
<select id="selectItemDetail" resultMap="item">
SELECT ITEM.ITEM_CODE
, ITEM_NAME
, ITEM_PRICE
, ITEM_INTRO
, ATTACHED_FILE_NAME
, IS_MAIN
FROM SHOP_ITEM ITEM, ITEM_IMG IMG
WHERE ITEM.ITEM_CODE = IMG.ITEM_CODE
AND ITEM.ITEM_CODE = #{itemCode}
</select>
img ํ ์ด๋ธ ์กฐ์ธ ์ฟผ๋ฆฌ ์์ฑํ์ฌ ๋ฐ์ดํฐ ๋ฐ์์ฌ ๋ ์ค์ ์ฌํญ
itemDTO์ imgDTO๋ฅผ ์ฌ๋ฌ๊ฐ ๊ฐ์ง๊ณ ์๋ค๋ ๊ฒ์ ์ฝ๋๋ก ๋ฃ์ด์ค์ผ ํจ. (ํ๋์ ์ํ์ ์ด๋ฏธ์ง ์ฒจ๋ถ ์ฌ๋ฌ๊ฐ ํ๊ธฐ ๋๋ฌธ)
//1:n ๋๋ imgDTO๋ฆฌ์คํธ์๋ imgList(ํ ์ํ์ ๋ฑ๋ก๋ ์ฒจ๋ถํ์ผ์ ์ = list ์)๊ฐ ์ฌ๋ฌ๊ฐ ๋ค์ด๊ฐ.
private List<ImgDTO> imgList;
resultMap ์์ฑ์
<collection>์์ฑ์ผ๋ก ํ๋์ ํด๋์ค๋ ์ฌ๋ฌ๊ฐ์ ํด๋์ค๋ฅผ ๊ฐ์ง๋ค๋ ๊ฒ์ ์ ์ ํด์ค์ผ ํจ.
<!-- ์ํ ์ด๋ฏธ์ง ๊ด๋ จ -->
<resultMap type="dto.ImgDTO" id="img">
<id column="IMG_CODE" property="imgCode"/>
<result column="ORIGIN_FILE_NAME" property="originFileName"/>
<result column="ATTACHED_FILE_NAME" property="attachedFileName"/>
<result column="ITEM_CODE" property="itemCode"/>
<result column="IS_MAIN" property="isMain"/>
<!-- ItemDTO๋ ImgDTO๋ฅผ ์ฌ๋ฌ๊ฐ ๊ฐ์ง๊ณ ์๋ค. -->
<collection property="imgList" resultMap="img"></collection>
</resultMap>
์์ธํ์ด์ง์ ์๋(inputํ๊ทธ)์ด ๋ณ๊ฒฝ๋์์ ๋ ์ด ๊ฐ๊ฒฉ์ด ์ค์๊ฐ์ผ๋ก ๋ฐ๋๊ฒ ์ค์ .
๋ฐฉ๋ฒ1. js์์ ํจ์๋ก ๊ธฐ๋ฅ ๋ง๋ค๊ธฐ. (function ์ฌ์ฉ)
input ํ๊ทธ์ onchane(number ์์ฑ ํ์ดํ๋ก ๊ฐ์ ๋ฐ๊ฟ ๋๋ง๋ค ์คํ) ์์ฑ ์ถ๊ฐ ํ js์์ ๊ธฐ๋ฅ ๋ง๋ค์ด ์ค.
<input type="number" class="myInput" value="1" min="1" name="cartAmount" onchange="changePrice();">
์ด ๊ฐ๊ฒฉ ๋ถ๋ถ๋ง ์ ํํด์ ๊ฐ์ ๋ฐ๊ฟ ์ ์๊ฒ span ํ๊ทธ๋ก ๊ฐ์ธ์ id ๋ถ์ฌ
<div>์ด ๊ฐ๊ฒฉ : <span id="priceSpan">${item.itemPrice}</span>์ </div>
js์์ id๋ก span ํ๊ทธ ์ ํ
์ด ๊ฐ๊ฒฉ์ ์๋์ผ๋ก ๋ฐ๊พธ๋ ค๋ฉด ๋จ๊ฐ์ ์๋ ๋ฐ์ดํฐ๊ฐ ํ์
๋จ๊ฐ๋ ๋งค๊ฐ๋ณ์๋ก ๋์ ธ์ค.
<input type="number" class="myInput" value="1" min="1" name="cartAmount" onchange="changePrice(${item.itemPrice});">
์๋์ input ํ๊ทธ์ value๊ฐ์ ๊ฐ์ ธ์ค๋ฉด ๋จ.
input ํ๊ทธ์ id ๋ถ์ฌ
<input id="cartAmount" type="number" class="myInput" value="1" min="1" name="cartAmount" onchange="changePrice(${item.itemPrice});">
js์์ id๋ก ์๋ ๊ฐ ๋ถ๋ฌ์ค๋ฉด ๋จ.
//์๋ ๋ณ๊ฒฝ ์ ์คํ๋๋ ํจ์
function changePrice(itemPrice){
//๋จ๊ฐ ๋ฐ์ดํฐ๋ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๊ธฐ
const priceSpan = document.querySelector('#priceSpan');
//์๋ ๋ฐ์ดํฐ๋ value ๊ฐ ๋ถ๋ฌ์ค๊ธฐ.
const amount = document.querySelector('#cartAmount').value;
//innerText : ์ ํํ ํ๊ทธ ์์ ๋ด์ฉ์ ๊ฐ์ ธ์ด
priceSpan.innerText = itemPrice * amount; //๋ฐ๊พธ๊ณ ์ถ์ ๊ฐ(๋จ๊ฐ*์๋)์ ๋ฃ์ผ๋ฉด ๋จ.
}
input ํ๊ทธ์ onkeyup ์์ฑ ์ถ๊ฐํ๋ฉด ํค๋ณด๋๋ก ์๋ ๋ณ๊ฒฝ ํ์ ๋๋ ๊ฐ๊ฒฉ ์ค์๊ฐ ๋ฐ๋.
onkeyup="changePrice(${item.itemPrice});
<input id="cartAmount" type="number" class="myInput" value="1" min="1" name="cartAmount"
onchange="changePrice(${item.itemPrice});" onkeyup="changePrice(${item.itemPrice});">
์๋ ๋ณ๊ฒฝ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ผ๋ก๋ ๊ฐ๋ฅ.
๋ฐฉ๋ฒ2.
์ด๋ฒคํธ ์ธ ๋ ()์์ ์ด๋ค ์ด๋ฒคํธ ๋ด์ฉ ๋ฃ๋ ๊ณณ์
ํจ์๋ฅผ ๋ฐ๋ก ๋ฃ์.
//์ด๋ฏธ์ง๋ฅผ ํด๋ฆญํ ๋๋ง๋ค ์คํ๋๋ ์ด๋ฒคํธ(์ฐ์ต)
const imgTag = document.querySelector('#testImg');
//imgTag.addEventListener('click', aaa);
//('๋ฌด์์ ํ์ ๋ ์ด๋ฒคํธ ๋ฐ์', ์ด๋ค ์ด๋ฒคํธ)
imgTag.addEventListener('click', function(){ //ํจ์๋ฅผ ๋ฐ๋ก ๊ดํธ ์์์ ๋ง๋ฆ. ํจ์ ์ด๋ฆ ์ ์x(์ด๋ฆ์ผ๋ก ํธ์ถ ์ํ๊ธฐ ๋๋ฌธ์ ํ์ ์์.)
alert(1);
});
์ฅ๋ฐ๊ตฌ๋ ๊ธฐ๋ฅ
์ฅ๋ฐ๊ตฌ๋ ํ ์ด๋ธ ์์ฑ
์ฅ๋ฐ๊ตฌ๋ ํด๋ฆญ ์ ์ฅ๋ฐ๊ตฌ๋์ ์ํ ๋ด๊ธฐ
(๋ก๊ทธ์ธ ํ์ง ์์๋ค๋ฉด alert์ผ๋ก ๋ก๊ทธ์ธ ํ ์ฌ์ฉํ์ธ์ ๋จ๊ฒ)
์ฅ๋ฐ๊ตฌ๋์ ์ํ์ ๋ด์ผ๋ฉด ๊ณ์ ์ผํ์ ํ ์ง ์ฅ๋ฐ๊ตฌ๋ ๋ชฉ๋ก ํ๋ฉด์ผ๋ก ๊ฐ ์ง ๋ฌผ์ด๋ด์ผ ํจ(confirm-ํ์ธ(์ฅ๋ฐ๊ตฌ๋),์ทจ์)
๋ก๊ทธ์ธํ๋ฉด ์๋จ์ ๋ก๊ทธ์์ ์ ์ ์ฅ๋ฐ๊ตฌ๋ ํ๋ฉด์ผ๋ก ์ด๋ํ๊ฒ
CartController (*ca)
CartService, CartServiceImpl
cart-mapper.xml,
webapp/view/cart/cart_list.jsp
script ๋ด์ฉ ๋ฐ๋ก ๋นผ์ ๊ด๋ฆฌ.
webapp/js/item/item_detail.js (ํด๋ ๋ฐ ํ์ผ๋ช viwe ๊ฒฝ๋ก์ ๋์ผํ๊ฒ ๋ง์ถฐ์)์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ๊ณผ ํด๋น jsp ํ์ผ ์ฐ๊ฒฐ ๋ก๋ฉํด์ฃผ๊ธฐ.์์น๋ body ํ๊ทธ ๋ซํ๊ธฐ ์ (src ์์ฑ ์ถ๊ฐ ๊ฒฝ๋ก ๋ฃ์ด์ฃผ๊ธฐ)
<!-- javascript ํ์ผ ๋ก๋ฉ -->
<script type="text/javascript" src="js/item/item_detail.js"></script>
์ฅ๋ฐ๊ตฌ๋ ๋๋ฅด๋ฉด ๋ฏธ๋ก๊ทธ์ธ ์ ๋ก๊ทธ์ธํ๋ผ๋ ์ฐฝ ๋ฐ์ฐ๊ธฐ ์ํด์๋ session์ loginInfo(๋ก๊ทธ์ธ ์ฌ๋ถ ํ์ธ ๊ฐ๋ฅ)๊ฐ ํ์ํจ.
js์์ ์ ๊ทผ ๋ชป ํจ. > ๋ฒํผ ํด๋ฆญํ ๋ jsp์์ ๋งค๊ฐ๋ณ์๋ก ๋์ ธ์ ๋ฐ์์ผ ๋จ.
loginInfo๋ ์๋ฃํ์ด MemberDTO์. js์์ ํด๋์ค ์ธ์ ๋ชป ํจ > ๊ทธ๋์ loginInfo์ memId๋ฅผ ๋์ ธ์ค
(ํ์ฌ๊น์ง๋ js์์ ๋ฌธ์์ ์ซ์๋ง ์ธ์ ๊ฐ๋ฅํ๋ค๊ณ ์๊ฐํ๊ธฐ)
์ฃผ์์ฌํญ!
memId ๋๊ธธ ๋ ๊ฐ๋ฐ์ ๋ชจ๋๋ก ํ์ธํด ๋ณด๋ฉด memId ๊ทธ๋๋ก ๋์ด > ๋ฌธ์์ธ์ง ์ธ์ ๋ชป ํจ.
์๋ฐ์คํฌ๋ฆฝํธ๋ ' '(ํ๋ฐ์ดํ)์์ ๊ฐ์ธ์ ธ์ผ ๋ฌธ์๋ก ์ธ์ํ๊ธฐ ๋๋ฌธ์ sessionScope.loginInfo.memId ์ ์ฒด๋ฅผ ํ๋ฐ์ดํ ์์ ๊ฐ์ธ์ ๋๊ฒจ์ผ ํ๋ค
<input type="button" class="btn" value="์ฅ๋ฐ๊ตฌ๋" onclick="addCart('${sessionScope.loginInfo.memId}');">
js ์์ - ์ฅ๋ฐ๊ตฌ๋ ๋ฒํผ ํด๋ฆญ ์ ์คํ
//์ฅ๋ฐ๊ตฌ๋ ๋ฒํผ ํด๋ฆญ์ ์คํ
function addCart(memId){
//memId๊ฐ ๋น๋ฌธ์๊ฐ ์๋ = ๋ก๊ทธ์ธ O
if(memId != ''){
location.href = 'insertCart.ca'; //์ถํ์ ์ญ์ ๋ ๊ฒ.
}
else{
//confirm์์ ํ์ธ์ ๋๋ฅด๋ฉด true์
const result = confirm('๋ก๊ทธ์ธ ํ ์ด์ฉ ๊ฐ๋ฅํฉ๋๋ค. \n๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋ํ์๊ฒ ์ต๋๊น?');
if(result){
location.href = 'loginForm.me';
}
}
}
CartController๋ก ์ด๋ํด์ ์ฅ๋ฐ๊ตฌ๋ ์ํ ๋ด๋ if๋ฌธ ์์ฑ
cart_mapper๋ก ๊ฐ์ ์ฟผ๋ฆฌ๋ฌธ ์์ฑ.
๋ฐ์์ฌ ๋ฐ์ดํฐ ํ์ธ
์ํ ์ฝ๋ - ๊ทธ ์์ธ ํ์ด์ง์ ์ํ์ ์ฅ๋ฐ๊ตฌ๋์ ๋ด์์ผ ํ๊ธฐ ๋๋ฌธ์ ํ์ํจ
๋ฉค๋ฒ์์ด๋ - ๋ฐ์์ค๊ธด ํ์ง๋ง jsp์์ session์์ ๋ฐ์์ฌ ๊ฒ.
cartAmount - ์๋ ํ์
totalprice - ์ํ ์ฝ๋(๋จ๊ฐ ์ ์ ์์)์ cartAmount ์์ผ๋ฉด totalprice ๊ณ์ฐ ๊ฐ๋ฅ. ๊ตณ์ด ๊ฐ์ ธ์ฌ ํ์ ์๋ค.
๋จ๊ฐ๋ ์๋ธ ์ฟผ๋ฆฌ๋ก ๊ฐ์ ธ์ฌ ์ ์์
(SELECT ITEM_PRICE
FROM SHOP_ITEM
WHERE ITEM_CODE = #{itemCode}) * #{cartAmount}
์ฅ๋ฐ๊ตฌ๋๋ฅผ ๋๋ ์ ๋ ๋ฐ์ดํฐ๋ฅผ ๋๊ฐ(ITEM_CODE, CART_MOUNT) ๊ฐ์ ธ๊ฐ์ผ ๋จ.
form์ผ๋ก ๊ฐ์ ธ๊ฐ๋ฉด ๋ฐ์ดํฐ๋ ๊ฐ์ ธ๊ฐ์ง๋ง js addcart ์คํ ์ ํจ , a ํ๊ทธ๋ ๊ฐ์ ธ๊ฐ๋ ๋ฐ์ดํฐ๊ฐ ๋ค ๋ณด์
> ํด๊ฒฐ ๋ฐฉ๋ฒ !
js์์ submit ํ๊ธฐ
์ผ๋จ ๊ฐ์ ธ๊ฐ์ผ ํ๋ ๋ฐ์ดํฐ๋ง form ํ๊ทธ๋ก ๊ฐ์ธ๊ธฐ itemcode๋ input ํ๋ ์ผ๋ก ๊ฐ์ ธ๊ฐ๊ณ , itemAmount๋ ์ผ๋ฐ์ ์ผ๋ก ๊ฐ์ ธ๊ฐ๊ธฐ.
form ํ๊ทธ์ id ์์ฑ ์ถ๊ฐ > js์์ formํ๊ทธ๋ฅผ ์ ํํ ์ ์๋ค.
js๋ก ์์ formํ๊ทธ๋ฅผ ์ ํํ๊ณ ์คํ.
function addCart(memId){
//memId๊ฐ ๋น๋ฌธ์๊ฐ ์๋ = ๋ก๊ทธ์ธ O
if(memId != ''){
//formํ๊ทธ ์ ํ '#form ํ๊ทธ์ ์์ด๋'
const formTag = document.querySelector('#insertCartForm');
//submit ์คํ (๋ฐ์ดํฐ ๊ฐ์ง๊ณ ์ด๋)
formTag.submit();
}
else{
//confirm์์ ํ์ธ์ ๋๋ฅด๋ฉด true์
const result = confirm('๋ก๊ทธ์ธ ํ ์ด์ฉ ๊ฐ๋ฅํฉ๋๋ค. \n๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋ํ์๊ฒ ์ต๋๊น?');
if(result){
location.href = 'loginForm.me';
}
}
}
CartController๊ฐ์ ๋์ด์ค๋ ๋ฐ์ดํฐ ๋ฐ์์ฃผ๊ธฐ.service, serviceImpl ๋ฉ์๋ ์์ฑ ๊ตฌํ ์์
CartController๊ฐ์ ๊ฐ์ฒด ์์ฑ
๋ก๊ทธ์ธ ์ ๋ณด(memId) ๋ฐ์์ด (์ธ์ ์ผ๋ก) ๋ฐ์์ฌ ๋ ์๋ฃํ ๋ง์ถ๊ธฐ, ํ๋ณํ ์ฃผ์
๋ฐ์ ๋ฐ์ดํฐ ํต ๋ง๋ค์ด์ ์ธํ
insert ๋ฉ์๋ ์คํ.
์ฅ๋ฐ๊ตฌ๋ ๋ชฉ๋ก ๊ตฌํ ๊ธฐ๋ฅ
์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๊ตฌํ (๋ชฉ๋ก SELECTํด์ ๋ค ๋ถ๋ฌ์์ผ ํจ. ์กฐ์ธ์ ์ฌ์ฉํ๋ฉด ์กฐ์ธ ์๊ฐ ๋ง์์ง
> VIEW(๊ฐ์ํ ์ด๋ธ) ์์ฑํ์ฌ ์กฐํํ๋ฉด ํธํ๋ค.
๊ฐ์ ํ ์ด๋ธ์ ์กฐํ ๋๋ ์ปฌ๋ผ๋ค์ ๋ฐ์ดํฐ ๋ค ๋ฐ์์ฌ ์ ์๊ฒ CartViewDTO ์์ฑ.
์ฅ๋ฐ๊ตฌ๋ ์กฐํ ์ฟผ๋ฆฌ ์์ฑ.
์ฅ๋ฐ๊ตฌ๋ ์กฐํ ์
์ฃผ์์ฌํญ!
์ฅ๋ฐ๊ตฌ๋์ ์ํ์ INSERT ํ ๋
ํด๋น ์ํ์ด ๋ก๊ทธ์ธํ ์์ด๋์ ์ฅ๋ฐ๊ตฌ๋ ์์ ์์ผ๋ฉด ์ถ๊ฐํ ์๋๋งํผ ์๋ ๋ด๊ฒจ์๋ ์ํ์ ์๋ UPDATE
์์ผ๋ฉด ๊ทธ๋๋ก INSERT (์กฐ๊ฑด์ผ๋ก ITEM_CODE์ MEM_ID ํ์)
์ฟผ๋ฆฌ ์์ฑ ์๋์ฒ๋ผ.
<insert id="insertCart">
MERGE INTO SHOP_CART
USING DUAL
ON (ITEM_CODE = #{itemCode} AND MEM_ID = #{memId})
WHEN MATCHED THEN
UPDATE
SET
CART_AMOUNT = CART_AMOUNT + #{cartAmount}
, TOTAL_PRICE = (SELECT ITEM_PRICE
FROM SHOP_ITEM
WHERE ITEM_CODE = #{itemCode}) * (CART_AMOUNT + #{cartAmount})
WHERE ITEM_CODE = #{itemCode}
AND MEM_ID = #{memId}
WHEN NOT MATCHED THEN
INSERT (
CART_CODE
, ITEM_CODE
, MEM_ID
, CART_AMOUNT
, TOTAL_PRICE
) VALUES (
(SELECT 'CART_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(CART_CODE, 6))), 0) + 1, 3,
'0')
FROM SHOP_CART)
, #{itemCode}
, #{memId}
, #{cartAmount}
, (SELECT ITEM_PRICE
FROM SHOP_ITEM
WHERE ITEM_CODE = #{itemCode}) * #{cartAmount}
)
</insert>
์ฅ๋ฐ๊ตฌ๋ ์ํ ์ญ์ ๊ธฐ๋ฅ
์ฅ๋ฐ๊ตฌ๋์ ์ํ ์ญ์ ๋ฒํผ ๋๋ฅด๋ฉด ์ ๋ง ์ญ์ ํ ์ง ํ์ธ ์ฐฝ ๋จ๊ฒ confirm์ผ๋ก
์๋ฐ์คํฌ๋ฆฝํธ ๊ธฐ๋ฅ ๋ฐ๋ก ๋บ
cart/cart_list.js ๋ง๋ค๊ธฐ
cart_list.jsp์ body ํ๊ทธ ์์ ์๋ ์ฝ๋(ํ์ผ ์์น ์์ฑํ ๋ ์ฃผ์)๋ก js-jsp ๊ณต์ ๋๊ฒ ์ด์ด์ค.
<script type="text/javascript" src="js/cart/cart_list.js"></script>
์ญ์ ๋ฒํผ ํด๋ฆญ์ ํ์ธ ์ฐฝ ๊ธฐ๋ฅ
//์ญ์ ๋ฒํผ ํด๋ฆญ ์ ์คํ
function goDelete(cartCode){
const result = confirm('ํด๋น ์ํ์ ์ฅ๋ฐ๊ตฌ๋์์ ์ญ์ ํ์๊ฒ ์ต๋๊น?');
if(result){
//์ญ์ ํ๋ฌ ๊ฐ๊ธฐ
location.href = 'deleteCart.ca?cartCode=' + cartCode; //๋ฐฉ๋ฒ1
//location.href = `deleteCart.ca?cartCode=${cartCode}`; //๋ฐฉ๋ฒ2 ``: ๋ฐฑํฑ์ ๊ฐ์ธ์ผ ๋จ
//jsp์์ ๋ฐ์์ค๋ ๊ฒ์ด ์๋๋ผ ๋ณ์ ์ฐ๊ณ ์ถ์ ๋ ${}์ฐ๋ฉด ๋จ.
}
}
input ํ๊ทธ์ onclick ์์ฑ ์ถ๊ฐ ํ cartCode ๋ฐ์์ค๊ธฐ
cartList์ cartItem์๋ cartCode ์กฐํ ์ ํจ> ๋ฐ์ดํฐ ๋ชป ๋ถ๋ฌ์ด
์ฟผ๋ฆฌ ์์ ํ์ฌ cartCode๋ ์กฐํํ๊ฒ ๋ฐ๊ฟ์ผ ๋จ!
์๋ฐ์คํฌ๋ฆฝํธ์์ cartCode ๋ฌธ์๋ก ์ธ์ํ ์ ์๊ฒ ' '์ ๊ฐ์ธ์ผ ํ๋ค.
<input type="button" class="btn" value="์ญ์ " onclick="goDelete('${cartItem.cartCode}');">
์ฅ๋ฐ๊ตฌ๋ ์์ ๊ธฐ๋ฅ
์ฟผ๋ฆฌ ์์ฑ
์์ ๋ฒํผ ๋๋ฅด๋ฉด ๋ฐ์ดํฐ cartCode, cartAmount ๊ฐ์ ธ๊ฐ๋ฉด์ ์ด๋
> js ์ฌ์ฉํ์ฌ location.href ์ด์ฉ, form์ด์ฉ
๋ฐฉ๋ฒ1. js๋ก ๊ธฐ๋ฅ ๊ตฌํ
cartCode๋ ๋งค๊ฐ๋ณ์๋ก ๋ฐ์์ด
cartAmount๋ this๋ฅผ ์ด์ฉํ์ฌ ๋ฐ์ดํฐ ๋ฐ์์ด.
this : ๋ด๊ฐ ํด๋ฆญ,์คํํ ํ๊ทธ ๊ทธ ์์ฒด (์์ ๋ฒํผ)
this๋ฅผ ๊ธฐ์ค์ผ๋ก(๋ด๊ฐ ํด๋ฆญํ ํ๊ทธ-์์ ๋ฒํผ) ์๋ ํ๊ทธ๋ฅผ ์ฐพ์๊ฐ.
this๋ฅผ selectedTag๋ก ์ง์ ํ์ฌ
selectedTag.previousElementSibling
this ์ด์ ์ ํ๊ทธ ์ฆ, ์๋ ํ๊ทธ value๊ฐ ๊ฐ์ ธ์ค๊ธฐ.
const cartAmount = selectedTag.previousElementSibling.value;
location.href = `updateCartAmount.ca?cartCode=${cartCode}&cartAmount=${cartAmount}`;
๋ฐฉ๋ฒ2.form ํ๊ทธ ์ฌ์ฉ
cartAmount , submit input ํ๊ทธ๋ฅผ form์ผ๋ก ๊ฐ์ธ์ฃผ๊ณ name ์ง์ ํ์ฌ ๋ฐ์ดํฐ ๋๊น.
cartCode๋ input ํ๊ทธ hidden์ผ๋ก ๋๊ฒจ์ค๋ค.
<td>
<form action="updateCartAmount.ca" method="post">
<input type="hidden" name="cartCode" value="${cartItem.cartCode}">
<input name="cartAmount" class="myInput" style="width: 30%; vertical-align: middle; margin-right: 10px; padding: 10px;" type="number" min="1" value="${cartItem.cartAmount }">
<input style="vertical-align: middle;" type="submit" class="btn" value="์์ ">
</form>
</td>
controller ๊ฐ์ if๋ฌธ ์์ฑ
์ฅ๋ฐ๊ตฌ๋์ ์ฒดํฌ ๋ฐ์ค ์ปจํธ๋กค ๊ธฐ๋ฅ
js๋ก ๊ธฐ๋ฅ ์์ฑ
์ ๋ชฉ์ค์ ์ฒดํฌ ๋ฐ์ค๋ฅผ ์ ํ > ์ํ ๋ชฉ๋ก ์ฒดํฌ ๋ฐ์ค ์ ์ฒด ์ ํ/ ์ ์ฒด ์ ํ ํด์
์ฒดํฌ๋ฐ์ค ์ด๋ฒคํธ ์ถ๊ฐ
//1. ์ฒดํฌ๋ฐ์ค ์ ์ฒด ์ ํ, ์ ์ฒด ํด์ ์ด๋ฒคํธ
//1.1 ์ ๋ชฉ์ค์ ์๋ ์ฒดํฌ๋ฐ์ค๋ฅผ ์ ํ
const checkAll = document.querySelector('#checkAll');
//1.2 ์ฒดํฌ๋ฐ์ค์ ํด๋ฆญ ์ ์คํ๋๋ ์ด๋ฒคํธ ์ถ๊ฐ
//(์ธ์ ์ด๋ฒคํธ ๋ฐ์? , ๋ฌด์จ ์ด๋ฒคํธ)
checkAll.addEventListener('click', function(){
//์ ๋ชฉ์ค ์ฒดํฌ๋ฐ์ค์ ์ฒดํฌ ์ฌ๋ถ
const isChecked = checkAll.checked; //์ฒดํฌ ๋ฐ์ค์ checked ์์ฑ ๋ถ๋ฌ์ด
//์ฒดํฌ
if(isChecked){
//์ฅ๋ฐ๊ตฌ๋ ๋ชฉ๋ก์ ์๋ ๋ชจ๋ ์ฒดํฌ๋ฐ์ค๋ฅผ ์ ํ
const checkboxes = document.querySelectorAll('.chk');
//checkboxes.checked; ์ฒดํฌ ๋์ ๋ - true๋ก ๋์ด
//checkboxes.checked = true; ์ฒดํฌ๋ฐ์ค๊ฐ ์ฌ๋ฌ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ๊ฐ ๋ฐ๋ก ๋ชป ๋ฐ๊ฟ
//for๋ฌธ์ผ๋ก ๊ฐ๊ฐ ๋ฐ๊ฟ์ผ ๋จ
//๊ฐ์ ธ์จ ์ฒดํฌ๋ฐ์ค์ ๊ฐ์๋งํผ ๋ฐ๋ณตํ๋ฉด์ ์ฒดํฌ ์ฌ๋ถ ๋ณ๊ฒฝ
for (const checkbox of checkboxes) {
checkbox.checked = true;
}
}
//์ฒดํฌ ํด์
else{
//์ฅ๋ฐ๊ตฌ๋ ๋ชฉ๋ก์ ์๋ ๋ชจ๋ ์ฒดํฌ๋ฐ์ค๋ฅผ ์ ํ
const checkboxes = document.querySelectorAll('.chk');
//checkboxes.checked;
//checkboxes.checked = true; ์ฒดํฌ๋ฐ์ค๊ฐ ์ฌ๋ฌ๊ฐ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ดํฐ ๊ฐ ๋ฐ๋ก ๋ชป ๋ฐ๊ฟ
//for๋ฌธ์ผ๋ก ๊ฐ๊ฐ ๋ฐ๊ฟ์ผ ๋จ
//๊ฐ์ ธ์จ ์ฒดํฌ๋ฐ์ค์ ๊ฐ์๋งํผ ๋ฐ๋ณตํ๋ฉด์ ์ฒดํฌ ์ฌ๋ถ ๋ณ๊ฒฝ
for (const checkbox of checkboxes) {
checkbox.checked = false;
}
}
});
๋ชฉ๋ก ์ฒดํฌ๋ฐ์ค ์ ํ ์ฌ๋ถ์ ๋ฐ๋ผ ์ ๋ชฉ์ค ์ฒดํฌ ๋ฐ์ค ์ฒดํฌ ์ฌ๋ถ ๋ณ๊ฒฝ
//2.๋ชฉ๋ก์ ์ฒดํฌ ๋ฐ์ค๊ฐ ํ๋๋ผ๋ ์ฒดํฌ ์ ๋์ด์์ผ๋ฉด ์ ๋ชฉ์ฆ ์ฒดํฌ ํด์ ๋ชฉ๋ก ์ฒดํฌ ๋ฐ์ค ๋ค ์ฒดํฌํ๋ฉด ์ ๋ชฉ์ค ๋ฐ์ค ์ฒดํฌ
//2.1 ๋ด์ฉ๋ถ์ ์๋ ์ฒดํฌ๋ฐ์ค๋ฅผ ์ ํ
const checkboxes = document.querySelectorAll('.chk');
//2.2 ๋ชจ๋ ์ฒดํฌ๋ฐ์ค ๊ฐ๊ฐ์ ์ด๋ฒคํธ ์ถ๊ฐ
for(const checkbox of checkboxes){
checkbox.addEventListener('click', function(){
//์ ์ฒด(๋ชฉ๋ก) ์ฒดํฌ๋ฐ์ค์ ๊ฐ์๋ฅผ ํ์
const totalCnt = checkboxes.length
//์ฒดํฌ๊ฐ ๋ ์ฒดํฌ๋ฐ์ค์ ๊ฐ์
const checkCnt = document.querySelectorAll('.chk:checked').length //ํด๋์ค๊ฐ chk์ธ ํ๊ทธ์ ์์ฑ์ด checked์ธ ๊ฒ์ ๊ฐ์ ๊ฐ์ ธ์ด
if(totalCnt == checkCnt){
document.querySelector('#checkAll').checked = true;
}else{
document.querySelector('#checkAll').checked = false;
}
});
}
์ํ ๊ตฌ๋งค ๊ธฐ๋ฅ
1.๋ฐ๋ก ๊ตฌ๋งค
2.์ฅ๋ฐ๊ตฌ๋์์ ๊ตฌ๋งค
์ผ๋จ์ ๊ฐ ๊ตฌ๋งค์ ํ ์ข
๋ฅ์ ์ํ๋ง ๊ตฌ๋งค๋๊ฒ ๊ธฐ๋ฅ ๊ตฌํ
์ฅ๋ฐ๊ตฌ๋์์ ์ฒดํฌ ๋ฐ์ค ์ ํ ๊ตฌ๋งค, ์ ํ ์ญ์ ๊ธฐ๋ฅ
- ์ ํ ์ญ์ ๊ธฐ๋ฅ
์ฟผ๋ฆฌ ์์ฑ 2๊ฐ์ง ๋ฐฉ๋ฒ
์) CART_001, CART_003, CART_005 ์ํ ์ง์ด๋ค๊ณ ๊ฐ์ .
1. OR ์ฌ์ฉ (์ค๋ฌด์์ ์ ์ ์)
<delete id="deleteCheckCarts">
DELETE SHOP_CART
WHERE CART_CODE = 'CART_001'
OR CART_CODE = 'CART_003'
OR CART_CODE = 'CART_005'
</delete>
2. IN ์ฌ์ฉ
<delete id="deleteCheckCarts">
DELETE SHOP_CART
WHERE CART_CODE IN ('CART_001', 'CART_003', 'CART_005')
</delete>
์ญ์ ๋ฅผ ์ํด ์ฒดํฌ๋ฐ์ค ์ ํํ ์ฌ๋ฌ CART_CODE๋ค์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ผ ํจ.
CART_CODE๋ค์ LIST์ ๋ด์์ LIST์ ํฌ๊ธฐ๋งํผ ๋ฐ๋ณตํ๋ฉด์ ๋ฐ์ดํฐ ๋ฐ์์ผ ํจ. > for๋ฌธ ์ฌ์ฉ
<delete id="deleteCheckCarts">
DELETE SHOP_CART
WHERE CART_CODE IN
<foreach collection="cartCodeList" item="cartCode" separator="," open="(" close=")">
#{cartCode}
</foreach>
</delete>
for๋ฌธ์ ๋ฐ๋ณตํ๋ฉด ์๋์ฒ๋ผ ๋์ด
'CART_001' 'CART_003' 'CART_005'
์ผ๋ฐ์ ์ผ๋ก ๋ฐ๋ณต๋ฌธ๋ง ๋๋ฉด ์ฝ๋ ๋ฌธ๋ฒ์ ์ ๋ง์
IN ๋ค์ ์๊ดํธ ํ์ cartCode ์ฌ์ด์ ์ผํ ํ์ํจ
separator="," : ๋ฐ๋ณต๋ ๋๋ง๋ค ๋ถ์ฌ์ค(๋ง์ง๋ง ๋ฐ๋ณต๋ฌธ์ X)
open="(" : ๋ฐ๋ณต๋ฌธ ์ฒ์ ์์ํ ๋
close=")" : ๋ฐ๋ณต๋ฌธ ์ต์ข ๋๋ ๋
<input type="button" class="btn" value="์ ํ์ญ์ " onclick="deleteCheckCarts();">
์ ํ ์ญ์ ๋ฒํผ ๋๋ฅด๋ฉด ์ญ์ ๊ธฐ๋ฅ ํ์ฑํ ๋๊ฒ js์ ํจ์ ์ด์ฉ.
//์ ํ ์ญ์ ๋ฒํผ ํด๋ฆญ ์ ์คํ
function deleteCheckCarts(){
const result = confirm('์ ํํ ์ํ์ ์ฅ๋ฐ๊ตฌ๋์์ ์ญ์ ํ์๊ฒ ์ต๋๊น?');
if(result){
//์ฒดํฌํ ์ํ์ CART_CODE ๊ฐ ๊ฐ์ ธ์ค๊ธฐ.
//1. ์ฒดํฌ๋ ์ฒดํฌ๋ฐ์ค ๋ค ์ ํํ๊ธฐ
const checkedChks = document.querySelectorAll('.chk:checked');
//jsp์ value๋ก cartCode ๋๊ธด ๊ฒ์
//for๋ฌธ ์ฌ์ฉํ์ฌ ๊ฐ๊ฐ cartCode value๊ฐ ๋ฐ์์ด
let cartCode = '';
for(const chk of checkedChks) {
cartCode = cartCode + chk + ',';
//์๋ ์ฝ๋ ์คํ ๊ฒฐ๊ณผ : CART_001, CART_003, CART_005,
//๋ง์ง๋ง์ ,๋ง ์๋ผ๋ด๋ฉด ๋๋ค.
}
//๋ฌธ์์ด ์๋ผ๋ด๊ธฐ(0,n (์ฒ์๋ถํฐ n์ ๊น์ง))
cartCode = cartCode.substring(0, cartCode.length - 1)
location.href = `deleteCheckCarts.ca?cartCode=${cartCode}`;
}
}
CartController ๊ฐ์ ์ญ์ ์คํ if๋ฌธ ์์ฑ
//์ ํ ์ญ์ ํด๋ฆญ ์
if(command.equals("/deleteCheckCarts.ca")) {
String cartCodes = request.getParameter("cartCode");
//๋ฌธ์์ด์ , ๊ธฐ์ค์ผ๋ก ์๋ฆ > ๋ฆฌํด ํ์
: ๋ฌธ์์ด ๋ฐฐ์ด
String[] cartCodeArr = cartCodes.split(",");
//๋ฐฐ์ด > ๋ฆฌ์คํธ ๋ณ๊ฒฝ(์ฟผ๋ฆฌ๋ฌธ์์ list๋ก ๋ฐ๋ณต๋ฌธ ๋๋ฆฌ๊ธฐ ๋๋ฌธ์)
List<String> cartCodeList = Arrays.asList(cartCodeArr);
}
CartService, CartServiceImpl ์์ ํ
if๋ฌธ ๋๋จธ์ง ์์ฑ.
//์ ํ ์ญ์ ํด๋ฆญ ์
if(command.equals("/deleteCheckCarts.ca")) {
String cartCodes = request.getParameter("cartCode");
//๋ฌธ์์ด์ , ๊ธฐ์ค์ผ๋ก ์๋ฆ > ๋ฆฌํด ํ์
: ๋ฌธ์์ด ๋ฐฐ์ด
String[] cartCodeArr = cartCodes.split(",");
//๋ฐฐ์ด > ๋ฆฌ์คํธ ๋ณ๊ฒฝ(์ฟผ๋ฆฌ๋ฌธ์์ list๋ก ๋ฐ๋ณต๋ฌธ ๋๋ฆฌ๊ธฐ ๋๋ฌธ์)
List<String> cartCodeList = Arrays.asList(cartCodeArr);
CartDTO cartDTO = new CartDTO();
cartDTO.setCartCodeList(cartCodeList);
cartService.deleteCheckCarts(cartDTO);
page = "cartList.ca";
isRedirect = true;
}
- ์ ํ ๊ตฌ๋งค ๊ธฐ๋ฅ
๊ตฌ๋งค ์ ๋ณด ํ ์ด๋ธ, ๊ตฌ๋งค ์์ธ ํ ์ด๋ธ ์์ฑ
buy ๊ด๋ จ๋ ํด๋์ค, ์ธํฐํ์ด์ค, ๋งตํผ ๋ฑ๋ฑ ์์ฑ
์ฟผ๋ฆฌ ์์ฑinsert ์ฟผ๋ฆฌ ์์ฑ ์ ๋ค์์ ๋ค์ด๊ฐ BUY_CODE ๋ฐ์์ค๋ select ์ฟผ๋ฆฌ ์์ฑ(insert ์ฟผ๋ฆฌ์ ์๋ธ์ฟผ๋ฆฌ๋ก ์์ฑํด๋ ๋ฌด๋ฐฉ)
<!-- ๋ค์์ ๋ค์ด๊ฐ BUY_CODE ๋ฐ์์ค๊ธฐ -->
<select id="selectNextBuyCode" resultType="String">
(SELECT 'BUY_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(BUY_CODE, 5))), 0) + 1, 3, '0')
FROM SHOP_BUY)
</select>
์ฅ๋ฐ๊ตฌ๋ ์ํ ์ ํ ๊ตฌ๋งค INSERT ์ฟผ๋ฆฌ ์์ฑ
<!-- ์ฅ๋ฐ๊ตฌ๋ ์ํ ์ ํ ๊ตฌ๋งค -->
<insert id="insertBuy">
INSERT INTO SHOP_BUY (
BUY_CODE
, MEM_ID
, BUY_PRICE
) VALUES (
#{buyCode}
, #{memId}
, #{buyPrice}
)
</insert>
-
<input type="button" class="btn" value="์ ํ๊ตฌ๋งค" onclick="insertBuy();">
์ ํ ๊ตฌ๋งค ๋ฒํผ ๋๋ฅด๋ฉด ๊ตฌ๋งค ๊ธฐ๋ฅ ํ์ฑํ ๋๊ฒ js์ ํจ์ ์ด์ฉ.
์ ํ ์ญ์ ์ ๊ฐ์ด ์ฒดํฌ๋ ๋ฐ์ค๋ค์ value๊ฐ ๊ฐ์ง๊ณ ์์ผ ํจ์ฝ๋ ์ค๋ณต ๋จ. ์ฒดํฌ ๋ฐ์ค๋ค value๊ฐ ๊ฐ์ ธ์ค๋ ๊ธฐ๋ฅ ๋ฐ๋ก ๋นผ์ ํจ์๋ก ๋ง๋ค๊ธฐ.
//์ฒดํฌ๋ cartCode ๋ค๊ณ ์ค๋ ํจ์
function getCartCodes(){
//์ฒดํฌํ ์ํ์ CART_CODE ๊ฐ ๊ฐ์ ธ์ค๊ธฐ.
//1. ์ฒดํฌ๋ ์ฒดํฌ๋ฐ์ค ๋ค ์ ํํ๊ธฐ
const checkedChks = document.querySelectorAll('.chk:checked');
//jsp์ value๋ก cartCode ๋๊ธด ๊ฒ์
//for๋ฌธ ์ฌ์ฉํ์ฌ ๊ฐ๊ฐ cartCode value๊ฐ ๋ฐ์์ด
let cartCode = '';
for(const chk of checkedChks) {
cartCode = cartCode + chk.value + ',';
//์๋ ์ฝ๋ ์คํ ๊ฒฐ๊ณผ : CART_001, CART_003, CART_005,
//๋ง์ง๋ง์ ,๋ง ์๋ผ๋ด๋ฉด ๋๋ค.
}
//๋ฌธ์์ด ์๋ผ๋ด๊ธฐ(0,n (์ฒ์๋ถํฐ n์ ๊น์ง)) >> CART_OO1, CART_003 ~
cartCode = cartCode.substring(0, cartCode.length - 1)
return cartCode;
}
์ ํจ์(๋ฉ์๋) ์ด์ฉํ์ฌ ์ ํ ๊ตฌ๋งค ๊ธฐ๋ฅ ํจ์ ์์ฑ.
//์ ํ ๊ตฌ๋งค ๋ฒํผ ํด๋ฆญ ์ ์คํ
function insertBuy(){
const cartCode = getCartCodes();
location.href = `insertBuy.bu?cartCode=${cartCode}`;
}
์ํ ์์ธ ํ ์ด๋ธ insert
์ ํ ๊ตฌ๋งค์ ์ฒดํฌ ๋ฐ์ค๋ฅผ ํด๋ฆญํ๋ฉด CART_CODE๋ฅผ ๊ฐ์ ธ์ค๋๋ฐ
๊ทธ CART_CODE๋ฅผ ๊ฐ์ง๊ณ ์ฅ๋ฐ๊ตฌ๋์ ์ํ์ด ์กฐํ๋๊ณ
๊ทธ ์กฐํ๋ ๋ฐ์ดํฐ๋ฅผ ์ํ ๊ตฌ๋งค ์์ธ ํ ์ด๋ธ์ ๋ฃ์ด์ฃผ๊ธฐ ์ํด ์กฐํ cart_mapper์ select ์ฟผ๋ฆฌ ์ถ๊ฐ ํ ๋ฉ์๋ ์์ฑ ๋ฐ ๊ตฌํ
<!-- CART_VIEW ๋ทฐ ์ฌ์ฉ -->
<select id="selectCartForBuy">
SELECT ITEM_CODE
, CART_AMOUNT
, TOTAL_PRICE
FROM CART_VIEW
WHERE CART_CODE = #{cartCode}
AND IS_MAIN = 'Y'
</select>
BuyController ์์ CartService ๊ฐ์ฒด ์์ฑ ํ ๋ฉ์๋ ์ฌ์ฉ
์ฒดํฌ๋ ์ํ๋ค List์ ์๊ธฐ ๋๋ฌธ์ for๋ฌธ์ผ๋ก ๋ฆฌ์คํธ ๋ฐ์ดํฐ ๋นผ๋ฉด์ ๋ฉ์๋ ์ฌ์ฉํด์ผ ํจ.
์์ธ ํ ์ด๋ธ์๋ ๊ตฌ๋งค ์ฝ๋ ๋ค์ด๊ฐ์ผ ํจ.
์ด์ ์ ๋ง๋ค์ด๋ ๊ตฌ๋งค ์ฝ๋ ์กฐํ ์ฟผ๋ฆฌ ์คํ.
์์ธ ํ ์ด๋ธ์ ๊ตฌ๋งค์ ID๋ ํ์.
session์ผ๋ก ๋ฐ์์ค๊ธฐ
์ ํ๋ ์ํ๋ค์ ์ด ๊ฐ๊ฒฉ๋ ํ์
for๋ฌธ ๋๋ฉด์ ์ ํ๋ ์ฅ๋ฐ๊ตฌ๋ ์ํ ๋นผ์ค๊ธฐ ๋๋ฌธ์ ์ฅ๋ฐ๊ตฌ๋์ ๊ฐ ์ํ์์ getter๋ก totalPrice๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์
totoalPrice ๋์ ์ผ๋ก ๋ํด์ ๋ณ์์ ๋ด๊ธฐ.
๊ฐ์ ธ์จ ๋ฐ์ดํฐ buyDetailDTO์ ์ธํ
buyDetailCode๋ ๋ฐ์ดํฐ ์ ๊ฐ์ ธ์๊ธฐ ๋๋ฌธ์ ์ฟผ๋ฆฌ๋ฌธ์์ BUY_001_01 ํํ๋ก ์๋ ์ ๋ ฅ ๋๊ฒ ์์ฑ.
service, serviceImpl ์์ฑ ๊ตฌํ
mapper์์ for๋ฌธ์์ buyDetailList ๋๋ฆด ๋ buyDetialList getter๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์
buyDetailDTO์ ํด๋น getter๊ฐ ์์ด์ผ ํ๋ค.
๋ณ์ ๋ง๋ค๊ณ getter/setter ์์ฑ
-๊ตฌ๋งคํ ์ํ ์ฅ๋ฐ๊ตฌ๋์์ ์ญ์ ๊ธฐ๋ฅ
์ ํํ ์ํ ์ญ์ ๋ฉ์๋ ์ฌ์ฉํ์ฌ ๊ธฐ๋ฅ ๊ตฌํ ๊ฐ๋ฅ.
๊ตฌ๋งคํ ์ํ๋ค์ cartCode๋ ๋ฐ์ดํฐ ์ด๋ฏธ ๊ฐ์ง๊ณ ์์.
๋ ๊ฐ์ง ์ฌ์ฉํ์ฌ ์ ํํ ์ํ ์ง์์ฃผ๋ฉด ๋๋ค.
CartDTO cartDTO = new CartDTO();
cartDTO.setCartCodeList(cartCodeList);
cartService.deleteCheckCarts(cartDTO);
๊ตฌ๋งค ์ ๋ณด insert ํ ๋ ์์ธ ๊ตฌ๋งค ์ ๋ณด๋ insert ๊ธฐ๋ฅ, ๊ตฌ๋งค๋ ์ํ delete ๊ธฐ๋ฅ ํ๋ฒ์ ๋ฌถ์ด์ฃผ๋ ๊ฒ ์ข๋ค.
์ ์ค ํ๋๋ง ์คํจํด๋ rollback ๋๋๋ก(ํธ๋์ญ์ )
try-catch๋ฌธ ํ์ฉ
BuyService ์์
//๊ตฌ๋งค ์ ๋ณด ๋ฑ๋ก
void insertBuy(BuyDTO buyDTO, BuyDetailDTO buyDetailDTO, CartDTO cartDTO);
BuyServiceImple ์์
@Override
public void insertBuy(BuyDTO buyDTO, BuyDetailDTO buyDetailDTO, CartDTO cartDTO) {
try {
sqlSession.insert("buyMapper.insertBuy", buyDTO);
sqlSession.insert("buyMapper.insertBuyDetails", buyDetailDTO);
sqlSession.delete("cartMapper.deleteCheckCarts", cartDTO);
sqlSession.commit();
}catch (Exception e) {
sqlSession.rollback();
e.printStackTrace();
}
}
BuyController ์์
(์ด์ ์ ์์ฑํ insertBuyDetail, ๊ตฌ๋งคํ ์ํ delete ๋ฉ์๋ ์คํ๋ฌธ ์ญ์ ํ insertBuy ์คํ ๋ฉ์๋์ ํฉ์ณ์ค๋ค)
//๊ตฌ๋งค ์ํ ์ ๋ณด ๋ฑ๋ก
BuyDTO buyDTO = new BuyDTO();
buyDTO.setBuyCode(nextBuyCode);
buyDTO.setMemId(memId);
buyDTO.setBuyPrice(buyPrice);
//๊ตฌ๋งค ์ํ ์์ธ ์ ๋ณด ๋ฑ๋ก
BuyDetailDTO buyDetailDTO = new BuyDetailDTO();
buyDetailDTO.setBuyDetailList(buyDetailList);
//๊ตฌ๋งคํ ์ํ ์ฅ๋ฐ๊ตฌ๋์์ ์ญ์
CartDTO cartDTO = new CartDTO();
cartDTO.setCartCodeList(cartCodeList);
//๋ฉ์๋ ์คํ
buyService.insertBuy(buyDTO, buyDetailDTO, cartDTO);
์ฅ๋ฐ๊ตฌ๋ ์ํ ์ ํ ๊ตฌ๋งค ์์ธ ์ฟผ๋ฆฌ๋ ํ๋ฒ์ ์ฌ๋ฌ๊ฐ INSERT ๋๊ฒ ์์ฑ.
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
IOC์ DI (๊ฒฐํฉ๋) / @(์ด๋ ธํ ์ด์ ) (0) | 2023.03.14 |
---|---|
Spring - DB ์ฐ๊ฒฐ (0) | 2023.03.14 |
Spring ์ด์ฉ - ํ์๊ฐ์ ๋ฐ ํ์ ์ ๋ณด ํ์ธ ํ๋ฉด ๊ตฌํ (0) | 2023.03.13 |
Spring ํ์ฉ ์น ๊ฐ๋ฐ (0) | 2023.03.13 |
๊ฒ์ํ ํ๋ก์ ํธ (0) | 2023.02.23 |