1️⃣ 주문 생성
주문 만드려고 하는데 넘 헷갈려서 그려봄.
// 주문 생성
@Override
@Transactional
public OrderResponseDto addOrder(OrderRequestDto orderRequestDto) {
UUID supplyCompanyId = orderRequestDto.getOrderSupplyCompanyId(); // 공급업체 ID
CompanyInfoDto supplyCompanyInfo = companyServiceClient.getCompany(supplyCompanyId);
// 공급업체의 허브ID 검색 후 허브 재고 조회
UUID supplyCompanyHubId = supplyCompanyInfo.getCompanyHubId(); // 공급업체 담당 허브 ID
UUID orderProductId = orderRequestDto.getOrderProductId(); // 주문상품 ID
HubStockResponseDto hubStockInfo = hubServiceClient.searchHubStock(supplyCompanyHubId, orderProductId);
// 재고 부족 예외 처리
if (hubStockInfo.getHsQuantity() < orderRequestDto.getOrderProductQuantity()) {
throw new CustomApiException(OrderException.HUB_INSUFFICIENT_STOCK);
}
// 주문 생성
Order order = orderRepository.save(new Order(orderRequestDto));
// 배송 생성 요청
// 주문자(수령업체) 업체 조회
UUID receiveCompanyId = orderRequestDto.getOrderReceiveCompanyId(); // 수령업체 ID
CompanyInfoDto receiveCompanyInfo = companyServiceClient.getCompany(receiveCompanyId);
// 주문자(수령업체) 업체담당자 유저 정보 조회
UserResponseDto receiveCompanyManagerInfo = userServiceClient.getUser(receiveCompanyInfo.getCompanyManagerId());
// 배송 생성
DeliveryRequestDto deliveryRequestDto = DeliveryRequestDto.builder()
.orderId(order.getOrderId())
.supplyCompanyHubId(supplyCompanyHubId)
.receiveCompanyHubId(receiveCompanyId)
.receiveCompanyAddress(receiveCompanyInfo.getCompanyAddress())
.deliveryReceiverCompanyManagerName(receiveCompanyManagerInfo.getUserNickname())
.receiverSlackId(receiveCompanyManagerInfo.getUserSlackId())
.build();
DeliveryResponseDto deliveryInfo = deliveryServiceClient.createdDelivery(deliveryRequestDto);
// 생성된 배송ID 받아 저장
order.saveOrderDeliveryId(deliveryInfo.getDeliveryId());
return new OrderResponseDto(order);
}
- 과정
1. 공급 업체 정보 조회해서 해당 업체의 담당 허브 ID 가져오기
2. 가져온 허브ID와 주문상품ID로 허브 재고 조회하기
- 재고 있으면 주문 생성
- 재고 없으면 예외 처리
3. 배송 생성
- 배송 생성 메서드 Request를 위해 수령업체 조회 및 수령업체의 업체담당자 유저 정보 조회 후 배송 생성 요청
4. 생성된 배송ID 받아 주문에 저장
5. 완성된 주문 정보 반환
☄️ SpringApplication이 하위 폴더를 못 읽음
1. order-service에서 company-service 메서드를 호출할 때, 아예 company-service를 인식하지 못함.
2. api/compaines/{companyId} 조회를 해봐도 되던 API가 갑자기 404, 403, 401 에러 발생
3. SecurityConfig에서 로그인 없이 조회가능하도록 api/** 추가
4. @SpringBootApplication(scanBasePackages = {"com.fn.eureka.client.companyservice", "com.fn.common"})
- Spring Boot의 @SpringBootApplication 기본적으로 해당 클래스가 위치한 패키지를 기준으로 하위 패키지를 모두 스캔함.
- 하지만, common 모듈과 같은 외부 패키지의 경우, scanBasePackages 속성을 사용하여 명시적으로 추가해야 함.
- companyservice 폴더는 SpringBootApplication의 기본 스캔 범위에 포함되지 않아서 발생한 문제였음.
5. scanBasePackages에 companyservice 폴더를 추가해주니 해결!
2️⃣ 주문 조회 + 주문 리스트 조회 (전체/허브별/배송담당자별/업체별)
// 주문 조회
@Override
public OrderResponseDto findOrder(UUID orderId) {
Order order = orderRepository.findByOrderIdAndIsDeletedFalse(orderId)
.orElseThrow(() -> new CustomApiException(OrderException.ORDER_NOT_FOUND));
return new OrderResponseDto(order);
}
// 주문 리스트 조회
@Override
public Page<OrderResponseDto> findAllOrdersByRole(String keyword, int page, int size, Sort.Direction sortDirection,
PageUtils.CommonSortBy sortBy, String userRole, UUID userId) {
List<UUID> companies = null;
List<UUID> deliveries = null;
UUID companyId = null;
switch (userRole) {
case "MASTER" :
break;
case "HUB_MANAGER" :
UUID hubId = hubServiceClient.readHubIdByHubManagerId(userId);
// 허브에 소속된 업체ID 목록
companies = companyServiceClient.readCompaniesByHubId(hubId);
// orderSupplyCompanyId, orderReceiveCompanyId 중에 해당되는 주문 리스트 조회
break;
case "DELIVERY_MANAGER" :
// 로그인 유저(배송담당자)가 담당하는 배송ID 리스트 받기
deliveries = deliveryServiceClient.readeDeliveriesByDeliveryManagerId(userId);
break;
case "COMPANY_MANAGER" :
// orderSupplyCompanyId, orderReceiveCompanyId 중에 해당되는 주문 리스트 조회
companyId = companyServiceClient.readCompanyIdByCompanyManagerId(userId);
break;
default: throw new CustomApiException(OrderException.ORDER_NOT_FOUND);
}
Page<OrderResponseDto> orders = orderQueryRepository.findAllOrdersByRole(keyword, PageUtils.pageable(page, size), userRole, userId, companyId, sortDirection, sortBy);
return orders;
}
📌 허브 - 허브관리자 1명, 업체 - 업체담당자 1명이라고 가정함.
1. 마스터 : 조건 없음. 모든 주문 조회 가능!!
2. 허브관리자
: 허브관리자ID(X-User-Id)로 허브ID 조회 > 허브ID에 소속된 업체ID 목록(companies) 조회 > companies에 해당되는 주문 모두 조회
3. 배송담당자
: 배송담당자ID(X-User-Id)로 배송ID 목록(deliveries) 조회 > deliveries에 해당되는 주문 모두 조회
4. 업체담당자
: 업체담당자ID(X-User-Id)로 업체 조회 > 해당 업체 관련된 주문 모두 조회
그리고 DDD구조로 패키지 바꿨는데 짭이었음...
OCP랑 DIP 공부해야한다, 체크...
'TIL' 카테고리의 다른 글
TIL28. FeignClient로 AI API 가져오기 + 인증 @PreAuthorize (0) | 2025.03.27 |
---|---|
TIL26. 상품 만들기 (2) - 수정, 삭제 + Git Conflict, 401 Error (0) | 2025.03.19 |
TIL25. 상품 만들기 (1) 생성, 조회 (0) | 2025.03.18 |
TIL24. 업체 만들기 (0) | 2025.03.17 |
TIL23. 공통 모듈 만들기 - Exception, BaseEntity (0) | 2025.03.14 |