์‡ผํ•‘๋ชฐ ํ”„๋กœ์ ํŠธ

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

๋‹ค์ค‘ insert๋ฌธ ์‹คํ–‰์‹œ n๊ฐœ์˜ ํ–‰ ์‚ฝ์ž…๋˜๋Š” ๊ฒƒ์„ ํ™•์ธ ๊ฐ€๋Šฅ.

์ƒํ’ˆ ์ด๋ฏธ์ง€ ๋“ฑ๋ก ์ฟผ๋ฆฌ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑํ•ด์•ผ ๋งž์Œ.

 

 

 

 

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 ๋˜๊ฒŒ ์ž‘์„ฑ.