지그재그 상품상세페이지(PDP)의 DDD 헥사고날 아키텍처 운영 경험 및 코드 예시 분석
🤖 AI 추천
이 글은 지그재그 서비스팀에서 상품상세페이지(PDP) 서비스에 적용한 도메인 주도 설계(DDD)와 헥사고날 아키텍처의 실제 운영 경험을 공유합니다. 특히 아키텍처 설계 원칙, 포트-어댑터 패턴, 애그리거트 개념을 실제 코드 예시와 함께 설명하고 있어 백엔드 개발자, 마이크로서비스 설계에 관심 있는 개발자, 그리고 클린 아키텍처와 같은 구조적 설계를 배우고자 하는 개발자들에게 유용합니다. 주니어 개발자부터 시니어 개발자까지 아키텍처 설계 및 유지보수 관점에서 인사이트를 얻을 수 있습니다.
🔖 주요 키워드

핵심 기술: 본 글은 지그재그의 상품상세페이지(PDP) 서비스에 적용된 도메인 주도 설계(DDD)와 헥사고날 아키텍처의 실제 운영 경험을 공유하며, 특히 비즈니스 로직 보호, 코드 확장성, 테스트 용이성에 초점을 맞춥니다.
기술적 세부사항:
* 아키텍처 구조: 헥사고날 아키텍처의 핵심인 포트(Port, 인터페이스)와 어댑터(Adapter, 구현체)를 기반으로 구성됩니다.
* 도메인 중심: Hexagon 중심에는 도메인 서비스 로직이 있으며, Use Case는 인터페이스로 정의되고 Service 클래스가 이를 구현합니다.
* 애그리거트 모델: 다수의 마이크로서비스에서 정보를 가져와야 하는 PDP 특성상, 도메인 객체를 그룹화하기 위해 DDD의 애그리거트 개념을 접목하여 관리합니다.
* 처리 흐름: 외부 요청 시 Controller → Input Port → Domain → Output Port의 흐름으로 진행되며, 응답은 역방향으로 진행됩니다.
* 코드 예시: Controller, Driving Adapter(Input Port 구현체), Domain Use Case(애그리거트 획득), Driven Adapter(Output Port 구현체)의 실제 Kotlin 코드 예시를 제공합니다.
* PdpController
: @RestController
, @RequestMapping
으로 API 진입점을 정의합니다.
* PdpPageAdapter
: PdpAggUseCase
, PdpPageUseCase
등 여러 Use Case를 주입받아 PDP 페이지 생성 로직을 수행합니다.
* PdpAggService
: CatalogAggUseCase
, ShopAggUseCase
등 여러 애그리거트 Use Case를 비동기(async
)로 호출하여 최종 PdpAgg
객체를 생성합니다.
* ContentAggService
: PdpBannerQueryPort
(Output Port)를 통해 배너 정보를 가져옵니다.
* PdpBannerRedisAdapter
/PdpBannerApiAdapter
: Redis와 외부 API를 통한 배너 정보 조회/저장 Output Port 구현체를 보여줍니다.
* PdpBannerPrimaryAdapter
: Redis 캐시와 외부 API 호출 우선순위 결정 로직을 포함하는 Output Port 구현체를 설명합니다.
* 운영 단계: PDP 서버는 UI 서버 주도 처리를 위해 크게 세 단계(애그리거트 루트 생성, UI 컴포넌트 생성 및 배치, 컴포넌트 간 라인/마진 적용)를 거칩니다.
개발 임팩트:
* 유지보수성 향상: 비즈니스 로직이 외부 호출과 명확히 분리되어 코드 유지보수 비용이 절감되고 도메인 로직이 보호됩니다.
* 확장 용이성: 새로운 기능이나 외부 시스템 연동 시 기존 도메인 로직에 영향을 최소화하며 확장이 용이합니다.
* 테스트 용이성: 포트(인터페이스)를 통한 의존성 역전으로 Mocking이 원활해져 테스트 코드 작성이 쉬워집니다.
커뮤니티 반응: 원문에서는 특정 커뮤니티 반응을 직접적으로 언급하지는 않으나, 헥사고날 아키텍처와 DDD는 현대적인 소프트웨어 개발에서 널리 논의되고 채택되는 패턴입니다.