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

2023. 4. 7. 21:35ใ†Spring

์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒํ’ˆ ๋“ฑ๋ก ์‹œ ์ค‘๋ณต ์ƒํ’ˆ ์ˆ˜๋Ÿ‰ ์ฆ๊ฐ€, ์ƒํ’ˆ ์—†์œผ๋ฉด ํ•ด๋‹น ์ƒํ’ˆ ๋“ฑ๋ก.

์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒํ’ˆ ๋“ฑ๋ก ์ฟผ๋ฆฌ ์ˆ˜์ •

MERGE INTO ์ด์šฉ

 

์–ด๋–ค ํšŒ์›์˜ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ํ•ด๋‹น ์ƒํ’ˆ์ด ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ํ™•์ธ

WHEN MATCHED THEN

ํ•ด๋‹น ์ƒํ’ˆ์˜ itemCode๊ฐ€ ํ˜„์žฌ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์žˆ๋Š” itemCode์™€ ์ผ์น˜

๋กœ๊ทธ์ธ๋œ ํšŒ์›์˜ memId์™€ ํ•ด๋‹น ์ƒํ’ˆ์ด ๋‹ด๊ธด ํšŒ์›์˜ memId๊ฐ€ ์ผ์น˜

>>  UPDATE ์ฟผ๋ฆฌ ์‹คํ–‰ํ•˜์—ฌ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์žˆ๋Š” cartCnt ์ฆ๊ฐ€

 

WHEN NOT MATCHED THEN

์œ„ ๋‘๊ฐ€์ง€ ์กฐ๊ฑด์ด ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ

>>ํ•ด๋‹น ์ƒํ’ˆ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— INSERT ์ฟผ๋ฆฌ ์‹คํ–‰ํ•˜์—ฌ ๋‹ด๊ธฐ.

 

์ตœ์ข… ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒํ’ˆ ๋“ฑ๋ก ์ฟผ๋ฆฌ

๊ธฐ์กด์˜ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋“ฑ๋ก ์ฟผ๋ฆฌ ์ค‘ INSERT INTO SHOP_CART์—์„œ INTO SHOP_CART๋Š” ์ง€์›Œ์ค˜์•ผ ํ•จ.

