TIL27. 주문 만들기 + Client 연결 실패 문제 해결!

2025. 3. 21. 23:21·TIL

어제 그냥 밤 9시 반에 일찍 자버렸다...

 

 

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 공부해야한다, 체크...

728x90

'TIL' 카테고리의 다른 글

TIL29. 내배캠 3차 프로젝트 WaitLess 회고  (0) 2025.06.23
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
'TIL' 카테고리의 다른 글
  • TIL29. 내배캠 3차 프로젝트 WaitLess 회고
  • TIL28. FeignClient로 AI API 가져오기 + 인증 @PreAuthorize
  • TIL26. 상품 만들기 (2) - 수정, 삭제 + Git Conflict, 401 Error
  • TIL25. 상품 만들기 (1) 생성, 조회
hnajeahi
hnajeahi
개발 스터딩
  • hnajeahi
    hnajeahi-hub
    hnajeahi
  • 전체
    오늘
    어제
    • 전체보기 (96)
      • 개발일기 (3)
      • 코딩테스트 (64)
      • TIL (29)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

    • 블로그 이사왔음!
  • 인기 글

  • 태그

    해시
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
hnajeahi
TIL27. 주문 만들기 + Client 연결 실패 문제 해결!
상단으로

티스토리툴바