장바구니 , 찜목록

김창모·2023년 8월 6일
0

Project

목록 보기
9/13

Intro

ForeverPet 이라는 이름으로 프로젝트를 진행하고 있다.
순조롭게 진행되고 있었지만 프론트 분들의 요청에 가장 부합하고 좋은 방법이 뭘까 고민하다가
정리할겸 남긴다.

Request

모든 상품에 각 회원의 장바구니와 찜목록에 표함되어 있는지 별도의 boolean 값으로 표기해주세요.

Problem

기존에는 ProductService 의 getAllProducts() 로 모든 상품을 조회하여 List<ProductResponse> 로 반환하고있었다.

public class ProductResponse {
    private Long id;
    private String productName;
    private String productDescription;
    private Categories categories;
    private Long productPrice;
    private Long numberOfSold;
    private String productImage;
    private String brandName;
    private LocalDateTime createdDate;
    private LocalDateTime modifiedDate;
}

여기서부터 고민이 시작되었다.

Solution1

ProductService 의 getAllProduct() -> getAllProducts(HttpServletRequest)
HttpServletRequest 를 받아 토큰을 찾고 토큰으로 유저를 찾는다.
ProductResponse 의 필드에 boolean inCart , inWish 를 추가하고
위에서 찾은 유저정보에서 cart 와 wish 를 찾아서 해당 상품은 inCart ,inWish 를 true 로 바꿔준다.
이렇게 처리할 경우 추가적인 요청 없이 처리할수 있지만 로그인 하지 않은 유저의 ProductResponse 에는
불필요한 필드가 두개나 포함되게 된다.

Solution2

ProductService 에서의 메서드 분리
1. 비 로그인 유저의 getAllProducts()
2. 로그인 유저의 getAllProducts()
이렇게 처리할 경우
case1 의 필드에는 inCart , inWish 가 없고
case2 의 필드에는 inCart , inWish 가 있다.
따라서 컨트롤러 에서 하나의 타입으로 반환하지 못한다.

Solution3

그렇다면 컨트롤러 에서 다르게 처리를 해야할까??
컨트롤러에서 아예 두개의 경우를 나누어 구현한다면 ?
1. 비로그인 유저의 모든상품 조회
2. 로그인 유저의 모든상품 조회
편리하게 처리할순 있지만 로그인 여부에 따라 컨트롤러를 나눠야 한다는게 거슬린다.

결론

우선 1안으로 해결을 해두었지만 역시나 신경쓰인다.
조금더 찾아보고 팀원들의 의견도 물어보고
그래도 해결이 안된다면 다른분들의 조언을 구해 어떤 방식이 가장 좋을지 해결을 해야겠다.

수정

3 안으로 수정했다.
따라서 비회원의 getAllProducts 는 기존과 똑같이 진행
회원의 getAllProducts 는 별도의 Response 와 Controller 메서드를 만들어 해결했다.

비 로그인 회원

    @Operation(summary = "모든 상품 조회", description = "id 순으로 모든 상품을 조회합니다.")
    @GetMapping("/products")
    public ResponseEntity<List<ProductResponse>> allProducts() {

        return ResponseEntity.ok(productService.getAllProducts());
    }

로그인 회원

    @Operation(summary = "로그인 유저 모든 상품 조회", description = "로그인한 유저의 모든 상품 조회")
    @GetMapping("/user/products")
    public ResponseEntity<List<LoginUserProductResponse>> loginUserGetAllProducts(String token) {
        return ResponseEntity.ok(productService.loginUserGetAllProducts(token));
    }

테스트

테스트 코드를 작성하려다 보니 HttpServletRequest 에서 헤더값을 찾아 직접 유저를 찾으려고 하니
테스트코드 작성이 쉽지 않았다.
그래서 따로 JWT 토큰 값을 요청받아 해결하는 식으로 해결하였다.

0개의 댓글