์‡ผํ•‘๋ชฐ ํ”„๋กœ์ ํŠธ(11) ํšŒ์› MY PAGE - ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ชฉ๋ก (3) ์„ ํƒ ๊ตฌ๋งค

2023. 4. 11. 08:51ใ†Spring

์žฅ๋ฐ”๊ตฌ๋‹ˆ ์„ ํƒ ๊ตฌ๋งค ๊ธฐ๋Šฅ

 

์ „์ฒด ๊ตฌ๋งค ์ •๋ณด insert ์ฟผ๋ฆฌ ์ž‘์„ฑ

	<!-- ๊ตฌ๋งค ์ •๋ณด -->
	<insert id="buy">
	INSERT INTO SHOP_BUY (
		BUY_CODE
		, MEM_ID
		, BUY_PRICE
	) VALUES (
		#{buyCode}
		, #{memId}
		, #{buyPrice}    <!-- ๊ตฌ๋งคํ•˜๋Š” ๋ชจ๋“  ์ƒํ’ˆ์˜ ์ด ๊ฐ€๊ฒฉ-->
	)
	</insert>

 

 buyCode ์„œ๋ธŒ์ฟผ๋ฆฌ ์ž‘์„ฑ ํ•˜์ง€ ์•Š๊ณ  ๋‹ค์Œ์— ๋“ค์–ด๊ฐˆ ๋ฐ”์ด์ฝ”๋“œ ์…€๋ ‰ํŠธ ์ฟผ๋ฆฌ ์ž‘์„ฑํ•˜์—ฌ ์ด์šฉ.

<!-- ๋‹ค์Œ์— ๋“ค์–ด๊ฐˆ buyCode ์กฐํšŒ -->
<select id="getNextBuyCode" resultMap="buy">
    SELECT 'BUY_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(BUY_CODE, 5))), 0) + 1, 3, '0') 
    FROM SHOP_BUY
</select>

BuyService ์ž‘์„ฑ

//๋‹ค์Œ buyCode ์กฐํšŒ
String getNextBuyCode();

BuyServiceImpl ์ž‘์„ฑ

//๋‹ค์Œ buyCode ์กฐํšŒ
@Override
public String getNextBuyCode() {
    return sqlSession.selectOne("buyMapper.getNextBuyCode");
}

 

๊ตฌ๋งค ์ƒ์„ธ ์ •๋ณด ์ฟผ๋ฆฌ ์ž‘์„ฑ

์ฟผ๋ฆฌ ์ž‘์„ฑ ์‹œ ์ฃผ์˜ํ•  ์ .

ํ•˜๋‚˜์˜ ์ „์ฒด ๊ตฌ๋งค ์ •๋ณด๋Š” ๊ตฌ๋งค ์‹œ ์„ ํƒํ•œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ƒํ’ˆ ๊ตฌ๋งค ์ƒ์„ธ ์ •๋ณด ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์—

private List<BuyDetailVO> buyDetailList; //ํ•˜๋‚˜์˜ ๊ตฌ๋งค์ •๋ณด๋Š” ์—ฌ๋Ÿฌ ๊ตฌ๋งค ์ •๋ณด list๋ฅผ ๊ฐ€์ง

buyVO์— ์œ„์˜ ๋ณ€์ˆ˜ ์ถ”๊ฐ€ํ•ด์ค˜์•ผํ•จ!

<!-- ๊ตฌ๋งค ์ƒ์„ธ ์ •๋ณด  -->
<!-- ํ•œ๋ฒˆ ๊ตฌ๋งคํ•  ๋•Œ ์–ด๋–ค ์ƒํ’ˆ์„ ๋ช‡๊ฐœ ์ƒ€๋ƒ์— ๋”ฐ๋ผ insert ์—ฌ๋Ÿฌ๊ฐœ -->
<insert id="buyDetails">
    INSERT INTO BUY_DETAIL (
        BUY_DETAIL_CODE
        , ITEM_CODE
        , BUY_CNT 		<!-- ํ•˜๋‚˜์˜ ์ƒํ’ˆ์„ ์—ฌ๋Ÿฌ๊ฐœ ์‚ฌ๋Š” ๊ฒฝ์šฐ ๊ฐ ์ƒํ’ˆ์— ๋Œ€ํ•œ ์ˆ˜๋Ÿ‰  -->
        , DETAIL_BUY_PRICE  <!-- ํ•˜๋‚˜์˜ ์ƒํ’ˆ ์—ฌ๋Ÿฌ๊ฐœ ์‚ฌ๋Š” ๊ฒฝ์šฐ ๊ฐ ์ƒํ’ˆ์— ๋Œ€ํ•œ ๊ตฌ๋งค๊ธˆ์•ก -->
        , BUY_CODE
    )         <!--  buyVO(๋นˆ ๊ฐ’ ๋“ค๊ณ ์˜ฌ ๊ฐ์ฒด).getBuyDetailList(); -->
    <foreach collection="buyDetailList" item="buyDetail" separator="UNION ALL" index="i">     
                                             <!-- ์—ฌ๋Ÿฌ๊ฐœ ์ƒํ’ˆ insert ๋˜๋ฉด i๋งŒํผ ๋” + -->
        SELECT (SELECT 'BUY_DETAIL_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(BUY_DETAIL_CODE, 12))), 0) + 1 + #{i}, 3, '0') 
                FROM BUY_DETAIL)
            , #{buyDetail.itemCode}
            , #{buyDetail.buyCnt}
            , #{buyDetail.detailBuyPrice}
            , #{buyDetail.buyCode}
        FROM DUAL

    </foreach>
