본문 바로가기
📕 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

 

반응형