오류 및 문제점
1. 테이블 이벤트에 따른 상태 변경
- 문제점: 주문 수집 시 쇼핑몰 테이블의 주문 상태를 변경해야 한다.
- 해결방안: 트리거를 이용해 exports 테이블에 insert 이벤트가 발생하면 is_collected, order_status 값을 변경시킨다.
DELIMITER
CREATE TRIGGER collect_shopping
AFTER INSERT ON exports
FOR EACH ROW
BEGIN
UPDATE shopping SET is_collected = TRUE
WHERE export_no = NEW.export_no;
UPDATE shopping_product SET order_status = '배송준비중'
WHERE export_no = NEW.export_no;
END
DELIMITER ;
2. JPA countBy
- 문제점: 주문 목록에서 상태를 볼 때 각각의 상품 상태 개수가 필요하다.
- 해결방안: countBy 메서드를 이용해 주문 취소, 출고 대기 상태인 상품 개수를 센다.
Long cancelCnt = exportProductRepository.countByExports_ExportNoAndOrderStatus(exportNo, "주문취소");
Long waitingCnt = exportProductRepository.countByExports_ExportNoAndOrderStatus(exportNo, "출고대기");
3. Page 2 of 1 containing UNKNOWN instances
- 문제점: 페이지 조회 시 페이지 수가 다르다.
- 해결방안: 페이지는 0부터 시작한다.
return findExports(sellerNo, 1, countPerPage);
return findExports(sellerNo, 0, countPerPage);
4. ShoppingController @RequestBody
- 문제점: sellerNo와 상품 리스트를 요청으로 받아 2개의 RequestBody가 필요하다.
- 해결방안: DTO로 만들어 받고 파싱한다.
@PostMapping("/shop/order")
public boolean register(@RequestBody ShoppingDTO shoppingDTO) {
return shoppingService.register(shoppingDTO.getSellerNo(), shoppingDTO.getOrderedProducts());
}
5. 클린 코드 작성하기
- 문제점: builder()를 이용해 작성하니 코드의 길이가 길어진다.
- 해결방안: toDTO, toEntity 메서드를 만든다.
for (Exports exp : exports) {
exportsDTOs.add(exp.toExportsDTO(exportProductRepository));
}
public ExportsDTO toExportsDTO(ExportProductRepository exportProductRepository) {
return ExportsDTO
.builder()
.address(address)
.exportNo(exportNo)
.orderDate(orderDate)
.ordererName(ordererName)
.orderStatus(setOrderStatus(exportNo, exportProductRepository))
.salesChannel(salesChannel)
.sellerNo(seller.getSellerNo())
.build();
}
진행 상황
1. 주문건 수집 코드 작성
- shoppingService를 이용해 주문건 수집
- shopping에서 exports로 데이터 전송
- exports에 insert시 shopping 변경
public List<ExportsDTO> register(Long sellerNo, int pageNum, int countPerPage) {
List<Exports> exports = new ArrayList<>();
List<Shopping> shoppings = shoppingService.findNotCollected(sellerNo);
Seller seller = sellerService.findById(sellerNo);
if(shoppings.size() > 0) {
for(Shopping shopping: shoppings) {
exports.add(shopping.toExports(seller));
}
for(Exports exp: exports) {
List<ExportProduct> products = new ArrayList<>();
Exports savedExport = exportsRepository.save(exp);
List<ShoppingProduct> shopping = shoppingService.findShoppingProduct(savedExport.getExportNo());
for(ShoppingProduct shop: shopping) {
products.add(shop.toExportProduct(savedExport));
}
List<ExportProduct> savedProduct = exportProductRepository.saveAll(products);
}
}
return findExports(sellerNo, 0, countPerPage);
}
2. 출고 목록 조회 코드 작성
public List<ExportsDTO> findExports(Long sellerNo, int pageNum, int countPerPage) {
List<ExportsDTO> exportsDTOs = new ArrayList<>();
Page<Exports> exports = exportsRepository.findAllBySeller_SellerNoOrderByOrderDateDesc(sellerNo,
PageRequest.of(pageNum, countPerPage));
for (Exports exp : exports) {
exportsDTOs.add(exp.toExportsDTO(exportProductRepository));
}
return exportsDTOs;
}
3. 출고 상세 코드 작성
public List<ExportProductDTO> exportDetail(String exportNo, int pageNum, int countPerPage) {
List<ExportProductDTO> exportProductDTOs = new ArrayList<>();
Page<ExportProduct> exportProducts = exportProductRepository
.findByExports_ExportNoOrderByProduct_ProductName(exportNo, PageRequest.of(pageNum, countPerPage));
for (ExportProduct exportProduct : exportProducts) {
exportProductDTOs.add(exportProduct.toExportProductDTO());
}
return exportProductDTOs;
}
4. 쇼핑몰 컨트롤러 생성
@PostMapping("/shop/order")
public boolean register(@RequestBody ShoppingDTO shoppingDTO) {
return shoppingService.register(shoppingDTO.getSellerNo(), shoppingDTO.getOrderedProducts());
}
5. 출고 컨트롤러 생성
@GetMapping(value = {"/3pl/export/list", "/seller/export/list"})
public List<ExportsDTO> findAllExports(Long sellerNo, int pageNum, int countPerPage) {
return exportsService.findExports(sellerNo, pageNum, countPerPage);
}
@GetMapping("/3pl/export/collect")
public List<ExportsDTO> collectExports(Long sellerNo, int pageNum, int countPerPage) {
return exportsService.register(sellerNo, pageNum, countPerPage);
}
@GetMapping(value = {"/3pl/export/{exportNo}", "/seller/export/{exportNo}"})
public List<ExportProductDTO> exportsDetail(@PathVariable String exportNo, Long sellerNo, int pageNum, int countPerPage) {
return exportsService.exportDetail(exportNo, pageNum, countPerPage);
}
참고 자료