๐Ÿ“• Spring Framework/Spring Project

2022.05.28 ใ€Œ์ฟ ํ‚ค ์ˆ˜์ •ใ€

GroovyArea 2022. 5. 28. 00:47
์žฅ๋ฐ”๊ตฌ๋‹ˆ API๋ฅผ ์ฒ˜์Œ ๊ตฌํ˜„ํ•ด๋ณด๋Š” ์ฟ ํ‚ค๋กœ ํž˜๋“ค๊ฒŒ ์งฐ์—ˆ๋‹ค.
์˜ค๋Š˜ ์ฃผ๋ฌธ API๋ฅผ ๊ตฌํ˜„ํ•˜๋ ค๊ณ  ์นด์นด์˜คํŽ˜์ด ๊ด€๋ จ API ํƒ์ƒ‰ ๋ฐ ๊ตฌ์ƒ์„ ํ•˜๋˜ ๋„์ค‘ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ๊ฒฐ์ œํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋– ์˜ฌ๋ ธ๋‹ค. ๋‹ค์‹œ ํ•œ๋ฒˆ ์žฅ๋ฐ”๊ตฌ๋‹ˆ API ๋™์ž‘์ด ์ž˜ ๋˜๋Š”์ง€ ํฌ์ŠคํŠธ๋งจ์œผ๋กœ ํ™•์ธ์„ ํ•˜๋˜ ๋„์ค‘ ์ด์ƒํ•œ ์ฟ ํ‚ค ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค..
๋‹ค์‹œ ํ•œ๋ฒˆ ์ ๊ฒ€์„ ํ†ตํ•ด ์ฝ”๋“œ ์ˆ˜์ •์„ ํ•˜๋ฉฐ ๋‹จ๋ฒˆ์— ์™„๋ฒฝํ•œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค๋Š” ์ž๋งŒ์‹ฌ ๋А๊ผˆ๋˜ ์ž์‹ ์— ๋ฐ˜์„ฑ์„ ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค..ใ…Žใ…Ž

๋ฌธ์ œ์ 

  1. ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒํ’ˆ ์ถ”๊ฐ€๊ฐ€ ๋˜์งˆ ์•Š๋Š”๋‹ค
  2. ์ฟ ํ‚ค๊ฐ€ ๋‹ค์ค‘์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค

=> ์ด ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์ œ์ผ ์ปธ๋‹ค

 

๊ธฐ์กด ์ฝ”๋“œ 

์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ฟ ํ‚ค๋ฅผ ์ˆ˜์ •ํ•˜์—ฌ response ๊ฐ์ฒด์— ์‚ฝ์ž…ํ•œ๋‹ค.

๋นจ๊ฐ„์ƒ‰์„ ๋ณด๋ฉด ์ฟ ํ‚ค ๊ฐ’ ๋ณ€๊ฒฝ ํ›„ response ๊ฐ์ฒด์— ๋‹ค์‹œ ์ €์žฅํ•œ๋‹ค. ์ด๋Ÿฌ๋ฉด ์ƒˆ๋กœ์šด ์ฟ ํ‚ค ๊ฐ์ฒด๊ฐ€ ์ €์žฅ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

๋ฌธ์ œ

์ƒˆ๋กœ์šด ์ฟ ํ‚ค๊ฐ€ ๊ฐ™์€ Key๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์ €์žฅ๋œ๋‹ค. 

=> ๋‚ด๊ฐ€ ์›ํ•œ ๊ฑด ๊ธฐ์กด ์ฟ ํ‚ค๋ฅผ ๋ฎ์–ด ์”Œ์šฐ๋Š” ๊ฑฐ์˜€๋Š”๋ฐ

 

ํ•ด๊ฒฐ

๊ธฐ์กด ์ฟ ํ‚ค์˜ ๊ฐ’์„ ์–ป์–ด์™€ ์ˆ˜์ •ํ•˜๊ณ , ์‚ญ์ œํ•œ๋‹ค

๊ทธ ํ›„ ์ƒˆ๋กœ์šด ์ฟ ํ‚ค๋ฅผ ์ƒ์„ฑ ํ›„ ์—…๋ฐ์ดํŠธ ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค.

 

/**
 * ์žฅ๋ฐ”๊ตฌ๋‹ˆ์˜ ์ •๋ณด๋ฅผ ๋‹ด์€ map ๊ฐ์ฒด๋ฅผ ๊ฐ’์œผ๋กœ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ฟ ํ‚ค๋ฅผ ์ƒ์„ฑ
 *
 * @throws UnsupportedEncodingException ์ธ์ฝ”๋”ฉ ๋ฌธ์ œ ์‹œ ์˜ˆ์™ธ ๋ฐœ์ƒ
 */
private void createCartCookie() throws UnsupportedEncodingException {
    responseCartCookie = new Cookie(COOKIE_KEY, URLEncoder.encode(JsonUtil.objectToString(cartDTOMap), ENC_TYPE));
    responseCartCookie.setPath("/api/carts");
}

=> ๋จผ์ € ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค์–ด์งˆ ์ฟ ํ‚ค๋ฅผ ์ƒ์„ฑ ํ›„

 

