- 아키텍처
- DIP
- 도메인 영역의 주요 구성요소
- 인프라스트럭처
- 모듈
네 개의 영역
표현 : 사용자의 요청을 받아 응용 영역에 전달하고 응용 영역의 처리 결과를 다시 사용자에게 보여주는 역할.
웹 어플리케이션에서 표현 영역은 HTTP 요청을 응용 영역이 필요로 하는 형식으로 변환해서 응용 영역에 전달하고, 응용 영역의 응답을 HTTP 응답으로 변환해서 전송한다.
응용 : 시스템이 사용자에게 제공해야 할 기능을 구현한다. 기능을 구현하기 위해 도메인 영역의 도메인 모델을 사용한다.
응용 서비스는 로직을 직접 수행하기보다는 도메인 모델에 로직 수행을 위임한다.
도메인 : 도메인 모델을 구현한다. 도메인 모델은 도메인의 핵심 로직을 구현한다.
인프라스트럭쳐 : 구현기술에 대한 것을 다룬다. RDBMS 연동을 처리하고, 메시징 큐에 메시지를 전송하거나 수신하는 기능을 구현하고, 몽고 DB나 HBase를 사용해서 데이터 베이스 연동을 처리한다. 논리적인 개념을 표현하기보다는 실제 구현을 다룬다.
- 도메인 영역, 응용 영역, 표현 영역은 구현 기술을 사용한 코드를 직접 만들지 않는다. 대신 인프라스트럭처 영역에서 제공하는 기능을 사용해서 필요한 기능을 개발한다.
계층 구조 아키텍처
- 인프라스트럭처에 의존하면 '테스트의 어려움'과 '기능 확장의 어려움' 문제 발생.
DIP
고수준 모듈 : 의미 있는 단일 기능을 제공하는 모듈
저수준 모듈 : 하위 기능을 실제로 구현한 것
- 고수준 모듈이 제대로 동작하려면 저수준 모듈을 사용해야 한다.
- DIP는 저수준 모듈이 고수준 모듈에 의존하도록 바꾼다.
- DIP를 적용하면 앞서 다른 영역이 인프라인스트럭처 영역에 의존할 때 발생했던 두 가지 문제인 구현 교체가 어렵다는 문제와 테스트가 어려운 문제를 해소할 수 있다.
DIP와 아키텍처
- 인프라스트럭처 영역은 구현 기술을 다루는 저수준 모듈이고 응용 영역과 도메인 영역은 고수준 모듈이다.
- 인프라스트럭처에 위치한 클래스가 도메인이나 응용 영역에 정의한 인터페이스를 상속받아 구현하는 구조가 되므로 도메인과 응용 영역에 대한 영향을 주지 않거나 최소화하면서 구현 기술을 변경하는 것이 가능하다.
도메인 영역의 주요 구성요소
- 도메인 영역은 도메인의 핵심 모델을 구현함. 도메인 영역의 모델은 도메인의 주요 개념을 표현하며 핵심이 되는 로직을 구현한다.
요소 | 설명 |
엔티티 ENTITY | 고유의 식별자를 갖는 객체로 자신의 라이프사이클을 갖는다. 도메인의 고유한 개념을 표현한다. 도메인 모델의 데이터를 포함하며 해당 데이터와 관련된 기능을 함께 제공한다. |
밸류 VALUE | 고유의 식별자를 갖지 않는 객체로 주로 개념적으로 하나인 도메인 객체의 속성을 표현할 때 사용된다. 엔티티의 속성으로 사용될 뿐만 아니라 다른 밸류 타입의 속성으로도 사용될 수 있다. |
애그리거트 AGGREGATE | 애그리거트는 관련된 엔티티와 밸류 객체를 개념적으로 하나로 묶은 것이다. |
리포지터리 REPOSITORY | 도메인 모델의 영속성을 처리한다. |
도메인 서비스 DOMAIN SERVICE | 특정 엔티티에 속하지 않는 도메인 로직을 제공한다. 도메인 로직이 여러 엔티티와 밸류를 필요로 할 경우 도메인 서비스에서 로직을 구현한다. |
엔티티와 밸류
- 실제 도메인 모델의 엔티티와 DB 관계형 모델의 엔티티는 같은 것이 아님.
- 두 모델의 가장 큰 차이점은 도메인 모델의 엔티티는 데이터와 함께 도메인 기능을 함께 제공한다는 점.
도메인 모델의 엔티티는 단순히 데이터를 담고 있는 구조라기보다는 데이터와 함께 기능을 제공하는 객체이다.
- 도메인 모델의 엔티티는 두 개 이상의 데이터가 개념적으로 하나인 경우 밸류 타입을 이용해서 표현할 수 있다는 것.
RDBMS와 같은 관계형 데이터베이스는 밸류 타입을 제대로 표현하기 힘들다.
애그리거트
도메인이 커질수록 개발할 도메인 모델도 커지면서 많은 엔티티와 밸류가 출현한다.
엔티티와 밸류 개수가 많아지면 많아질수록 모델은 점점 더 복잡해진다.
도메인 모델에서 전체 구조를 이해하는 데 도움이 되는 것이 바로 애그리거트(AGGREGATE)이다.
'책' 카테고리의 다른 글
[모던 자바 인 액션] 2장 동작 파라미터화 코드 전달하기 (0) | 2020.07.12 |
---|---|
[DDD START!] 3장 애그리거트 (0) | 2020.07.04 |
[DDD START!] 1장 도메인 모델 시작 (0) | 2020.07.04 |
[DDD START!] 6장 응용 서비스와 표현 영역 (0) | 2020.07.01 |
[모던 자바 인 액션] 1장 (0) | 2020.06.26 |