[architecture Series Hexagonal] 02.domainhexagon
April 11, 2025
Domain Hexagon
- 가장 깊은, 내부에 있는 헥사곤이다. 따라서 어떤 헥사곤에도 의존하지 않는다.
- DDD가 비즈니스에 대한 지식을 전달하는 매개체로 SW 코드를 강조하는 프로젝트에서 광범위하게 채택된다.
- 엔티티를 활용한 문제 영역 모델링을 한다.
- 값 객체를 통해서 표현력을 높인다.
- 어그리게이트(aggregate)를 통해서 일관성을 보장한다.
- 도메인 서비스를 활용한다.
- 정책 및 명세 패턴으로 비즈니스 규칙을 처리한다.
- POJO로 비즈니스 규칙을 정의한다.
- DDD의 내용을 굉장히 많이 사용한다.
엔티티
- Ubiquitous Language를 사용해서 통합한다.
- 실제로 유의미한 동작을 포착하고 단순 데이터 객체 이상의 의미를 부여한다.
- 문제 영역을 표현한다.
- 기술적인 요구 사항과 최대한 격리된다.
- 비즈니스 관심사에만 집중한다.
- 단순히 엔티티 객체에 데이터만 담는 ‘빈약한 도메인 모델’ 그 이상의 의미와 책임을 부여해야 한다.
- 엔티티에 본질적이지 않은 로직은 분리해서 과부화를 최대한 피해야 한다.
- 식별자를 가진다.
- 식별자는 UUID를 사용하는 방법도 있다.
- Universally unique identifier이다.
- 엔티티는 헥사고날 아키텍쳐에서 first-class citizen이다.
- 문제 영역에 대한 서술력을 높이기 위해서 객체 타입인 값 객체로 표현한다.
- 값 객체는 한 번 지정한 값은 바뀌지 않아야 하고(불변성), 만약 변경해야 한다면 값 객체 자체를 폐기하고 대체해야 한다.
어그리게이트를 통한 일관성 보장
- 엔티티와 값 객체의 그룹이 함께 전체적인 개념을 설명하는 경우다.
- 내부의 객체들은 일관되고 격리된 방식으로 동작한다.
- 어그리거트 객체에 대한 모든 변경은 해당 어그리거트에 부과되는 변경 사항에 따라 결정되는 것이 보장돼야 한다.
- 진입점은 어그리거트 루트로 알려져있다. 어그리거트의 일부인 엔티티와 값 객체들에 대한 참조를 유지한다.
- 바운더리를 통해서 바운더리 내부의 객체가 수행하는 오퍼레이션에 더 나은 일관성을 보장할 수 있게 된다.
- 어그리게이트는 최대한 작게 유지해야 한다.
- 어그리게이트 루트는 지속성 목적으로 사용된다. 따라서 어그리게이트 루트를 통해서 어그리게이트 자식 객체에 대한 변경을 수행해야 한다.
- 결과적으로 어그리게이트 루트는 컨텍스트 하위의 모든 객체를 처리하는 책임을 애그리게이트 루트에 위임한다.
도메인 서비스
- 아키텍쳐에서 애플리케이션의 서로 다른 측면을 연결하고 데이터를 처리하며 시스템 내외부 호출을 조정하는 bridge다.
- 자연스럽게 관심사의 분리 (SOC: Separation of Concerns), 모듈화, 디커플링, 그 밖의 다른 문제에 대한 대응을 한다.
- 정책(Strategy 패턴)을 통해서 문제에 대해서 코드 블록으로 캡슐화해서 비즈니스 규칙을 보다 세심하게 구조화 할 수 있다.
- 명세(Specification)은 객체의 특성을 보장하는데 사용되는 조건이나 Predicate와 같다.
- POJO를 통해서 비즈니스 규칙을 정의할 수도 있다. POJO는 자바 객체이기에 특정 라이브러리, 프레임워크에 의존하지 않기 때문에 여러 가지 면에서 재사용하기가 쉬워진다.