๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“• Spring Framework/Spring Project

2022.05.21 ใ€Œ Shopping Cart API ๋งŒ๋“ค๊ธฐ ใ€

by GroovyArea 2022. 5. 21.
์–ด์ œ๋ถ€๋กœ ์ธ์ฆ, ์ธ๊ฐ€ ์ž‘์—…์ด ์™„๋ฃŒ๋˜์—ˆ๋‹ค. ์ง„์งœ ์˜ค๋ž˜ ๊ฑธ๋ ธ๋‹ค. ์†๋„๋ฅผ ์ข€ ๋” ๋‚ผ ํ•„์š”๊ฐ€ ์žˆ๋‹ค.
์˜ค๋Š˜๋ถ€ํ„ฐ๋Š” ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋ฅผ ๋งŒ๋“ค๊ฑด๋Œ€ ์ด๋ฒˆ์—๋Š” DB๋ฅผ ์ด์šฉํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. 
์ฟ ํ‚ค๋ฅผ ์ด์šฉํ•ด ๋ณผ ์ƒ๊ฐ์ด๋‹ค. ์ฟ ํ‚ค์— ์žฅ๋ฐ”๊ตฌ๋‹ˆ ๊ด€๋ จ ์ •๋ณด๋ฅผ ๋„ฃ์–ด์„œ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์‘๋‹ตํ•˜๋Š” ๊ฒƒ์ด๋‹ค. 
ํ•œ ๋•Œ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋“ค์–ด๊ฐ€๋Š” ๋ฐ์ดํ„ฐ๋„ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ์„ ํ–ˆ๋Š”๋ฐ ๋ณดํ†ต ์žฅ๋ฐ”๊ตฌ๋‹ˆ๋Š” ์ฟ ํ‚ค๋‚˜ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€๋ฅผ ์ด์šฉํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.
๋‚˜๋Š” ์˜จ์ „ํ•œ API๋กœ๋งŒ ๊ตฌํ˜„์„ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฟ ํ‚ค๋ฅผ ํ†ตํ•ด ๊ตฌํ˜„ํ•ด๋ณผ ์ƒ๊ฐ์ด๋‹ค.  

 

์žฅ๋ฐ”๊ตฌ๋‹ˆ๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„ํ• ๊นŒ?

์ผ๋‹จ DB์— ์ €์žฅ์„ ๋”ฐ๋กœ ํ•˜์ง€ ์•Š๊ณ  ์ฟ ํ‚ค๋กœ ๊ตฌํ˜„์„ ํ•˜๊ธฐ๋กœ ๊ฒฐ์‹ฌํ–ˆ๋‹ค. 

์ฃผ์š” ๊ธฐ๋Šฅ์„ ์ƒ๊ฐํ•ด๋ณด์•˜๋‹ค. 

 

๊ธฐ๋Šฅ

1. ์ƒํ’ˆ์„ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ถ”๊ฐ€

2. ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ๋‹ด๊ธด ์ƒํ’ˆ ๋ชฉ๋ก ์กฐํšŒ

 

=> ์ˆ˜์ •๊ณผ ์‚ญ์ œ๊ฐ€ ์—†๋Š” ์ด์œ ๋Š” ํ”„๋ŸฐํŠธ๋‹จ์—์„œ ํ•  ์ˆ˜ ์žˆ์ง€ ์•Š์„๊นŒ..? (์•„๋‹Œ๊ฐ€.. ์‚ญ์ œ๋„ ํ•„์š”ํ•˜๋ ค๋‚˜?)

์ค‘์š”ํ•œ ๊ฑด! json ํ˜•์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋„˜๊ฒจ ๋ฐ›์•„ ์ฟ ํ‚ค๋กœ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋Š” API๋ฅผ ์„ค๊ณ„ํ•˜๋Š” ๊ฒŒ ๋‚˜์˜ ์ฃผ๋œ ๋ชฉํ‘œ์ด๋‹ค. 

 

์ผ๋‹จ ์ƒํ’ˆ์„ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ถ”๊ฐ€ํ•˜๋Š” ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•ด๋ณด์ž. ์ฟ ํ‚ค๋ฅผ ์ด์šฉํ•ด์„œ!

 

1. ์‘๋‹ต ์ฟ ํ‚ค๋ฅผ ๋ฐ›์•„ ์™€์•ผํ•œ๋‹ค.

Cookie[] requestCookies = request.getCookies() 

 

2. ์‘๋‹ต ์ฟ ํ‚ค๊ฐ€ ์žˆ์„ ๊ฒฝ์šฐ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ์ฟ ํ‚ค๋ฅผ ์ถ”์ถœํ•ด์•ผ ํ•œ๋‹ค.