</insert>

 

 

์ฟผ๋ฆฌ์˜ ๋นˆ ๊ฐ’์„ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด ๋“ค๊ณ ์™€์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋Š”

๊ตฌ๋งคํ•˜๊ณ ์ž ํ•˜๋Š” ์ƒํ’ˆ ์ˆ˜ x 3(itemCode, buyCnt, itemPrice)     /     +1 (totalPrice) 

>> ๊ตฌ๋งค ์ƒํ’ˆ ๋งŽ์œผ๋ฉด ๋ฐ์ดํ„ฐ ์ˆ˜ ๋งŽ์•„์ง.

cartCode๋งŒ ์•Œ๋ฉด itemCode ์•Œ ์ˆ˜ ์žˆ๊ณ  cartCnt ์•Œ ์ˆ˜ ์žˆ์Œ, itemCode ์•Œ๋ฉด itemPrice ์•Œ ์ˆ˜ ์žˆ์Œ.

 

๋งŽ์€ ์ˆ˜์˜ ๋ฐ์ดํ„ฐ ๋„˜๊ธธ ๋•Œ js ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ๋ฒ•.

js๋กœ ๊ฐ€์ ธ์˜ค๋Š” ์ด์œ  : ์„ ํƒ๊ตฌ๋งค ๋ˆŒ๋ €์„ ๋•Œ ์„ ํƒํ•œ ๊ฒƒ ์—†์ด ์„ ํƒ๊ตฌ๋งค ๋ˆ„๋ฅด๋ฉด ๊ตฌ๋งค ์‹คํ–‰ x ์ฐฝ ๋„์–ด์„œ ๊ตฌ๋งคํ•˜๋Š” ์ƒํ’ˆ ์„ ํƒํ•˜๋ผ๋Š” ์•Œ๋ฆผ์ฐฝ ๋œจ๊ฒŒ ๊ตฌํ˜„.

๋งŽ์€ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ๊ฐ€๋ ค๋ฉด formํƒœ๊ทธ ์‚ฌ์šฉ์ด ํŽธ๋ฆฌ. ๊ทธ๋Ÿฌ๋‚˜ ์ˆ˜์ •๋ฒ„ํŠผ์ด ์ด๋ฏธ form ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์ ธ์žˆ์–ด์„œ form ํƒœ๊ทธ ์‚ฌ์šฉ x

(form ํƒœ๊ทธ ์•ˆ์— form ํƒœ๊ทธ ์‚ฌ์šฉ ์•ˆ ๋จ!)

 

js์—์„œ ajax ์‚ฌ์šฉํ•˜์—ฌ  ๋งŽ์€ ์ˆ˜ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ

cart_list.html ์˜ ์„ ํƒ๊ตฌ๋งค ๋ฒ„ํŠผ ํ•จ์ˆ˜ ์—ฐ๊ฒฐ

<div class="offset-5 col-1 d-grid">
    <input type="button" class="btn btn-primary" value="์„ ํƒ๊ตฌ๋งค" onclick="buys();">
</div>

 

js์—์„œ buys ํ•จ์ˆ˜ ์ž‘์„ฑ

 

1. ์•„๋ฌด ์ƒํ’ˆ๋„ ์„ ํƒํ•˜์ง€ ์•Š๊ณ  ์„ ํƒ๊ตฌ๋งค ๋ˆŒ๋ €์„ ๊ฒฝ์šฐ

if๋ฌธ์œผ๋กœ ์ฒดํฌ๋œ ์ƒํ’ˆ ์—†๋Š” ๊ฒฝ์šฐ alert์ฐฝ์œผ๋กœ ์ƒํ’ˆ ์„ ํƒ ๋ฉ”์‹œ์ง€ ๋„์›Œ์ฃผ๊ธฐ

function buys(){
	
	//์ฒดํฌ๋œ ์ฒดํฌ๋ฐ•์Šค์˜ ๊ฐœ์ˆ˜
	const checked_checkboxes = document.querySelectorAll('.chk:checked');
	
	//์ƒํ’ˆ ์ฒดํฌ ํ•˜๋‚˜๋„ ์•ˆ ๋œ ๊ฒฝ์šฐ
	if(checked_checkboxes.length == 0) {
		alert('๊ตฌ๋งคํ•  ์ƒํ’ˆ์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค.');
		return ;
	}
}

 

2. ajax ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋„˜๊ธฐ๊ธฐ

- ๋„˜๊ธธ ๋ฐ์ดํ„ฐ๋Š” ์ƒํ’ˆ ๋‹น itemCode, buyCnt, detailBuyPrice

cart_list.html์˜ for๋ฌธ ๋Œ๋ฉด์„œ ๋งŒ๋“ค์–ด์ง€๋Š” ์ฒดํฌ๋ฐ•์Šค input ํƒœ๊ทธ์— data-์†์„ฑ ๋งŒ๋“ค์–ด์„œ ์œ„ 3๊ฐœ์˜ ๋ฐ์ดํ„ฐ js๋กœ ๋„˜๊ฒจ์ฃผ๊ธฐ.

<td>
    <input type="checkbox" class="form-check-input chk" checked
        onclick="setCheckAllStatus();" th:value="${cart.cartCode}" 
        th:data-item-code="${cart.itemCode}" th:data-buy-cnt="${cart.cartCnt}" th:data-detail-buy-price="${cart.totalPrice}">
</td>

 

js์—์„œ ์ฒดํฌ๋œ ์ƒํ’ˆ๋“ค ๊ฐ๊ฐ์˜ itemCode, buyCnt, detailBuyPrice ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•จ.

