헥사고날 아키텍처와 도메인 주도 설계(DDD)를 적용한 구조에서 서비스 레이어와 어댑터 간의 상호작용은 주로 도메인 객체를 중심으로 이루어집니다. 아래는 일반적인 워크플로우와 모범 사례에 대한 설명입니다:
워크플로우
- 컨트롤러에서 서비스 레이어로:
- DTO에서 도메인 객체로 변환: 클라이언트로부터 요청이 들어오면 컨트롤러는 이 요청을 DTO 형태로 받습니다. 컨트롤러나 애플리케이션 계층의 초기 단계에서 이 DTO를 도메인 객체로 변환하여 서비스 레이어에 전달합니다.
- 서비스 레이어에서의 처리:
- 도메인 로직 실행: 서비스 레이어는 도메인 객체를 사용하여 비즈니스 로직을 수행합니다. 이는 모든 비즈니스 규칙이 도메인 모델에 캡슐화되어 일관되게 적용되도록 보장합니다.
- 서비스에서 포트(어댑터)를 통한 처리:
- 도메인 객체를 엔티티로 변환: 서비스 레이어에서 데이터를 저장하거나 외부 시스템과 상호작용할 때, 도메인 객체를 포트를 통해 어댑터로 보냅니다. 어댑터는 이 도메인 객체를 데이터베이스에 적합한 엔티티로 변환하여 저장합니다.
- 데이터베이스 상호작용: 어댑터는 데이터베이스에서 엔티티를 저장하거나 조회한 후, 조회된 엔티티를 도메인 객체로 변환하여 서비스 레이어로 반환합니다.
- 서비스 레이어 반환:
- 도메인 객체 반환: 서비스 레이어는 추가적인 비즈니스 로직 처리 후, 도메인 객체를 컨트롤러로 반환합니다.
- 컨트롤러 응답:
- 도메인 객체를 DTO로 변환: 컨트롤러는 반환받은 도메인 객체를 DTO로 변환하여 클라이언트에게 응답합니다. 이 변환은 클라이언트가 내부 도메인 모델과 분리된 데이터 형식을 받도록 보장합니다.
모범 사례
- 서비스 레이어에서의 도메인 객체 사용: 서비스 레이어는 비즈니스 로직을 수행하기 위해 도메인 객체를 사용합니다. 이를 통해 서비스 레이어가 기술적 세부 사항으로부터 자유로워지고, 비즈니스 규칙에 집중할 수 있습니다.
- 어댑터에서의 변환 처리: 어댑터는 도메인 객체와 엔티티 간의 변환을 처리하여 데이터베이스와의 상호작용을 관리합니다. 이를 통해 도메인 모델이 데이터 저장소의 세부 사항으로부터 격리됩니다.
이 구조는 비즈니스 로직과 기술적 구현 간의 명확한 분리를 유지하며, 아키텍처를 깔끔하고 유지보수하기 쉽게 만듭니다. 대부분의 헥사고날 아키텍처에서는 이와 같은 패턴을 따라 도메인 객체를 사용하여 서비스 레이어에서 비즈니스 로직을 처리하고, DTO는 외부와의 데이터 교환을 위해 사용됩니다.