[프로젝트] 웹 siCloud - day11

_bean_·2023년 8월 2일
0

[팀 프로젝트] siCloud

목록 보기
12/21
post-thumbnail

오류 및 문제점

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 메서드를 만든다.
// exportService.java
// Entity -> DTO
for (Exports exp : exports) {
	exportsDTOs.add(exp.toExportsDTO(exportProductRepository));
}

// Exports.java
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);
		}
	}
	// 주문 수집하면 무조건 1페이지로 이동
	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);
}

참고 자료

profile
어쩌다 풀스택 :3

0개의 댓글