본문 바로가기
프로젝트/개인 프로젝트 V1

(8) 장바구니, 상품 판매

by Thumper 2022. 8. 2.

회원은 다음과 같은 서비스를 이용할 수 있다.

  • 회원은 상품을 등록해 판매할 수 있다.
  • 회원은 상품을 장바구니에 넣어 주문할 수 있다.
  • 회원은 변심으로 장바구니를 삭제할 수 있다.
  • 회원은 자신이 등록한 상품, 장바구니를 조회할 수 있다.

장바구니 도메인 설계

장바구니 도메인 역할

 

1. 장바구니 생성

  • 클라이언트는 장바구니 서비스에 장바구니 생성을 요청한다.
  • 장바구니에는 해당 주문상품 정보(상품, 주문 수량)이 저장된다.

 

2. 회원 조회

  • 장바구니를 이용하기 위해서는 회원 정보가 필요하다.
  • 그래서 장바구니 서비스는 회원 저장소에서 회원을 조회 한다.

 

3. 장바구니 반환

생성한 장바구니를 반환한다.

 

 

 

 

 

장바구니 서비스 

   @Transactional
    public Long mergeCart(User user, Long itemId, int count) {
        Item item = itemRepository.findById(itemId)
                .orElseThrow(() -> new IllegalArgumentException("해당 상품이 없습니다."));

        OrderItem orderItem = OrderItem.orderItemBuilder()
                .item(item)
                .count(count)
                .build();

        orderItem.orderAmount(count);
        Cart cart = Cart.createCartV2(user, orderItem);

        cartRepository.save(cart);
        return cart.getId();
    }

    @Transactional
    public void deleteCart(Long orderItemId) {
        OrderItem orderItem = orderItemRepository.findById(orderItemId)
                .orElseThrow(() -> new IllegalArgumentException("해당 상품이 없습니다."));

        orderItem.getItem().cancelCart(orderItem.getCount());
        orderItemRepository.delete(orderItem);

    }
    
    public List<CartInfoDto> getCartList(User user) {
        List<Cart> carts = cartRepository.findByUser(user);

        List<CartInfoDto> dtoList = new ArrayList<>();
        for (Cart cart : carts) {
            for (OrderItem orderItem : cart.getOrderItems()) {
                CartInfoDto cartDto = new CartInfoDto();

                cartDto.updateCartInfo(orderItem.getId(), user.getLoginId(), orderItem.getItem(), orderItem.getCount(), orderItem.getOrderPrice());
                log.info("update Dto={}", cartDto.getItem().getStockQuantity());
                dtoList.add(cartDto);

            }
        }
        return dtoList;
    }

mergeCart() : 장바구니 생성

  • 상품ID로 해당 상품이 있는지 찾아본다.
  • 상품이 존재하면, 주문상품을 생성한다.
  • 주문 상품에 상품 정보와 주문 수량을 저장한다.
  • 회원정보, 주문 상품을 담아 장바구니를 생성한다.

 

deleteCart() : 장바구니 삭제

주문상품ID로 검색하여 해당 주문상품 정보를 삭제한다. 

 

 

getCartList() : 장바구니 조회

  • 회원 정보로 장바구니를 전부 조회한다.
  • 장바구니(엔티티)를 DTO로 반환하여 장바구니 정보를 확인한다.

 


판매 도메인 설계

 

판매 도메인 역할

 

 

1. 상품 생성

  • 클라이언트는 판매 서비스에 상품 생성을 요청한다.
  • 상품 생성 시 상품정보, 상품 이미지가 저장된다.

 

2. 회원 조회

  • 상품 판매를 하기 위해서는 회원 정보가 필요하다.
  • 그래서 판매 서비스는 회원 저장소에서 회원을 조회 한다.

 

3. 상품정보 반환

생성한 상품을 반환한다.

 

 

 

 

 

 

 

 

판매 서비스

    public Long saveItem(User user, ItemFormDto itemFormDto, List<MultipartFile> multipartFileList) throws IOException {
        Item item = itemFormDto.toEntity();
        item.setUpUser(user);
        Long id = itemRepository.save(item).getId();

        //대표 이미지 구별
        for (int i=0; i<multipartFileList.size(); i++) {
            ItemInfo itemInfo = new ItemInfo();
            itemInfo.setItem(item);

            if (i==0)
                itemInfo.setRepImgYn("Y");
            else
                itemInfo.setRepImgYn("N");

            imgService.saveItemImg(itemInfo, multipartFileList.get(i));
        }

        return id;
    }
    

    @Transactional(readOnly = true)
    public ItemFormDto getItemDetail(Long itemId) {
        List<ItemImg> itemImgList = imgRepository.findAllByItem_id(itemId);
        List<ItemImgDto> itemImgDtoList = new ArrayList<>();

        for (ItemImg itemImg : itemImgList) {
            ItemImgDto itemImgDto = ItemImgDto.of(itemImg);
            itemImgDtoList.add(itemImgDto);
        }

        //item(Entity) -> itemformDto(DTO) --> itemimgdtoList (setting)
        Item item = itemRepository.findById(itemId)
                .orElseThrow(() -> new IllegalArgumentException("Invalid board id= " + itemId ));
        ItemFormDto itemFormDto = ItemFormDto.of(item);
        itemFormDto.setItemImgDtoList(itemImgDtoList);
        return itemFormDto;
    }

    @Transactional(readOnly = true)
    public Page<MainItemDto> searchPageSort(ItemSearchCondition condition, Pageable pageable) {
        return itemRepository.searchPageSort(condition, pageable);
    }


    @Transactional(readOnly = true)
    public Page<MainItemDto> categoryPageSort(String code, ItemSearchCondition condition, Pageable pageable) {
        return itemRepository.categoryPageSort(code, condition,pageable);
    }


    public void delete(Long id) {
        Item item = itemRepository.findById(id)
                .orElseThrow(() -> new IllegalArgumentException("해당 상품이 없습니다. "));
        itemRepository.delete(item);
    }


}

 

saveItem() : 상품 생성

회원정보, 상품정보 DTO, multipartFile를 받아 상품(엔티티)를 생성한다.

file의 첫번째 데이터를 대표 이미지로 지정한다.

 

 

getItemDetail() : 상품 상세정보 조회하기

  • 상품ID로 상품의 이미지(Entity)를 찾아온다.
  • 상품의 이미지(Entity)를  itemImgDtoList(DTO)로 변환한다.
  • 상품ID로 상품(Entity)를 찾아온다.
  • 상품(Entity)를 itemFormDto(DTO)로 변환한다.
  • itemFormDto(DTO)에 itemImgDtoList(DTO)를 담는다.
  • 상세정보로 itemFormDto(DTO)를 반환한다.

 

searchPageSort() : 메인페이지 상품 정렬 

  • 메인페이지에 보여줄 상품 정보를 얻는다.
  • 페이징처리를 하여 List<DTO>로 조회한다.

 

categoryPageSort() : 카테고리별 상품 정렬

카테고리(책/음반)를 통해 상품정보를 얻는다.

페이징처리를 하여 List<DTO>로 조회한다.

 

 

delete() : 등록한 상품 삭제하기


느낀점 / 보완사항

  • 상품 조회, 상품 페이징 처리 시, DTO 사용 시 담는 데이터를 줄이고 싶다.
  • DTO에 담는 데이터를 최소한 필요한 것만 넣을 수 있고, 해당 DTO로 Entity를 찾을 수 있으면 좋겠다.
  • 상품 삭제 시, 장바구니에 담겨 있을 경우의 실패처리 로직을 만들어야 겠다.

댓글