구매상품 배송조회
작성: 0chil구매상품 응답 V2·V3에 nullable deliveryTrackingUrl을 제공한다.
기존 deliveryCompany와 trackingNumber 응답은 입력 원문을 유지한다.
purchased_product.delivery_carrier는 정규화한 배송사 enum 이름을 저장하는 nullable VARCHAR(20) 컬럼이다.
OrderDeliveryService에서 DeliveryCarrier.from()으로 배송사 원문을 정규화해 Repository에 전달한다.
엔티티와 JDBC 일괄 UPDATE는 전달받은 배송사 원문과 정규화 값을 함께 저장한다.
배송조회 URL은 조회 서비스에서 createPurchasedProductDeliveryTrackingUrl()로 조립한다.
주문·구매·구매상품 응답은 각 서비스에서 직접 생성하며, 구매상품 응답을 생성할 때 URL을 함께 조립한다.
DTO는 응답 필드만 가진다. URL 전달을 위한 중간 Map은 생성하지 않는다.
| 정규화 값 | 지원하는 배송사 표현 |
|---|---|
| CJ | CJ대한통운, 대한통운, CJ대한통운(연동), 씨제이택배(CJ-GLS) |
| LOGEN | 로젠택배 |
| POST | 우체국택배, 우체국택배(연동), 우체국 |
| LOTTE | 롯데택배, 롯데글로벌로지스 |
| GSPOSTBOX | GS편의점택배 |
| CUPOST | CU편의점택배 |
| HANJIN | 한진택배, 한진 |
배송사 표현은 앞뒤 공백과 영문 대소문자를 정규화해 매핑한다.
미지원 배송사는 원문만 저장하고 정규화 값과 조회 링크는 null로 처리한다.
정규화 중 미지원 배송사가 등장하면 LogChannel.MANAGEMENT로 WARN 관리 알림을 남긴다.
알림에는 배송사 원문, 주문 ID, 구매 ID, 구매상품 ID 목록을 포함한다. 배송 정보 저장은 계속 진행한다.
송장번호가 없거나 공백뿐이어도 링크는 null이다.
링크 생성 시 송장번호의 공백과 하이픈을 제거한다. 제거 후 송장번호가 비어 있어도 링크는 null이다.
배송사 코드는 매핑 결과이며 입력 표현으로 취급하지 않는다.
주문 관리 화면
Section titled “주문 관리 화면”주문 상세의 구매상품 배송 정보 옆에 deliveryTrackingUrl로 연결되는 ‘배송조회’와 ‘링크 복사’를 표시한다.
배송조회는 새 탭에서 열고, 링크 복사는 기존 클립보드 처리와 성공·실패 토스트를 재사용한다.
조회 링크가 없으면 두 작업은 표시하지 않는다.
배송 정보 아래에 구분선을 두고, 외부 주문번호와 상세 열기는 구매상품 정보의 맨 아래 행에 표시한다.
운영 환경은 ddl-auto=validate이므로
purchased-product-delivery-carrier.sql의
ALTER TABLE을 애플리케이션 배포 전에 적용한다.
새 버전을 배포하고 구버전 인스턴스가 모두 종료된 뒤 같은 파일의 UPDATE로 기존 데이터를 백필한다.
백필 전에는 아직 정규화되지 않은 기존 구매상품의 조회 링크가 null이다.
백필은 배송사 원문·송장번호·상태·감사 시각을 변경하지 않으며, UPDATE만 재실행할 수 있다.
SQL은 자동 실행되지 않는다.