/**
 * ๊ธฐ์กด ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ฟ ํ‚ค๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ์ฟ ํ‚ค๋ฅผ ์‘๋‹ต
 *
 * @param response servlet response ๊ฐ์ฒด
 * @throws UnsupportedEncodingException ์ธ์ฝ”๋”ฉ ๋ฌธ์ œ ์‹œ ์˜ˆ์™ธ ๋ฐœ์ƒ
 */
private void resetCartCookie(HttpServletResponse response) throws UnsupportedEncodingException {
    responseCartCookie.setMaxAge(KILL_COOKIE);
    createCartCookie();
    response.addCookie(responseCartCookie);
}

=> ๊ธฐ์กด ์ฟ ํ‚ค๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋งŒ๋“ค์–ด์ง„ ์ฟ ํ‚ค๋ฅผ ๋‹ค์‹œ response์— ๋‹ด๋Š”๋‹ค.

 

/**
 * ๋‹จ์ผ ์ƒํ’ˆ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ถ”๊ฐ€ ๋ฉ”์„œ๋“œ
 *
 * @param addCartDTO ์ถ”๊ฐ€ํ•  ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ƒํ’ˆ ๋ฐ์ดํ„ฐ
 * @param response   servlet Response
 * @return ์ƒํƒœ์ฝ”๋“œ & ๋ฉ”์‹œ์ง€
 * @throws UnsupportedEncodingException url ์ธ์ฝ”๋“œ, ๋””์ฝ”๋“œ ์˜ˆ์™ธ
 */
@Auth(role = Auth.Role.BASIC_USER)
@PostMapping
public ResponseEntity<String> addCart(@RequestBody(required = true) CartItemDTO addCartDTO, HttpServletRequest request,
                                      HttpServletResponse response) throws UnsupportedEncodingException {
    productNo = addCartDTO.getProductNo();

    getCartCookie(request);

    /* ์‘๋‹ต ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ฟ ํ‚ค๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ์ฟ ํ‚ค ์ƒ์„ฑ */
    if (responseCartCookie == null) {
        cartDTOMap = new HashMap<>();

        createCartCookie();

        cartDTOMap.put(productNo, addCartDTO);

        responseCartCookie.setValue(URLEncoder.encode(JsonUtil.objectToString(cartDTOMap), ENC_TYPE));
        response.addCookie(responseCartCookie);

        return ResponseEntity.ok().body(ResponseMessage.ADD_MESSAGE.getValue());
    }

    cartDTOMap = getCartItemDTOMap(responseCartCookie);

    CartItemDTO cartItem = cartDTOMap.get(productNo);
    /* ๊ธฐ์กด ์ƒํ’ˆ์ด ์žˆ์„ ๊ฒฝ์šฐ ๋ฐ”๊ฟ”์น˜๊ธฐ ํ•ด์•ผ๋จ ๋ฐ”๋€” ๋ฐ์ดํ„ฐ๋Š” ์ˆ˜๋Ÿ‰๋ฟ์ด๋‹ค.
    ์ƒํ’ˆ ๋ฒˆํ˜ธ = key, ์ƒํ’ˆ ๊ฐ์ฒด = value */
    if (cartItem != null) {
        cartItem.setProductStock(addCartDTO.getProductStock() + cartItem.getProductStock());
        cartDTOMap.put(productNo, cartItem);
    }

    cartDTOMap.put(productNo, addCartDTO);

    resetCartCookie(response);

    return ResponseEntity.ok().body(ResponseMessage.ADD_MESSAGE.getValue());
}

์ค‘๋ณต ์ฝ”๋“œ๋„ ๋ฉ”์„œ๋“œ๋กœ ๋ถ„๋ฆฌํ•ด ์ตœ๋Œ€ํ•œ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ”๋‹ค

 

๊ฒฐ๋ก 

์–ผ๋–จ๊ฒฐ์— ๊ธฐ์กด ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ์ฒ˜์Œ ์จ๋ณด๋Š” ์ฟ ํ‚ค๋ฅผ ๊ตฌํ˜„ํ•œ ๋งŒํผ ์ž” ์‹ค์ˆ˜๊ฐ€ ๋งŽ์•˜๋˜ ๊ฒƒ ๊ฐ™๋‹ค. 

์ด๋Ÿฌ๋ฉด์„œ ์„ฑ์žฅํ•˜๋Š” ๊ฒƒ ์•„๋‹ˆ๊ฒ ์–ด?

๊ทธ๋ž˜๋„ ํ•ญ์ƒ ์‹คํ–‰์„ ํ•ด๋ณด๋ฉฐ ์˜ฌ๋ฐ”๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•˜๋Š” ์Šต๊ด€์„ ๋“ค์—ฌ์•ผ๊ฒ ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค.

๋‚ด์ผ์€ ๋ฐค์„ ์ƒˆ์›Œ์„œ๋ผ๋„ ์ฃผ๋ฌธ API๋ฅผ ์™„์„ฑํ•ด์•ผ๊ฒ ๋‹ค.

๋ฐ˜์‘ํ˜•