오류 및 문제점
1. WebClient를 이용해 List<> 타입 받기
- 문제점: 제네릭 타입으로 responseBody를 받아야 한다.
- 해결 방안: ParameterizedTypeReference을 사용한다.
WebClient webClient = WebClient.create("http://localhost:4885");
List<ShoppingDTO> shoppingDTOs = webClient.get()
.uri("/shop/order/send/" + sellerNo)
.retrieve()
.bodyToMono(new ParameterizedTypeReference<List<ShoppingDTO>>() {})
.block();
2. Timestamp 형태 변환
- 문제점: 프론트에서 원하는 yyyy-MM-dd hh:mm 형식의 문자열로 Timestamp를 변환해야 한다.
- 해결 방안: SimpleDateFormat을 이용해 String 문자열 패턴을 정한다.
public class TimestampUtil {
public static String convertTimestampToString(Timestamp timestamp) {
Date date = new Date(timestamp.getTime());
SimpleDateFormat pattern = new SimpleDateFormat("yyyy-MM-dd hh:mm");
return pattern.format(date);
}
}
3. isAgreed 요청
- 문제점: 프론트에서 요청한 isAgreed의 값이 계속 false로 나온다.
- 해결 방안: boolean 타입의 경우 getter의 이름이 isXxx이다. 따라서 요청 변수의 이름을 agreed로 변경한다.
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class ThreePLDTO {
private boolean isAgreed;
}
진행 상황
1. 조회 응답에 totalPage수 추가
ExportsListDTO exportsListDTO = ExportsListDTO
.builder()
.totalPage(exports.getTotalPages())
.exports(exportsDTOs)
.build();
return exportsListDTO;
2. 쇼핑몰에서 주문 수집 요청 후 출고 목록 추가
@Transactional
public ExportsListDTO register(Long sellerNo, int pageNum, int countPerPage) {
Seller seller = sellerService.findById(sellerNo);
WebClient webClient = WebClient.create("http://localhost:4885");
List<ShoppingDTO> shoppingDTOs = webClient.get()
.uri("/shop/order/send/" + sellerNo)
.retrieve()
.bodyToMono(new ParameterizedTypeReference<List<ShoppingDTO>>() {})
.block();
for(ShoppingDTO shoppingDTO: shoppingDTOs) {
List<ExportProduct> exportProducts = new ArrayList<>();
Exports exports = shoppingDTO.toExports(seller);
Exports savedExports = exportsRepository.save(exports);
for(ShoppingProductDTO shoppingProductDTO : shoppingDTO.getOrderedProducts()) {
Product product = productService.findByProductNo(shoppingProductDTO.getProductNo());
ExportProduct exportProduct = shoppingProductDTO.toExportProduct(savedExports, product);
exportProducts.add(exportProduct);
}
List<ExportProduct> savedExportProducts = exportProductRepository.saveAll(exportProducts);
if(savedExports == null || savedExportProducts == null) findExports(sellerNo, 1, countPerPage);
}
return findExports(sellerNo, 1, countPerPage);
}
3. 쇼핑몰 주문 목록 조회
public List<ShoppingProductDTO> findShoppings(Long sellerNo) {
List<ShoppingProductDTO> shoppingProductDTOs = new ArrayList<>();
List<ShoppingProduct> shoppingProducts = shoppingProductRepository
.findByShopping_Seller_SellerNoOrderByShopping_OrderDateDescProduct_ProductName(sellerNo);
for(ShoppingProduct shoppingProduct: shoppingProducts) {
ShoppingProductDTO shoppingProductDTO = shoppingProduct.toShoppingProductDTO();
shoppingProductDTOs.add(shoppingProductDTO);
}
return shoppingProductDTOs;
}
4. 날짜 응답 형식 유틸
public class TimestampUtil {
public static String convertTimestampToString(Timestamp timestamp) {
Date date = new Date(timestamp.getTime());
SimpleDateFormat pattern = new SimpleDateFormat("yyyy-MM-dd hh:mm");
return pattern.format(date);
}
}
5. 3PL 회원가입
- 계약 가능한 화주사 수에 따라 창고 구역 개수 정해짐 (A~Z)
@Transactional
public boolean register3PL(ThreePLDTO threePLDTO) {
List<Warehouse> warehouses = new ArrayList<>();
User user = threePLDTO.toUser();
ProductGroup productGroup = productGroupService.findByGroupName(threePLDTO.getProductGroupName());
ThreePL threePL = threePLDTO.toThreePL(productGroup, user);
ThreePL savedThreePL = threePLService.register(threePL);
int cnt = savedThreePL.getCntTotal();
for(int i = 0; i < cnt; i++) {
Warehouse warehouse = Warehouse
.builder()
.threePL(savedThreePL)
.location(String.valueOf((char) ('A' + i)))
.build();
warehouses.add(warehouse);
}
List<Warehouse>savedWarehouses = warehouseService.saveAll(warehouses);
return savedWarehouses != null;
}
6. 상품군, 세부 상품군 목록 조회
public List<ProductGroupDTO> findAll() {
List<ProductGroupDTO> productGroupDTOs = new ArrayList<>();
List<ProductGroup> productGroups = productGroupRepository.findAll();
for(ProductGroup productGroup : productGroups) {
ProductGroupDTO productGroupDTO = ProductGroupDTO.builder().groupName(productGroup.getGroupName()).build();
productGroupDTOs.add(productGroupDTO);
}
return productGroupDTOs;
}
public List<ProductGroupDTO> findByProductGroup(Long sellerNo) {
List<ProductGroupDTO> productGroupDTOs = new ArrayList<>();
Seller seller = sellerService.findById(sellerNo);
List<DetailProductGroup> detailProductGroups = detailProductGroupRepository
.findByProductGroup_GroupName(seller.getProductGroup().getGroupName());
for(DetailProductGroup detailProductGroup: detailProductGroups) {
ProductGroupDTO productGroupDTO = ProductGroupDTO.builder().groupName(detailProductGroup.getGroupName()).build();
productGroupDTOs.add(productGroupDTO);
}
return productGroupDTOs;
}
7. user, WMS, 3PL, 화주사 히스토리 트리거
DELIMITER
CREATE TRIGGER trigger_history_threepl_updated
AFTER UPDATE ON threepl
FOR EACH ROW
BEGIN
INSERT INTO threepl_history(history_threepl_no, updated_date, updated_type, address, business_no, ceo_name, cnt_total,
company_name, fee, is_agreed, manager_email, manager_name, manager_phone, product_group_no, threepl_no)
VALUES(seq_nextval('seq_history'), CURRENT_TIMESTAMP(), 'UPDATED', OLD.address, OLD.business_no, OLD.ceo_name, OLD.cnt_total,
OLD.company_name, OLD.fee, OLD.is_agreed, OLD.manager_email, OLD.manager_name, OLD.manager_phone, OLD.product_group_no, OLD.threepl_no);
END
DELIMITER ;
DELIMITER
CREATE TRIGGER trigger_history_threepl_deleted
AFTER DELETE ON threepl
FOR EACH ROW
BEGIN
INSERT INTO threepl_history(history_threepl_no, updated_date, updated_type, address, business_no, ceo_name, cnt_total,
company_name, fee, is_agreed, manager_email, manager_name, manager_phone, product_group_no, threepl_no)
VALUES(seq_nextval('seq_history'), CURRENT_TIMESTAMP(), 'DELETED', OLD.address, OLD.business_no, OLD.ceo_name, OLD.cnt_total,
OLD.company_name, OLD.fee, OLD.is_agreed, OLD.manager_email, OLD.manager_name, OLD.manager_phone, OLD.product_group_no, OLD.threepl_no);
END
DELIMITER ;
참고 자료