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);
- ์ฒดํฌ๋ ๋ชจ๋ ์ํ์ ์ด ๊ตฌ๋งค ๊ธ์ก 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
}
'Spring' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ผํ๋ชฐ ํ๋ก์ ํธ(12) ํ์ MY PAGE - ๊ตฌ๋งค ๋ด์ญ (2) ๊ฒ์ ๊ธฐ๋ฅ (0) | 2023.04.12 |
---|---|
์ผํ๋ชฐ ํ๋ก์ ํธ(12) ํ์ MY PAGE - ๊ตฌ๋งค ๋ด์ญ (0) | 2023.04.11 |
์ผํ๋ชฐ ํ๋ก์ ํธ(11) ํ์ MY PAGE - ์ฅ๋ฐ๊ตฌ๋ ๋ชฉ๋ก (2) (0) | 2023.04.07 |
json ๋ฐ์ดํฐ java๋ก ๋ณด๋ด๊ธฐ (0) | 2023.04.07 |
์ผํ๋ชฐ ํ๋ก์ ํธ(11) ํ์ MY PAGE - ์ฅ๋ฐ๊ตฌ๋ ๋ชฉ๋ก (0) | 2023.04.05 |