회원은 다음과 같은 서비스를 이용할 수 있다.
- 회원은 상품을 등록해 판매할 수 있다.
- 회원은 상품을 장바구니에 넣어 주문할 수 있다.
- 회원은 변심으로 장바구니를 삭제할 수 있다.
- 회원은 자신이 등록한 상품, 장바구니를 조회할 수 있다.
장바구니 도메인 설계
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를 찾을 수 있으면 좋겠다.
- 상품 삭제 시, 장바구니에 담겨 있을 경우의 실패처리 로직을 만들어야 겠다.
'프로젝트 > 개인 프로젝트 V1' 카테고리의 다른 글
(7) 로그인 (0) | 2022.08.02 |
---|---|
(6) 페이징 처리 (0) | 2022.08.02 |
(5) domain, repository, service 계층별 설계 및 구현 (0) | 2022.08.01 |
(3) 상품 등록 계층 설계 (0) | 2022.08.01 |
(4) 상품 등록 구현 - 이미지 업로드 (0) | 2022.08.01 |
댓글