본문 바로가기

[DDD START!] 2장 아키텍처 개요

  • 아키텍처
  • DIP
  • 도메인 영역의 주요 구성요소
  • 인프라스트럭처
  • 모듈

네 개의 영역

표현 : 사용자의 요청을 받아 응용 영역에 전달하고 응용 영역의 처리 결과를 다시 사용자에게 보여주는 역할.

웹 어플리케이션에서 표현 영역은 HTTP 요청을 응용 영역이 필요로 하는 형식으로 변환해서 응용 영역에 전달하고, 응용 영역의 응답을 HTTP  응답으로 변환해서 전송한다.

응용 : 시스템이 사용자에게 제공해야 할 기능을 구현한다. 기능을 구현하기 위해 도메인 영역의 도메인 모델을 사용한다. 

응용 서비스는 로직을 직접 수행하기보다는 도메인 모델에 로직 수행을 위임한다. 

도메인 : 도메인 모델을 구현한다. 도메인 모델은 도메인의 핵심 로직을 구현한다.

인프라스트럭쳐 : 구현기술에 대한 것을 다룬다. RDBMS 연동을 처리하고, 메시징 큐에 메시지를 전송하거나 수신하는 기능을 구현하고, 몽고 DB나 HBase를 사용해서 데이터 베이스 연동을 처리한다. 논리적인 개념을 표현하기보다는 실제 구현을 다룬다. 

- 도메인 영역, 응용 영역, 표현 영역은 구현 기술을 사용한 코드를 직접 만들지 않는다. 대신 인프라스트럭처 영역에서 제공하는 기능을 사용해서 필요한 기능을 개발한다. 

 

계층 구조 아키텍처

- 인프라스트럭처에 의존하면 '테스트의 어려움'과 '기능 확장의 어려움' 문제 발생.

 

 

 

 

 

 

 

 

 

 

 

DIP

고수준 모듈 : 의미 있는 단일 기능을 제공하는 모듈

저수준 모듈 : 하위 기능을 실제로 구현한 것

- 고수준 모듈이 제대로 동작하려면 저수준 모듈을 사용해야 한다. 

- DIP는 저수준 모듈이 고수준 모듈에 의존하도록 바꾼다.

- DIP를 적용하면 앞서 다른 영역이 인프라인스트럭처 영역에 의존할 때 발생했던 두 가지 문제인 구현 교체가 어렵다는 문제와 테스트가 어려운 문제를 해소할 수 있다. 

저수준 모듈이 고수준 모듈에 의존(상속은 의존의 다른 형태)

 

DIP와 아키텍처

- 인프라스트럭처 영역은 구현 기술을 다루는 저수준 모듈이고 응용 영역과 도메인 영역은 고수준 모듈이다.

- 인프라스트럭처에 위치한 클래스가 도메인이나 응용 영역에 정의한 인터페이스를 상속받아 구현하는 구조가 되므로 도메인과 응용 영역에 대한 영향을 주지 않거나 최소화하면서 구현 기술을 변경하는 것이 가능하다. 

 

도메인 영역의 주요 구성요소

- 도메인 영역은 도메인의 핵심 모델을 구현함. 도메인 영역의 모델은 도메인의 주요 개념을 표현하며 핵심이 되는 로직을 구현한다. 

요소 설명
엔티티 ENTITY 고유의 식별자를 갖는 객체로 자신의 라이프사이클을 갖는다. 도메인의 고유한 개념을 표현한다. 도메인 모델의 데이터를 포함하며 해당 데이터와 관련된 기능을 함께 제공한다. 
밸류 VALUE 고유의 식별자를 갖지 않는 객체로 주로 개념적으로 하나인 도메인 객체의 속성을 표현할 때 사용된다. 엔티티의 속성으로 사용될 뿐만 아니라 다른 밸류 타입의 속성으로도 사용될 수 있다. 
애그리거트 AGGREGATE 애그리거트는 관련된 엔티티와 밸류 객체를 개념적으로 하나로 묶은 것이다. 
리포지터리 REPOSITORY 도메인 모델의 영속성을 처리한다. 
도메인 서비스 DOMAIN SERVICE 특정 엔티티에 속하지 않는 도메인 로직을 제공한다. 도메인 로직이 여러 엔티티와 밸류를 필요로 할 경우 도메인 서비스에서 로직을 구현한다. 

 

엔티티와 밸류

- 실제 도메인 모델의 엔티티와 DB 관계형 모델의 엔티티는 같은 것이 아님.

- 두 모델의 가장 큰 차이점은 도메인 모델의 엔티티는 데이터와 함께 도메인 기능을 함께 제공한다는 점.

도메인 모델의 엔티티는 단순히 데이터를 담고 있는 구조라기보다는 데이터와 함께 기능을 제공하는 객체이다. 

- 도메인 모델의 엔티티는 두 개 이상의 데이터가 개념적으로 하나인 경우 밸류 타입을 이용해서 표현할 수 있다는 것.

RDBMS와 같은 관계형 데이터베이스는 밸류 타입을 제대로 표현하기 힘들다. 

 

애그리거트

도메인이 커질수록 개발할 도메인 모델도 커지면서 많은 엔티티와 밸류가 출현한다. 

엔티티와 밸류 개수가 많아지면 많아질수록 모델은 점점 더 복잡해진다. 

도메인 모델에서 전체 구조를 이해하는 데 도움이 되는 것이 바로 애그리거트(AGGREGATE)이다.