← 프로젝트 목록

기타 도메인

CS 1:1 문의 · 약관 · 다국어 번역 · 제휴(CJ Affiliate) · 등급/포인트 · 리뷰

Domain EventAWS BedrockS3 Pre-signed URLGraphQLXSS 방어쿼리 최적화

배경 및 제약조건

  • 주문 완료 시 10개+ 후처리를 도메인 이벤트로 독립 분리 (제휴/등급/포인트/메일 등)
  • 글로벌 서비스 특성상 상품명 다국어 번역이 6개 조회 지점에 필요
  • CS 1:1 문의 시스템 — Question Aggregate 설계 + AI 답변 번역
  • 약관 동의 관리, CJ Affiliate GraphQL 연동

설계 구조

CS 1:1 문의 — Question Aggregate
├── messages: List<Message> (질문/답변)
├── addMessage() / deleteMessage() / close()
├── 이미지 첨부: S3 Pre-signed URL
├── AI 번역: AWS Bedrock (CS 답변 → 사용자 언어)
└── XSS 방어 + 이모지 안전 저장 (utf8mb4)

도메인 이벤트 기반 후처리 (OrderPaid)
├── AffiliateOrderRegistration → 커미션 계산 + 저장
├── CjOrderEventHandler → CJ GraphQL API 전송
├── RankUpgradeEventHandler → 등급 승급 + 등급 쿠폰 발행
├── PointDeductEventHandler → 포인트 차감
└── 각 핸들러: AFTER_COMMIT + @Async + REQUIRES_NEW

다국어 번역 (Adapter 레벨 적용 — 도메인 무오염)
├── CartItem / OrderItem / WishlistItem
├── ReviewItem / ProductQuery / 검색
└── normalizeProductName() 공통 정규화

Problem & Solution

Problem

후처리 10개가 하나의 트랜잭션 — 제휴 API 실패 시 결제까지 롤백

Solution

도메인 이벤트 + AFTER_COMMIT + @Async로 각 핸들러 독립 트랜잭션. 실패해도 다른 후처리에 영향 없음. 개별 재시도 가능

Problem

상품명 번역을 모든 조회 지점에 일관 적용해야 하지만 도메인 모델 오염 방지 필요

Solution

Adapter 레벨(QueryAdapter)에서 번역 적용. normalizeProductName()으로 번역된 이름에도 일관된 정규화. 도메인 모델은 번역을 모름

Problem

CS 문의 조회 성능 저하 — 어드민 답변이 누락되는 버그

Solution

memberId 조건 추가로 기존 인덱스 활용(PK range scan). 인덱스 조건 변경으로 어드민 답변 누락 해결

기술적 챌린지

AI 번역 공용 인프라

AWS Bedrock 기반 번역 서비스를 AiTranslationPort로 공용 패키지 분리. CS 답변 번역을 시작으로 다른 도메인에서도 재사용 가능한 구조

CJ Affiliate GraphQL 연동

주문 완료 시 CJ 시스템에 주문 정보를 GraphQL API로 전송. 독립 Adapter로 패키지 분리하여 외부 API 장애가 주문에 영향 없도록 격리

성과

  • 10개+ 후처리 독립 격리 — 후처리 실패가 결제에 영향 없음
  • AI 번역 서비스 공용 Port 설계 (확장 가능)
  • 상품명 번역 6개 지점 일괄 적용 (도메인 무오염)
  • CS 문의 쿼리 성능 개선 + 어드민 답변 누락 해결
  • S3 Pre-signed URL 공용 API로 이미지 업로드 통합