์ƒํ’ˆ๋“ค ๊ฐ๊ฐ์˜ ์œ„ 3๊ฐ€์ง€ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ detail_info_arr ๋ฐฐ์—ด ๋ณ€์ˆ˜ ์ƒ์„ฑ

for๋ฌธ ๋Œ๋ฉด์„œ ์ฒดํฌ๋œ ์ƒํ’ˆ๋“ค์˜ itemCode, buyCnt, detailBuyPrice ๋นผ์™€์„œ detail_info_arr ๋ฐฐ์—ด์— ์ €์žฅ.

//๋„˜๊ธธ ๋ฐ์ดํ„ฐ (๊ตฌ๋งค ์ƒ์„ธ ์ •๋ณด insert ์ฟผ๋ฆฌ ๋นˆ๊ฐ’์ž„ ์ปฌ๋Ÿผ๋ช…๊ณผ ๋ฐ์ดํ„ฐ ์ด๋ฆ„ ๋งž์ถฐ์ฃผ๊ธฐ)
//๋ฐ˜๋ณต๋˜๋ฉด์„œ ๋งŒ๋“ค์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋ฐฐ์—ด ์ƒ์„ฑ
const detail_info_arr = [];
//์ƒํ’ˆ ์ฒดํฌ๋œ ๊ฐœ์ˆ˜๋งŒํผ ์•„๋ž˜ ๋ฐ์ดํ„ฐ ํ•„์š” (for๋ฌธ ์‚ฌ์šฉ)
for(let i = 0; i < checked_checkboxes.length ; i++) {
//html์—์„œ data-์†์„ฑ๋ช…์œผ๋กœ ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์ฃผ์˜!!	
    buy_detail_info = {
        'item_code' : checked_checkboxes[i].dataset.itemCode,
        'buy_cnt' : checked_checkboxes[i].dataset.buyCnt,
        'detail_buy_price' : checked_checkboxes[i].dataset.detailBuyPrice 

    };
    detail_info_arr[i] = buy_detail_info;
}
console.log(detail_info_arr);

html์—์„œ ๋„˜๊ธด ๋ฐ์ดํ„ฐ๋“ค์ด detail_info_arr์— ์ €์žฅ๋œ ๊ฒƒ console๋กœ ํ™•์ธ ๊ฐ€๋Šฅ.

 

- ์ฒดํฌ๋œ ๋ชจ๋“  ์ƒํ’ˆ์˜ ์ด ๊ตฌ๋งค ๊ธˆ์•ก finalPrice ๋ฐ›์•„์˜ค๊ธฐ

cart_list.html์˜ ์ด ๊ตฌ๋งค ๊ธˆ์•ก ํƒœ๊ทธ ์„ ํƒํ•˜์—ฌ ํ…์ŠคํŠธ ๋ฐ›์•„์˜ค๊ธฐ.

ํ™”ํ๋‹จ์œ„๊นŒ์ง€ ๊ฐ€์ ธ์˜ด > ์ˆซ์ž๋งŒ ์ถ”์ถœํ•˜๋Š” ์ •๊ทœ์‹ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ๋งค๊ธˆ์•ก final_price์— ์ €์žฅ.

//์ด ๊ตฌ๋งค๊ธˆ์•ก ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
let final_price = document.querySelector('#finalPriceDiv').textContent; //ํ™”ํ๋‹จ์œ„๊นŒ์ง€ ๋‹ค ๊ฐ€์ง€๊ณ  ์˜ด
//์ˆซ์ž๋งŒ ์ถ”์ถœํ•˜๋Š” ์ •๊ทœ์‹
const regex = /[^0-9]/g;
            //0~9๊นŒ์ง€์˜ ์ˆซ์ž๋Š” ์ถ”์ถœํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋นˆ๊ฐ’์œผ๋กœ ๋Œ€์ฒด
final_price = final_price.replace(regex, '');

data = {
    'final_price' : final_price,
    'detail_info_arr' : detail_info_arr //๊ตฌ๋งคํ•˜๋Š” ๋ชจ๋“  ์ƒํ’ˆ์˜ ์ •๋ณด ๋ฐฐ์—ด
};

console.log(data);

๊ตฌ๋งค์ด๊ธˆ์•ก๋„ ์ž˜ ๋ฐ›์•„์˜ด.

 

ajax ๊ฒฝ๋กœ ๋ฐ ๋„˜๊ธธ ๋ฐ์ดํ„ฐ ์ž‘์„ฑํ•˜์—ฌ controller ์ด๋™

ajax ์ž‘์„ฑ์‹œ json ๋ฐฉ์‹ ์‚ฌ์šฉํ•  ์ฃผ์˜์ .

contentType : 'application/json; charset=UTF-8' ์ฝ”๋“œ ์ถ”๊ฐ€

๋„˜๊ธธ ๋ฐ์ดํ„ฐ ์ž‘์„ฑ ์‹œ JSON.stringify(๋„˜๊ธธ๋ฐ์ดํ„ฐ) ์‚ฌ์šฉํ•˜์—ฌ json ๋ฌธ์ž์—ด ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ controller๋กœ ๋ณด๋‚ผ ๊ฒƒ!

//ajax start
	$.ajax({
		url: '/buy/buysAjax', //์š”์ฒญ๊ฒฝ๋กœ
		type: 'post',
		async : true, //default 
		data: JSON.stringify(data), //ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ
		contentType : 'application/json; charset=UTF-8', //json ๋ฐฉ์‹
		//contentType: "application/x-www-form-urlencoded; charset=UTF-8", //default ๋ฐฉ์‹
		success: function(result) {
			alert('ajax ํ†ต์‹  ์„ฑ๊ณต');
		},
		error: function() {
			alert('์‹คํŒจ');
		}
	});
