도메인 패턴을 중심에 놓고 설계하는 DDD(Domain-Driven Design)는 도메인별로 분리를 시켜
높은 응집력과 낮은 결합도로 변경과 확장에 용이한 설계를 할 수 있도록 한다.
일반적으로 Layered Architecture는 Presentation -> Application -> Domain -> Infa 의 구조를 가진다.
Presentation
- 표현 계층 (Controller)
- 사용자의 요청을 해석하고 응답
- Client로부터 request를 받고 response를 반환하는 API 정의
Application
- 응용 계층 (Service)
- 비즈니스 로직을 정의하고 정상적으로 수행될 수 있도록 Domain 계층과 Infra 계층을 연결해주는 역할
- 많은 정보를 가지고 있지 않게 유지하는 것이 중요
- 실질적인 데이터 처리는 Domain 계층에 위임
- 트랜잭션의 단위, Entity 조회/ 저장
Domain
- 도메인 계층 (Model)
- 비즈니스에 대한 실질적인 Domain에 대한 정보를 가지고 책임지는 계층
- Entity를 활용하여 상태를 제어하는 역할에 집중
도메인 객체에 비즈니스 로직을 구현하면 객체지향적인 설계(객체에 요청)와 도메인 객체의 응집도를 높일 수 있다. 도메인 객체만 봐도 이 객체가 어떤 상태를 가지고 어떤 동작을 하는지 파악할 수 있다. 그리고 서비스 계층의 코드가 간결해져서 비즈니스 로직의 흐름이 자연스러워진다.
Infastructure
- 인프라 계층 (Repository)
- 외부와의 통신(DB)을 담당하는 계층
- 얻어온 정보를 Application 또는 Domain 계층에 전달하는 역할
Repository는 Domain을 영속화하는데 필요한 일종의 명세로 도메인 관점에서 정의를 하고 실제 구현에 대한 부분은 Infa로 분리시킨다.
DIP(고수준 모듈이 저수준 모듈에 의존하지 않도록 하기 위함)를 이용해서 도메인 계층에 Repository 추상화를 만들고 실제 구현은 Infra 계층에서 하는 것이다.
아직 DDD를 잘 이해하고 있진 않은데 한번 개인 프로젝트에 써보면서 공부해봐야겠다.