<!-- ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋“ฑ๋ก -->
<insert id="regCart">
    MERGE INTO SHOP_CART
    USING DUAL
    ON (ITEM_CODE = #{itemCode} AND MEM_ID = #{memId})
    WHEN MATCHED THEN
        UPDATE
        SET
        CART_CNT = CART_CNT + #{cartCnt}
        WHERE ITEM_CODE = #{itemCode}
        AND MEM_ID = #{memId}
    WHEN NOT MATCHED THEN
        INSERT (
            CART_CODE
            , ITEM_CODE
            , MEM_ID
            , CART_CNT
        ) VALUES(
            (SELECT 'CART_'||LPAD(NVL(MAX(TO_NUMBER(SUBSTR(CART_CODE, 6))), 0) + 1, 3, '0') 
             FROM SHOP_CART)
            , #{itemCode}
            , #{memId}
            , #{cartCnt}
        )
</insert>

 

 

์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒํ’ˆ ์ˆ˜๋Ÿ‰ ๋ณ€๊ฒฝ ๊ธฐ๋Šฅ

 

์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒํ’ˆ ์ˆ˜๋Ÿ‰ ์ˆ˜์ • ์ฟผ๋ฆฌ ์ž‘์„ฑ

์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ธด ํ•ด๋‹น ์ƒํ’ˆ์„ ์ˆ˜๋Ÿ‰ ๋ณ€๊ฒฝํ•˜์—ฌ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— cartCode ํ•„์š”

<!-- ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ˆ˜๋Ÿ‰ ์ˆ˜์ •-->
<update id="updateCartCnt">
    UPDATE SHOP_CART
    SET 
        CART_CNT = #{cartCnt}
    WHERE CART_CODE = #{cartCode}
</update>

CartService ๋ฉ”์†Œ๋“œ ์ž‘์„ฑ

//์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ˆ˜๋Ÿ‰ ์ˆ˜์ • ๋ฒ„ํŠผ ํด๋ฆญ
void updateCartCnt(CartVO cartVO);

CartServiceImpl  ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„

//์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ˆ˜๋Ÿ‰ ์ˆ˜์ • ๋ฒ„ํŠผ
@Override
public void updateCartCnt(CartVO cartVO) {
    sqlSession.update("cartMapper.updateCartCnt", cartVO);
}

cart_list.html์—์„œ for๋ฌธ ๋Œ๋ฉด์„œ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ชฉ๋ก ๋ฟŒ๋ ค์ฃผ๋Š” ์˜์—ญ์„ form ํƒœ๊ทธ๋กœ ๊ฐ์‹ธ์คŒ.

> ๋ณ€๊ฒฝ๋œ ์ˆ˜๋Ÿ‰ ๋ฐ์ดํ„ฐ ๋ฐ›์•„๊ฐ€๊ธฐ ์œ„ํ•จ.

form ํƒœ๊ทธ ์†์„ฑ ์ž‘์„ฑ

๋ฐ์ดํ„ฐ ๋ฐ›์•„๊ฐ€๊ธฐ ์œ„ํ•ด ์ˆ˜์ • ๋ฒ„ํŠผ์€ submit์œผ๋กœ!

์ˆ˜๋Ÿ‰ ๋ณ€๊ฒฝํ•œ ํ•ด๋‹น ์ƒํ’ˆ์˜ ์ˆ˜๋Ÿ‰์ด ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•จ.

> cartCode๋ฅผ input hidden ์†์„ฑ์œผ๋กœ ๋ฐ์ดํ„ฐ ๋„˜๊ฒจ์„œ ์ฟผ๋ฆฌ ๋นˆ ๊ฐ’์„ ์ฑ„์›Œ์คŒ.

<form th:action="@{/cart/updateCartCnt}" method="post">
    <input type="hidden" name="cartCode" th:value="${cart.cartCode}">
    <td>
        <div class="row">
            <div class="col-7">
                <input name="cartCnt" type="number" class="form-control" min="1" th:value="${cart.cartCnt}">
            </div>
            <div class="col-5 d-grid">
                <input type="submit" class="btn btn-secondary" value="์ˆ˜์ •">
            </div>
        </div>
    </td>
</form>

 

CartController ์ž‘์„ฑ

//์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ˆ˜๋Ÿ‰ ์ˆ˜์ •
@PostMapping("/updateCartCnt")
public String updateCartCnt(CartVO cartVO) {

    cartService.updateCartCnt(cartVO);

    return "redirect:/cart/cartList";
}

 

 

์žฅ๋ฐ”๊ตฌ๋‹ˆ ์‚ญ์ œ ๋ฒ„ํŠผ ๊ธฐ๋Šฅ ๊ตฌํ˜„

ํ•ด๋‹น ์ƒํ’ˆ์˜ ์‚ญ์ œ ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ์ƒํ’ˆ ์‚ญ์ œ

cart_list.html์˜ ์‚ญ์ œ ๋ฒ„ํŠผ์— th:onclick ์†์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ js์˜ ์‚ญ์ œ ํ•จ์ˆ˜๋กœ ์ด๋™

ํ•ด๋‹น ์ƒํ’ˆ์„ ์‚ญ์ œํ•˜์—ฌ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ cartCode ๋„˜๊ฒจ์ฃผ๊ธฐ

<div class="row">
    <div class="col d-grid">
        <input type="button"  class="btn btn-secondary" value="์‚ญ์ œ" th:onclick="deleteCart([[${cart.cartCode}]]);">
    </div>

cart_list.js ์ƒ์„ฑ

์ƒํ’ˆ ์‚ญ์ œ ํ•จ์ˆ˜ ์ž‘์„ฑ.

์‚ญ์ œ ์ „ confirm ์ฐฝ์œผ๋กœ ํ™•์ธ ์ฐฝ ๋„์›Œ์ฃผ๊ธฐ.

ํ™•์ธ ๋ˆ„๋ฅด๋ฉด cartCode๊ฐ€์ง€๊ณ  controller๋กœ ์ด๋™

//์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒํ’ˆ ์‚ญ์ œ
function deleteCart(cartCode){
	
	const result = confirm('์žฅ๋ฐ”๊ตฌ๋‹ˆ์—์„œ ์‚ญ์ œํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?');
	
	if(result){
		location.href = `/cart/deleteCart?cartCode=${cartCode}`;
	}
}

CartController ์ž‘์„ฑ

//์žฅ๋ฐ”๊ตฌ๋‹ˆ ์‚ญ์ œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ
@GetMapping("/deleteCart")
public String deleteCart(String cartCode) {

    return "redirect:/cart/cartList";

}

์ƒํ’ˆ ์‚ญ์ œ ์ฟผ๋ฆฌ ์ž‘์„ฑ.

<!-- ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒํ’ˆ ์‚ญ์ œ ๋ฒ„ํŠผ -->
<delete id="deleteCart">
    DELETE SHOP_CART
    WHERE CART_CODE = #{cartCode}
</delete>

CartService ๋ฉ”์†Œ๋“œ ์ž‘์„ฑ

//์žฅ๋ฐ”๊ตฌ๋‹ˆ ์‚ญ์ œ ๋ฒ„ํŠผ ํด๋ฆญ
void deleteCart(String cartCode);

CartServiceImpl  ๋ฉ”์†Œ๋“œ ๊ตฌํ˜„

//์žฅ๋ฐ”๊ตฌ๋‹ˆ ์‚ญ์ œ ๋ฒ„ํŠผ
@Override
public void deleteCart(String cartCode) {
    sqlSession.delete("cartMapper.deleteCart", cartCode);
}

CartController์—์„œ ๋ฉ”์†Œ๋“œ ์‹คํ–‰

//์žฅ๋ฐ”๊ตฌ๋‹ˆ ์‚ญ์ œ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ
@GetMapping("/deleteCart")
public String deleteCart(String cartCode) {
    //์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒํ’ˆ ์‚ญ์ œ ๋ฒ„ํŠผ ํด๋ฆญ
    cartService.deleteCart(cartCode);

    return "redirect:/cart/cartList";

}

 

 

์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒํ’ˆ ์ฒดํฌ๋ฐ•์Šค ์ปจํŠธ๋กค ๊ธฐ๋Šฅ

 

 

 

 

 

 

 

ใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…ก์ •๋ฆฌ ๋‚ ๋ ค๋จน์€ ๋ถ€๋ถ„

- ์ฒดํฌ๋ฐ•์Šค ๋ณ€๊ฒฝ ์‹œ ์ตœ์ข… ๊ธˆ์•ก ์ž๋™ ๋ณ€๊ฒฝ

ใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…กใ…ก