//ajax end

์„ ํƒ ๊ตฌ๋งค ์ „์ฒด ํ•จ์ˆ˜ ์ฝ”๋“œ

//์„ ํƒ ๊ตฌ๋งค
function buys(){
	
	//์ฒดํฌ๋œ ์ฒดํฌ๋ฐ•์Šค์˜ ๊ฐœ์ˆ˜
	const checked_checkboxes = document.querySelectorAll('.chk:checked');
	
	//์ƒํ’ˆ ์ฒดํฌ ํ•˜๋‚˜๋„ ์•ˆ ๋œ ๊ฒฝ์šฐ
	if(checked_checkboxes.length == 0) {
		alert('๊ตฌ๋งคํ•  ์ƒํ’ˆ์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค.');
		return ;
	}
	
	//์ฒดํฌ๋œ ์ฒดํฌ๋ฐ•์Šค์˜ datasetํ™•์ธ
	for(const e of checked_checkboxes){
		console.log(e.dataset);
		
	}
	
	//๋„˜๊ธธ ๋ฐ์ดํ„ฐ (๊ตฌ๋งค ์ƒ์„ธ ์ •๋ณด insert ์ฟผ๋ฆฌ ๋นˆ๊ฐ’์ž„ ์ปฌ๋Ÿผ๋ช…๊ณผ ๋ฐ์ดํ„ฐ ์ด๋ฆ„ ๋งž์ถฐ์ฃผ๊ธฐ)
	//๋ฐ˜๋ณต๋˜๋ฉด์„œ ๋งŒ๋“ค์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋ฐฐ์—ด ์ƒ์„ฑ
	const detail_info_arr = [];
	//์ƒํ’ˆ ์ฒดํฌ๋œ ๊ฐœ์ˆ˜๋งŒํผ ์•„๋ž˜ ๋ฐ์ดํ„ฐ ํ•„์š” (for๋ฌธ ์‚ฌ์šฉ)
	for(let i = 0; i < checked_checkboxes.length ; i++) {
	//html์—์„œ data-์†์„ฑ๋ช…์œผ๋กœ ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์ฃผ์˜!!	
		buy_detail_info = {
			'item_code' : checked_checkboxes[i].dataset.itemCode,
			'buy_cnt' : checked_checkboxes[i].dataset.buyCnt,
			'detail_buy_price' : checked_checkboxes[i].dataset.detailBuyPrice 
			
		};
		detail_info_arr[i] = buy_detail_info;
	}
	console.log(detail_info_arr);
	
	//์ด ๊ตฌ๋งค๊ธˆ์•ก ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
	let final_price = document.querySelector('#finalPriceDiv').textContent; //ํ™”ํ๋‹จ์œ„๊นŒ์ง€ ๋‹ค ๊ฐ€์ง€๊ณ  ์˜ด
	//์ˆซ์ž๋งŒ ์ถ”์ถœํ•˜๋Š” ์ •๊ทœ์‹
	const regex = /[^0-9]/g;
				//0~9๊นŒ์ง€์˜ ์ˆซ์ž๋Š” ์ถ”์ถœํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋นˆ๊ฐ’์œผ๋กœ ๋Œ€์ฒด
	final_price = final_price.replace(regex, '');
	
	data = {
		'final_price' : final_price,
		'detail_info_arr' : detail_info_arr //๊ตฌ๋งคํ•˜๋Š” ๋ชจ๋“  ์ƒํ’ˆ์˜ ์ •๋ณด ๋ฐฐ์—ด
	};
	console.log(data);
	
	//ajax start
	$.ajax({
		url: '/buy/buysAjax', //์š”์ฒญ๊ฒฝ๋กœ
		type: 'post',
		async : true, //default 
		data: JSON.stringify(data), //ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ
		contentType : 'application/json; charset=UTF-8', //json ๋ฐฉ์‹
		//contentType: "application/x-www-form-urlencoded; charset=UTF-8", //default ๋ฐฉ์‹
		success: function(result) {
			alert('ajax ํ†ต์‹  ์„ฑ๊ณต');
		},
		error: function() {
			alert('์‹คํŒจ');
		}
	});
//ajax end 

}

 

BuyController ์ž‘์„ฑ

js์—์„œ json ๋ฐฉ์‹์œผ๋กœ ๋„˜์–ด์˜จ ๋ฐ์ดํ„ฐ map์œผ๋กœ ๋ฐ›์•„์คŒ. (VO ์ƒ์„ฑํ•˜์—ฌ ๋ฐ›๋Š” ๋ฐฉ๋ฒ•๋„ ๊ฐ€๋Šฅ)

json์œผ๋กœ ๋„˜์–ด์˜จ ๋ฐ์ดํ„ฐ ๋ฐ›์„ ๋•Œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜ ๋งจ ์•ž์— @RequestBody ์ถ”๊ฐ€

@Controller
@RequestMapping("/buy")
public class BuyController {
	
