2022.05.28 ใ์ฟ ํค ์์ ใ
์ฅ๋ฐ๊ตฌ๋ API๋ฅผ ์ฒ์ ๊ตฌํํด๋ณด๋ ์ฟ ํค๋ก ํ๋ค๊ฒ ์งฐ์๋ค.
์ค๋ ์ฃผ๋ฌธ API๋ฅผ ๊ตฌํํ๋ ค๊ณ ์นด์นด์คํ์ด ๊ด๋ จ API ํ์ ๋ฐ ๊ตฌ์์ ํ๋ ๋์ค ์ฅ๋ฐ๊ตฌ๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ๊ฒฐ์ ํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ ์ฌ๋ ธ๋ค. ๋ค์ ํ๋ฒ ์ฅ๋ฐ๊ตฌ๋ API ๋์์ด ์ ๋๋์ง ํฌ์คํธ๋งจ์ผ๋ก ํ์ธ์ ํ๋ ๋์ค ์ด์ํ ์ฟ ํค ์๋ฌ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ ๋ฐ๊ฒฌํ ์ ์์๋ค..
๋ค์ ํ๋ฒ ์ ๊ฒ์ ํตํด ์ฝ๋ ์์ ์ ํ๋ฉฐ ๋จ๋ฒ์ ์๋ฒฝํ ์ฝ๋๋ฅผ ์์ฑํ๋ค๋ ์๋ง์ฌ ๋๊ผ๋ ์์ ์ ๋ฐ์ฑ์ ํ๊ฒ ๋์๋ค..ใ ใ
๋ฌธ์ ์
- ์ฅ๋ฐ๊ตฌ๋ ์ํ ์ถ๊ฐ๊ฐ ๋์ง ์๋๋ค
- ์ฟ ํค๊ฐ ๋ค์ค์ผ๋ก ์์ฑ๋๋ค
=> ์ด ๋ ๊ฐ์ง ๋ฌธ์ ๊ฐ ์ ์ผ ์ปธ๋ค
๊ธฐ์กด ์ฝ๋
์ฅ๋ฐ๊ตฌ๋ ์ฟ ํค๋ฅผ ์์ ํ์ฌ 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๋ฅผ ์์ฑํด์ผ๊ฒ ๋ค.