/* ์นดํŠธ ์ฟ ํ‚ค ๋ฐ˜ํ™˜ ๋ฉ”์„œ๋“œ */
public static Cookie getCartCookie(Cookie[] requestCookies) {
    for (Cookie cookie : requestCookies) {
        if (COOKIE_KEY.equals(cookie.getName())) {
            return cookie;
        }
    }
    return null;
}

=> Cart ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ „๋ฐ˜์ ์œผ๋กœ ์“ฐ์ด๋ฏ€๋กœ ๋”ฐ๋กœ utils๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

 

3. ์‘๋‹ต ์ฟ ํ‚ค๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ์ฟ ํ‚ค๋ฅผ ๋”ฐ๋กœ ์ƒ์„ฑํ•ด์ค€๋‹ค.

/* ์‘๋‹ต ์ฟ ํ‚ค ์—†์„ ๊ฒฝ์šฐ ์ฟ ํ‚ค ์ƒ์„ฑ */
if (responseCookie == null) {
    responseCookie = new Cookie(COOKIE_KEY, URLEncoder.encode(JsonUtil.objectToString(new HashMap<Integer, CartDTO>()), ENC_TYPE));
    responseCookie.setPath("/api/carts");
}

 

4. json์œผ๋กœ ๋ฐ›์•„์˜จ ์ƒํ’ˆ ์ •๋ณด๋ฅผ ๋ฌธ์ž์—ด๋กœ ๋งคํ•‘ํ•˜์—ฌ ์ฟ ํ‚ค์— ๋‹ด์•„์ค€๋‹ค.

๋งคํ•‘ํ•˜๋Š” ๊ฒƒ์€ ObjectMapper๋ฅผ ์ด์šฉํ•ด utils ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

 

์ฃผ์˜ํ•  ์ ์€ ์ฟ ํ‚ค์— ๋‹ด์„ ๋•Œ ์ธ์ฝ”๋”ฉ์„ ํ•ด์•ผ ํ•œ๋‹ค.

String cookieValue = responseCookie.getValue();
Map<Integer, CartDTO> cartDTOMap = JsonUtil.stringToMap(URLDecoder.decode(cookieValue, ENC_TYPE), Integer.class, CartDTO.class);

CartDTO cartItem = cartDTOMap.get(productNo);

if (cartItem != null) {
    cartItem.setProductStock(cartDTO.getProductStock() + cartItem.getProductStock());
}

cartDTOMap.put(productNo, cartDTO);
responseCookie.setValue(URLEncoder.encode(JsonUtil.objectToString(cartDTOMap), ENC_TYPE));

 

5. ์ฟ ํ‚ค๋ฅผ response ๊ฐ์ฒด์— ์ €์žฅํ•œ ํ›„ api์˜ Return body์— ์„ฑ๊ณต ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ธ๋‹ค.

response.addCookie(responseCookie);

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

์ผ๋‹จ ๋‹จ์ผ ์ƒํ’ˆ ์žฅ๋ฐ”๊ตฌ๋‹ˆ ์ถ”๊ฐ€ API๋งŒ ๊ตฌํ˜„ํ–ˆ๋‹ค.. ๊ฐˆ ๊ธธ์ด ๋ฉ€๋‹ค ๋ฉ€์–ด

 

์ฐธ์กฐ : https://interconnection.tistory.com/137

 

Jackson ObjectMapper ์ •๋ฆฌ

๊ฐœ์š” Java ๊ฐœ๋ฐœ์ž๋ผ๋ฉด Jackson์—์„œ ์ œ๊ณตํ•˜๋Š” ObjectMapper์™€ ์ž์ฃผ ๋งˆ์ฃผ์น˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. Java ํด๋ž˜์Šค ๋‚ด์šฉ์„ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ๋‚ด์šฉ๋ฌผ์˜ Parsing ๊ณผ์ •์— ํ•„์š”ํ•œ ์ปค์Šคํ„ฐ๋งˆ์ด์ง•์ด ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ค‘์š”ํ•œ ๊ธฐ

interconnection.tistory.com

 

 

์ฐธ์กฐ : https://devidea.tistory.com/25

 

์Šคํ”„๋ง ํŒ: *Utils ํด๋ž˜์Šค ํ™œ์šฉ

spring ๋ธ”๋กœ๊ทธ์— ๊ฒŒ์‹œ๋˜์–ด ์žˆ๋Š” spring *Utils ํด๋ž˜์Šค๋“ค์— ๋Œ€ํ•œ ํ™œ์šฉ ํŒ์ด๋‹ค. ๋ธ”๋กœ๊ทธ์— youtube ์˜์ƒ๊ณผ ํ•จ๊ป˜ ์ž์„ธํžˆ ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋‹ค. Spring Tips: The Spring Framework *Utils Classes ํฌ๊ฒŒ ๋ณด๋ฉด ์•„๋ž˜ Utils๋“ค์˜..

devidea.tistory.com

 

๋ฐ˜์‘ํ˜•