	@ResponseBody
	@PostMapping("/buysAjax")	//์—ฌ๋Ÿฌ ์ž๋ฃŒํ˜• ๋ฐ์ดํ„ฐ ๋„˜์–ด์˜ค๋ฉด > object๋กœ ๋ฐ›๊ธฐ
	public void byusAjax(@RequestBody HashMap<String, Object> mapData) {
		System.out.println(mapData);
	}

 

์ถœ๋ ฅ๋ฌธ์œผ๋กœ ๋ฐ์ดํ„ฐ ์ž˜ ๋„˜์–ด์˜ค๋Š” ๊ฒƒ ํ™•์ธ ๊ฐ€๋Šฅ

๋ฐ์ดํ„ฐ๊ฐ€ ์ž˜ ๋„˜์–ด์˜ค๋ฉด ๋„˜์–ด์˜จ ๋ฐ์ดํ„ฐ๋กœ ์„ ํƒ ๊ตฌ๋งค insert ์ฟผ๋ฆฌ ๋นˆ ๊ฐ’ ์ฑ„์›Œ์ค€ ํ›„ ์ฟผ๋ฆฌ ์ž‘๋™๋ผ์•ผ ํ•จ.

 

์„ ํƒ ๊ตฌ๋งค ์‹œ ๊ฐ™์ด ์ž‘๋™๋˜์–ด์•ผ ํ•  ๊ธฐ๋Šฅ

1. ์ „์ฒด ๊ตฌ๋งค ์ •๋ณด insert ์ฟผ๋ฆฌ

2. ๊ทธ ๊ตฌ๋งค ์ •๋ณด์˜ ์ƒ์„ธ ๊ตฌ๋งค ์ •๋ณด insert ์ฟผ๋ฆฌ

