Skip to content

Comments

feat: catalog-service 상품 상태 머신(Product Lifecycle) 도입#39

Open
koosco wants to merge 1 commit intomainfrom
feature/catalog-product-lifecycle
Open

feat: catalog-service 상품 상태 머신(Product Lifecycle) 도입#39
koosco wants to merge 1 commit intomainfrom
feature/catalog-product-lifecycle

Conversation

@koosco
Copy link
Owner

@koosco koosco commented Feb 22, 2026

Summary

  • 상품 상태를 ACTIVE/DELETED 2가지에서 DRAFT/ACTIVE/SUSPENDED/OUT_OF_STOCK/DELETED 5단계로 확장
  • ProductStatus.canTransitionTo()로 상태 전이 규칙을 enum 내에 정의
  • Product.changeStatus()에서 전이 검증 + DRAFT→ACTIVE 활성화 조건 검증 (name, price, SKU 1개 이상)
  • ProductStatusChangedEvent 이벤트를 outbox 패턴으로 발행하여 다른 서비스에서 반응 가능
  • CatalogIntegrationEvent 인터페이스 도입으로 SKU 레벨뿐 아니라 상품 레벨 이벤트도 지원
  • PATCH /api/products/{productId}/status 전용 상태 변경 API 추가
  • UpdateProductCommand에서 status 필드 분리 — 상태 변경은 반드시 상태 머신을 거치도록 강제

상태 전이 규칙

DRAFT → ACTIVE (필수 필드 검증 통과 시)
ACTIVE → SUSPENDED, OUT_OF_STOCK, DELETED
SUSPENDED → ACTIVE, DELETED
OUT_OF_STOCK → ACTIVE, DELETED
DELETED → (terminal)

변경 파일 (16개)

레이어 파일 변경
Domain ProductStatus.kt 상태 추가 + canTransitionTo()
Domain Product.kt changeStatus(), validateForActivation(), delete() 수정
Contract CatalogIntegrationEvent.kt 신규 — 범용 이벤트 인터페이스
Contract ProductIntegrationEvent.kt CatalogIntegrationEvent 확장으로 변경
Contract ProductStatusChangedEvent.kt 신규 — 상태 변경 이벤트
Application ChangeProductStatusUseCase.kt 신규 — 상태 변경 유스케이스
Application ProductCommand.kt ChangeProductStatusCommand 추가, UpdateProductCommand에서 status 제거
API ProductController.kt PATCH /{productId}/status 추가
API ProductRequests.kt ChangeStatusRequest 추가
Infra OutboxIntegrationEventProducer.kt CatalogIntegrationEvent 지원

Closes #33

Test plan

  • DRAFT 상태로 상품 생성 후 ACTIVE로 전이 — 필수 필드 검증 확인
  • 허용되지 않는 전이 시도 시 400 에러 반환 확인 (e.g., DRAFT → SUSPENDED)
  • ACTIVE → SUSPENDED → ACTIVE 왕복 전이 확인
  • 상태 변경 시 ProductStatusChangedEvent outbox 테이블 저장 확인
  • PUT /api/products/{id} 에서 status 필드가 무시되는지 확인
  • 기존 상품 검색 (GET /api/products)에서 ACTIVE 상태만 노출되는지 확인

🤖 Generated with Claude Code

상품 상태를 ACTIVE/DELETED 2가지에서 DRAFT/ACTIVE/SUSPENDED/OUT_OF_STOCK/DELETED 5단계로
확장하고, 상태 전이 규칙 검증 로직을 추가하여 도메인 모델의 풍부함을 높인다.

- ProductStatus enum에 상태 전이 규칙(canTransitionTo) 추가
- Product.changeStatus()에 상태 전이 검증 및 활성화 조건 검증 로직 추가
- DRAFT→ACTIVE 전이 시 필수 필드 검증 (name, price, SKU 1개 이상)
- ProductStatusChangedEvent 정의 및 outbox 패턴으로 이벤트 발행
- CatalogIntegrationEvent 인터페이스 도입으로 상품 레벨 이벤트 지원
- PATCH /api/products/{productId}/status 상태 변경 API 추가
- UpdateProductCommand에서 status 필드 분리 (상태 변경은 전용 API로만 가능)

Closes #33

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Feature] catalog-service: 상품 상태 머신(Product Lifecycle) 도입

1 participant