Spring Data JDBC 기반의 데이터 액세스 계층을 연동하기 위해 제일 먼저 해야할 일은 DB의 테이블과 도메인 엔티티 클래스의 설계이다.
DDD는 도메인 주도 설계라고 해석할 수 있다. 의미 그대로 도메인 위주의 설계 기법을 말한다.
오래 전부터 많은 사람들은 어떻게 해야 더 나은 애플리케이션을 설계할 수 있을지에 대한 고민을 했고, 고민의 결과물 중 하나가 바로 DDD다.
도메인은 애플리케이션 개발에서 흔히 사용하는 용어로, 주로 비즈니스적인 업무 영역과 관련이 있다.
배달의 ㅁㅈ
같은 배달 주문 어플을 만든다고 상상해보자.
배달 주문 어플을 구현하기 위해 필요한 업무들에는 음식점과 고객, 배달원, 그리고 결제를 하기 위한 은행이나 카드사 등이 있을 것이다.
퀄리티가 높은 애플리케이션을 만들기 위해서는 필요한 업무들을 자세히 알 수록 도움이 될 것이다.
고객이 음식을 주문하는 과정과 주문 받은 음식을 처리하는 과정, 음식을 배달하는 과정 등의 도메인 지식(Domain Knowledge)들을 서비스 계층에서 비즈니스 로직으로 구현해야 하는 것이다.
한 문장으로 도메인이란 우리가 실제로 현실에서 접하는 업무의 한 영역이다.
배달 주문 어플에서 필요한 도메인을 그림으로 정리해보았다.
이제 배달 주문 앱에 필요한 도메인을 세분화해 볼 것이다.
회원, 주문, 음식, 결제는 상위 도메인이며 상위 도메인의 아래 있는 각각의 정보들을 하위 도메인이라고 볼 수 있다.
애그리거트는 위 그림과 같이 비슷한 업무 도메인들의 묶음을 뜻한다.
즉, 애그리거트는 비슷한 범주의 연관된 업무들을 하나로 그룹화 해놓은 그룹이라 생각하면 된다.
해당 그림에서의 애그리거트는 회원, 주문, 음식, 결제 총 4가지이다.
4개의 애그리거트 안에는 하나 이상의 도메인들이 있고, 각각의 애그리거트에는 해당 애그리거트를 대표하는 도메인이 존재한다.
하나의 애그리거트를 대표하는 도메인을 DDD에서는 애그리거트 루트라고 한다.
Who will be the Aggregate Root?
애그리거트 내의 도메인 중에 어떤 도메인을 애그리거트 루트로 선정해야 할까?
애그리거트 내의 도메인 중에 다른 도메인들과 직간접적으로 연관되어 있는 도메인을 발견할 수 있다.
DB 테이블 간의 관계로 보면, 애그리거트 루트는 부모 테이블이고 애그리거트 루트가 아닌 도메인들은 자식 테이블이 된다.
즉, 애그리거트 루트는 기본키 정보를 다른 도메인들이 외래키의 형태로 가지고 있다고 볼 수 있다.
DDD(Domain Driven Design, 도메인 주도 설계)는 도메인 위주의 설계 기법이다.
도메인(Domain)이란?
애플리케이션 개발에서 사용하는 도메인은 주로 비즈니스적인 어떤 업무 영역과 관련이 있다.
애플리케이션을 구현하기 위해 필요한 업무들을 자세히 알수록 퀄리티가 높은 애플리케이션을 만들 수 있다.
비즈니스 업무 영역을 의미하는 도메인 지식(Domain Knowledge)들을 서비스 계층에서 비즈니스 로직으로 구현해야 한다.
애그리거트(Aggregate)와 애그리거트 루트(Aggregate Root)는 DDD에서 사용되는 용어다.
애그리거트란 비슷한 업무의 하위 수준 도메인들의 묶음을 의미한다.
⠀
애그리거트 내의 대표 도메인을 애그리거트 루트라고 한다.
각 애그리거트 내의 도메인들 중에서 다른 모든 도메인들과 직간접적으로 연관이 되어 있는 도메인이 애그리거트 루트가 된다.
데이터베이스 테이블 간의 관계는 외래키를 통해 맺어지지만 클래스끼리 관계는 객체의 참조를 통해 관계가 맺어진다.
An In-Depth Understanding of Aggregation in Domain-Driven Design