 > 2๊ฐœ์˜ ๊ตฌ๋งค insert ์ฟผ๋ฆฌ๋Š” ํŠธ๋žœ์žญ์…˜์œผ๋กœ ํ•˜๋‚˜๋กœ ๋ฌถ์–ด์•ผ ํ•จ.

3. ๊ตฌ๋งค ํ›„ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์—์„œ ์„ ํƒ ๊ตฌ๋งคํ•œ ์ƒํ’ˆ๋“ค delete ์ฟผ๋ฆฌ ๊ฐ™์ด ์ž‘๋™

 

BuyService ์ž‘์„ฑ - ์„ ํƒ ๊ตฌ๋งค insert

//์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒํ’ˆ ์„ ํƒ ๊ตฌ๋งค
void buyFromCart(BuyVO buyVO);

BuyServiceImpl ์ž‘์„ฑ

2๊ฐœ์˜ ๊ตฌ๋งค insert ์ฟผ๋ฆฌ ๊ฐ™์ด ์‹คํ–‰.

//์žฅ๋ฐ”๊ตฌ๋‹ˆ ์„ ํƒ ๊ตฌ๋งค (๊ตฌ๋งค insert ๋ฉ”์†Œ๋“œ 2๊ฐœ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ)
@Override      //@Transactional : 2๊ฐœ์˜ ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ๋ผ์•ผ commit
@Transactional(rollbackFor = Exception.class)
public void buyFromCart(BuyVO buyVO) {
    sqlSession.insert("buyMapper.buy", buyVO);
    sqlSession.insert("buyMapper.buyDetails", buyVO);

}

 

BuyController ์ž‘์„ฑ

๋จผ์ €, ์ „์ฒด ๊ตฌ๋งค ์ •๋ณด ์ฟผ๋ฆฌ ๋นˆ๊ฐ’์„ ์ฑ„์›Œ์ฃผ๊ธฐ

์„ ํƒ ์ƒํ’ˆ ๊ตฌ๋งค ๋ฉ”์†Œ๋“œ์— buyVO ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋„ฃ๊ณ  ๋นˆ ๊ฐ’ ์ฑ„์›Œ์ค„ ๋ฐ์ดํ„ฐ ์„ธํŒ….

1. buyCode ์„ธํŒ…

buyCode๋Š” ์…€๋ ‰ํŠธ ์ฟผ๋ฆฌ๋กœ ์ฑ„์›Œ์ง€๊ฒŒ ๋งŒ๋“ค์–ด์ง.

getNextBuyCode() ์‹คํ–‰.

 

2.memId

๋งค๊ฐœ๋ณ€์ˆ˜์— HttpSession session ์ถ”๊ฐ€ํ•˜์—ฌ session์—์„œ ๋กœ๊ทธ์ธ ์ •๋ณด ๊ฐ€์ ธ์˜ด.

๋กœ๊ทธ์ธ ์ •๋ณด์—์„œ memId ๋ฐ์ดํ„ฐ ๋นผ๊ธฐ.

 

3.buyPrice

buyPrice๋Š” cart_list.html์—์„œ ์„ ํƒ ๊ตฌ๋งค ๋ˆŒ๋ €์„ ๋•Œ final_price๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ์ด๊ตฌ๋งค๊ธˆ์•ก ๋ฐ์ดํ„ฐ js๋กœ ๊ฐ€์ ธ์˜ด.

js์—์„œ ๋ฐ›์€ mapDate์—์„œ final_price ๋ฐ์ดํ„ฐ ๋นผ๊ธฐ.

js์—์„œ ์„ค์ •ํ•œ ๋ฐ์ดํ„ฐ ์ด๋ฆ„์ด key๊ฐ€ ๋จ.

key ํ™œ์šฉํ•˜์—ฌ mapData.get("final_price") ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋บŒ.

mapData๋Š” ์ž๋ฃŒํ˜•์ด object์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ”๋กœ int๋กœ ๋ชป ๋ฐ›์Œ > ์ž๋ฃŒํ˜• ๋ณ€ํ™˜

mapData๋ฅผ toString ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พธ๊ณ  ๊ทธ ์ „์ฒด๋ฅผ Integer.parseInt ์‚ฌ์šฉํ•˜์—ฌ int๋กœ ์ž๋ฃŒํ˜• ๋ณ€ํ™˜

 

๋ฝ‘์€ 3๊ฐœ์˜ ๋ฐ์ดํ„ฐ buyVO์— ์„ธํŒ….

ํ˜„์žฌ๊นŒ์ง€ ์ฒซ๋ฒˆ์งธ ๊ตฌ๋งค ์ฟผ๋ฆฌ ๋นˆ ๊ฐ’ ์ฑ„์›Œ์คŒ.

//์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ฒดํฌ๋œ ์ƒํ’ˆ ๋ฐ์ดํ„ฐ ๋“ค๊ณ ์˜ค๊ธฐ(itemCode, detailBuyPrice, buyCnt)
	@ResponseBody
	@PostMapping("/buysAjax")						//์—ฌ๋Ÿฌ ์ž๋ฃŒํ˜• ๋ฐ์ดํ„ฐ > object๋กœ ๋ฐ›๊ธฐ
	public void buysAjax(@RequestBody HashMap<String, Object> mapData, BuyVO buyVO, HttpSession session) {
		System.out.println(mapData);
		
		//SHOP_BUY ํ…Œ์ด๋ธ” INSERT๋ฅผ ์œ„ํ•œ ์ฟผ๋ฆฌ ๋นˆ ๊ฐ’ ์„ธํŒ…
		//buyCode
		String nextBuyCode = buyService.getNextBuyCode();
		//memId
		MemberVO loginInfo = (MemberVO)session.getAttribute("loginInfo");
		String memId = loginInfo.getMemId();
		//buyPrice
		int buyPrice = Integer.parseInt(mapData.get("final_price").toString());
		
		buyVO.setBuyCode(nextBuyCode);
		buyVO.setMemId(memId);
		buyVO.setBuyPrice(buyPrice);
	}

 

๋‘๋ฒˆ์งธ ๊ตฌ๋งค ์ฟผ๋ฆฌ์ธ ๊ตฌ๋งค ์ƒ์„ธ ์ •๋ณด ์ฟผ๋ฆฌ ๋นˆ ๊ฐ’ ์ฑ„์›Œ์ฃผ๊ธฐ.

Controller์—์„œ map ๋ฐ์ดํ„ฐ ๋ฝ‘์•„์„œ ๋นˆ ๊ฐ’ ์ฑ„์›Œ์คŒ 

1. map ๋ฐ์ดํ„ฐ ํ™œ์šฉ์„ ์œ„ํ•ด ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ด์ค˜์•ผ ํ•จ.

์˜ˆ๋ฅผ ๋“ค์–ด ๊ตฌ๋งคํ•œ ์ƒํ’ˆ ์ข…๋ฅ˜ 3๊ฐœ >  buyDetailVO๋ฅผ 3๊ฐœ ๊ฐ€์ง„ ๋ฐฐ์—ด์ด ๋งŒ๋“ค์–ด์ ธ์•ผ ํ•จ.

์ฆ‰, ๊ตฌ๋งคํ•œ ์ƒํ’ˆ ์ข…๋ฅ˜ ๊ฐœ์ˆ˜ ๋งŒํผ buyDetailVO๊ฐ€ ์ƒ๊น€.

๋ฐฐ์—ด๋กœ ๋ฐ›์€ ๋ฐ์ดํ„ฐ ๋ฆฌ์ŠคํŠธ๋กœ ๋ณ€ํ™˜.

ํ˜„์žฌ buyCode ๋นผ๊ณ  ์ฟผ๋ฆฌ ๋นˆ ๊ฐ’ ์ฑ„์šธ ๋‹ค ๋ฐ์ดํ„ฐ ๋“ค์–ด์˜จ ์ƒํƒœ.

 

**json ๋ฐฉ์‹์œผ๋กœ ๋“ค๊ณ ์˜จ ๋ฐ์ดํ„ฐ ๋ฐ›์„ ๋•Œ ์ฃผ์˜

json ๋ฐฉ์‹์œผ๋กœ ๋“ค๊ณ ์˜จ map ๋ฐ์ดํ„ฐ๋Š” js์—์„œ ์„ค์ •ํ•œ ๋ฐ์ดํ„ฐ ์ด๋ฆ„๊ณผ VO์˜ ๋ณ€์ˆ˜ ์ด๋ฆ„์ด mapping ๋˜์–ด์•ผ ํ•จ.

ํ‚ค ๊ฐ’์œผ๋กœ ๋“ค๊ณ ์˜จ ์ด๋ฆ„์€ ์Šค๋„ค์ดํฌํ˜•์‹์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ๊ณ  VO ๋ณ€์ˆ˜๋ช…์€ ์นด๋ฉœํ˜•์œผ๋กœ ์ž‘์„ฑ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์นญ์„ ์œ„ํ•ด @JsonProperty ์‚ฌ์šฉํ•˜์—ฌ mapping ํ•ด์ฃผ๊ธฐ.

@Getter
@Setter
@ToString
public class BuyDetailVO {
	
	private String buyDetailCode;
	
	@JsonProperty("item_code")
	private String itemCode;
	
	@JsonProperty("buy_cnt")
	private int buyCnt;
	
	@JsonProperty("detail_buy_price")
	private int detailBuyPrice;
	
