본문 바로가기

공부 자료/Spring

[Java MVC] DDD(Domain Driven Design)

[DDD(Domain Driven Design)]

: 도메인 주도 설계라고 부르며, 도메인 위주의 설계 기법을 의미

 

- Spring Data JDBC와 DDD는 밀접한 관련이 있기 때문에 DDD 자체의 개념을 완전히 이해하는 것은 어렵지만 Spring Data JDBC에서 사용하는 DDD 기본 개념은 이해해야 함

 

 

[Domain]

: 용어 자체는 한 마디로 우리가 실제로 현실 세계에서 접하는 업무의 한 영역을 의미

 

[리포지토리(Repository)]

: 데이터 엑세스 게층에서 DB와 상호작용 하는 역할을 하는 인터페이스

 

 

[애그리거트(Aggregate)]

: 비슷한 범주의 연관된 업무들을 하나로 그룹화 해놓은 그룹

: 애그리거트 내에는 해당 애그리거트를 대표하는 도메인이 존재하며, 하나 이상의 도메인이 있음

 

[애그리거트 루트(Aggregate Root)]

: 하나의 애그리거트를 대표하는 도메인

: 특정 집단이나 그룹의 대표

: 각 애그리거트 내의 도메인들 중에서 다른 모든 도메인과 직간접적으로 연관이 되어 있는 도메인이 애그리거트 루트

: DB 테이블 간 관계로 봤을 때, 애그리거트 루트는 부모 테이블이 되고, 애그리거트 루트가 아닌 다른 도메인은 자식 테이블이 됨. 즉, 애그리거트 루트의 기본 정보를 다른 도메인들이 외래키 형태로 가지고 있음

 

* DB 테이블 간의 관계는 외래키를 통해 맺어지지만 클래스끼리 관계는 객체의 참조를 통해 관계가 맺어짐

 

[애그리거트 객체 매핑 규칙]

1) 모든 Entiry 객체의 상태는 애그리거트 루트를 통해서만 변경이 가능 (DDD에서 중요한 핵심 규칙)

- 도메인 규칙의 일관성을 유지하기 위함

 

2) 하나의 동일한 애그리거트 내에서의 엔티티간에 객체로 참조

 

3) 애그리거트 루트 대 애그리거트 루트 간의 Entity 객체 참조

- 애그리거트 루트 간의 참조는 객체 참조 대신 ID로 참조함

- 1:N 관계일 때에는 AggregateReference 사용 가능 (테이블간 외래키 방식과 동일)

- N:N 관계일 때는 참조할 테이블에 해당되는 클래스의 @Id 필드를 멤버 변수로 가지는 별도의 참조 클래스 사용