	private String buyCode;

}

 

2. buyCode ์„ธํŒ…

์„ ํƒ ๊ตฌ๋งคํ•œ ์ƒํ’ˆ ๋ชจ๋‘ ๊ฐ™์€ buyCode๊ฐ€ ๋“ค์–ด๊ฐ€์•ผ ๋จ.

for๋ฌธ ์‚ฌ์šฉํ•˜์—ฌ ์„ ํƒํ•œ ์ƒํ’ˆ์— buyCode ๋ฐ์ดํ„ฐ ์„ธํŒ…

 

์ƒํ’ˆ์ƒ์„ธ๊ตฌ๋งค์ •๋ณด๋“ค์€ ํ•˜๋‚˜์˜ ์ „์ฒด ๊ตฌ๋งค ์ •๋ณด์— ํฌํ•จ๋จ.

์ƒ์„ธ๊ตฌ๋งค์ •๋ณด ๋ชจ๋‘ ๋“ค๊ณ  ์žˆ๋Š” buyDetailList๋ฅผ buyVO์˜ buyDetailList์— ๋ฐ์ดํ„ฐ ์„ธํŒ….

buyVO๋Š” ๋ชจ๋“  ๊ตฌ๋งค ์ •๋ณด์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ๋‹ค ๊ฐ€์ง€๊ฒŒ ๋จ.

๊ตฌ๋งค ๋ฉ”์†Œ๋“œ ์‹คํ–‰ ํ•˜๋ฉด ๊ตฌ๋งค ๊ธฐ๋Šฅ ๊ตฌํ˜„ ๋จ.

//์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ฒดํฌ๋œ ์ƒํ’ˆ ๋ฐ์ดํ„ฐ ๋“ค๊ณ ์˜ค๊ธฐ(itemCode, detailBuyPrice, buyCnt)
@ResponseBody
@PostMapping("/buysAjax")						//์—ฌ๋Ÿฌ ์ž๋ฃŒํ˜• ๋ฐ์ดํ„ฐ > object๋กœ ๋ฐ›๊ธฐ
public void buysAjax(@RequestBody HashMap<String, Object> mapData, BuyVO buyVO, HttpSession session) {
    System.out.println(mapData);

    //SHOP_BUY ํ…Œ์ด๋ธ” INSERT๋ฅผ ์œ„ํ•œ ์ฟผ๋ฆฌ ๋นˆ ๊ฐ’ ์„ธํŒ…
    //buyCode
    String nextBuyCode = buyService.getNextBuyCode();
    //memId
    MemberVO loginInfo = (MemberVO)session.getAttribute("loginInfo");
    String memId = loginInfo.getMemId();
    //buyPrice
    int buyPrice = Integer.parseInt(mapData.get("final_price").toString());

    buyVO.setBuyCode(nextBuyCode);
    buyVO.setMemId(memId);
    buyVO.setBuyPrice(buyPrice);

    //BUY_DETAIL ํ…Œ์ด๋ธ” INSERT๋ฅผ ์œ„ํ•œ ์ฟผ๋ฆฌ ๋นˆ ๊ฐ’ ์„ธํŒ…
    //์ƒ์„ธ ๊ตฌ๋งค ์‹œ ํ•„์š”ํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ด์„ ๋ฆฌ์ŠคํŠธ ๊ฐ์ฒด
    //List<BuyDetailVO> buyDetailList = new ArrayList<>();

    //1. ๋งต์—์„œ ๋“ค๊ณ ์˜จ ๋ฐ์ดํ„ฐ ์ž๋ฐ” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜
    ObjectMapper mapper = new ObjectMapper();
                        //์ฝ์–ด์˜ฌ ๋ฐ์ดํ„ฐ, ๋ฐ์ดํ„ฐ ๋นผ์„œ ๋‹ด์„ ๊ณณ(์„ ํƒํ•œ ์ƒํ’ˆ ์ข…๋ฅ˜๋งŒํผ buyDetailVO๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฐ์—ด๋กœ ๋ฐ›์•„์•ผ ํ•จ)
    BuyDetailVO[] buyDetailArr = mapper.convertValue(mapData.get("detail_info_arr"), BuyDetailVO[].class);
    //๋ฐฐ์—ด > ๋ฆฌ์ŠคํŠธ ๋ณ€ํ™˜
    List<BuyDetailVO> buyDetailList = Arrays.asList(buyDetailArr);

    //buyCode ๋ฐ์ดํ„ฐ ์„ธํŒ…. (์„ ํƒ ๊ตฌ๋งคํ•œ ์ƒํ’ˆ ๋ชจ๋‘ ๊ฐ™์€ buyCode๊ฐ€ ๋“ค์–ด๊ฐ€์•ผ ๋จ) for๋ฌธ ๋Œ๋ฉด์„œ ์œ„์˜ ๋ฏธ๋ฆฌ ์„ธํŒ…๋œ buyCode๊ฐ’ ์„ธํŒ….
    for(BuyDetailVO e : buyDetailList) {
        e.setBuyCode(nextBuyCode);
    }

    //2. buyDetailList์— ์ƒ์„ธ ๊ตฌ๋งค ์ฟผ๋ฆฌ ๋นˆ ๊ฐ’ ๋ชจ๋‘ ์žˆ๋Š” ์ƒํƒœ ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ buyVO์˜ buyDetailList์— ๊ทธ๋Œ€๋กœ ์„ธํŒ…
    //buyVO๋Š” ๊ตฌ๋งค์— ๋Œ€ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ๊ฐ–๊ฒŒ ๋จ.
    buyVO.setBuyDetailList(buyDetailList);

    System.out.println("buyVO :" + buyVO);


    //์ƒํ’ˆ ๊ตฌ๋งค
    buyService.buyFromCart(buyVO);

}

 

๋งˆ์ง€๋ง‰์œผ๋กœ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์—์„œ ์ƒํ’ˆ์„ ๊ตฌ๋งค๋ฅผ ํ•˜๋ฉด ๊ตฌ๋งคํ•œ ์ƒํ’ˆ์ด ์žฅ๋ฐ”๊ตฌ๋‹ˆ์—์„œ ์‚ฌ๋ผ์ ธ์•ผ ํ•จ.

controller์—์„œ ๊ตฌ๋งค ๋ฉ”์†Œ๋“œ ๋‹ค ์‹คํ–‰๋˜๋ฉด js์˜ buy ํ•จ์ˆ˜์˜ success ์ฝ”๋“œ๋กœ ๋Œ์•„๊ฐ€๊ฒŒ ๋จ.

์ด๋•Œ, js๋กœ ๋Œ์•„์™€์„œ ์ด์ „์— ๋งŒ๋“ค์–ด ๋‘” ์„ ํƒ์‚ญ์ œํ•จ์ˆ˜ ํ˜ธ์ถœ.

//์„ ํƒ ๊ตฌ๋งค
function buys(){
	
	//์ฒดํฌ๋œ ์ฒดํฌ๋ฐ•์Šค์˜ ๊ฐœ์ˆ˜
	const checked_checkboxes = document.querySelectorAll('.chk:checked');
	
	//์ƒํ’ˆ ์ฒดํฌ ํ•˜๋‚˜๋„ ์•ˆ ๋œ ๊ฒฝ์šฐ
	if(checked_checkboxes.length == 0) {
		alert('๊ตฌ๋งคํ•  ์ƒํ’ˆ์„ ์„ ํƒํ•˜์‹ญ์‹œ์˜ค.');
		return ;
	}
	
	//์ฒดํฌ๋œ ์ฒดํฌ๋ฐ•์Šค์˜ datasetํ™•์ธ
	for(const e of checked_checkboxes){
		console.log(e.dataset);
		
	}
	
	//๋„˜๊ธธ ๋ฐ์ดํ„ฐ (๊ตฌ๋งค ์ƒ์„ธ ์ •๋ณด insert ์ฟผ๋ฆฌ ๋นˆ๊ฐ’์ž„ ์ปฌ๋Ÿผ๋ช…๊ณผ ๋ฐ์ดํ„ฐ ์ด๋ฆ„ ๋งž์ถฐ์ฃผ๊ธฐ)
	//๋ฐ˜๋ณต๋˜๋ฉด์„œ ๋งŒ๋“ค์–ด์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ๋ฐฐ์—ด ์ƒ์„ฑ
	const detail_info_arr = [];
	//์ƒํ’ˆ ์ฒดํฌ๋œ ๊ฐœ์ˆ˜๋งŒํผ ์•„๋ž˜ ๋ฐ์ดํ„ฐ ํ•„์š” (for๋ฌธ ์‚ฌ์šฉ)
	for(let i = 0; i < checked_checkboxes.length ; i++) {
	//html์—์„œ data-์†์„ฑ๋ช…์œผ๋กœ ๋ณด๋‚ธ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ฌ ๋•Œ ์ฃผ์˜!!	
		buy_detail_info = {
			'item_code' : checked_checkboxes[i].dataset.itemCode,
			'buy_cnt' : checked_checkboxes[i].dataset.buyCnt,
			'detail_buy_price' : checked_checkboxes[i].dataset.detailBuyPrice 
			
		};
		detail_info_arr[i] = buy_detail_info;
	}
	console.log(detail_info_arr);
	
	//์ด ๊ตฌ๋งค๊ธˆ์•ก ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ
	let final_price = document.querySelector('#finalPriceDiv').textContent; //ํ™”ํ๋‹จ์œ„๊นŒ์ง€ ๋‹ค ๊ฐ€์ง€๊ณ  ์˜ด
	//์ˆซ์ž๋งŒ ์ถ”์ถœํ•˜๋Š” ์ •๊ทœ์‹
	const regex = /[^0-9]/g;
				//0~9๊นŒ์ง€์˜ ์ˆซ์ž๋Š” ์ถ”์ถœํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ๋นˆ๊ฐ’์œผ๋กœ ๋Œ€์ฒด
	final_price = final_price.replace(regex, '');
	
	data = {
		'final_price' : final_price,
		'detail_info_arr' : detail_info_arr //๊ตฌ๋งคํ•˜๋Š” ๋ชจ๋“  ์ƒํ’ˆ์˜ ์ •๋ณด ๋ฐฐ์—ด
	};
	
	console.log(data);
	
	
	
	//ajax start
	$.ajax({
		url: '/buy/buysAjax', //์š”์ฒญ๊ฒฝ๋กœ
		type: 'post',
		async : true, //default 
		data: JSON.stringify(data), //ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ
		contentType : 'application/json; charset=UTF-8', //json ๋ฐฉ์‹
		//contentType: "application/x-www-form-urlencoded; charset=UTF-8", //default ๋ฐฉ์‹
		success: function(result) {
			
			//๊ตฌ๋งค ํ›„ ์„ ํƒํ•œ ์ƒํ’ˆ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์—์„œ ์‚ญ์ œ ๊ธฐ๋Šฅ = ์„ ํƒ ์‚ญ์ œ์™€ ๊ธฐ๋Šฅ ๋™์ผ
			//controller์—์„œ ์ƒํ’ˆ ๊ตฌ๋งค ํ›„ ๋Œ์•„์™€์„œ ์„ ํƒ์‚ญ์ œํ•จ์ˆ˜ ํ˜ธ์ถœ
			deleteCheckCarts();
		},
		error: function() {
			alert('์‹คํŒจ');
		}
	});
//ajax end 

}