DHistory

[Book] 도메인 주도 개발 시작하기 - 02. 아키텍처 개요 본문

Programming/Book

[Book] 도메인 주도 개발 시작하기 - 02. 아키텍처 개요

ddu0422 2024. 1. 23. 16:09

1. 네 개의 영역

표현 (Presentation)

: HTTP 요청을 응용 영역이 필요로 하는 형식으로 변환해서 응용 영역에 전달하고 응용 영역의 응답을 HTTP 응답으로 변환하여 전송한다. 

 

응용 (Application)

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

 

도메인 (Domain)

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

 

인프라스트럭처 (Infrastructure)

: 실제 구현 기술에 대한 것을 다룬다. (DB, Redis, SMTP 등)

 

 

2. 계층 구조 아키텍처

 

상위 계층에서 하위 계층으로의 의존만 존재한다.

 

도메인이 인프라스트럭처에 의존하면 테스트 어려움기능 확장의 어려움이 발생한다.

 

 

 

 

 

 

 

 

3. DIP (Dependency Inversion Principle)

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

고수준 모듈이 저수준 모듈을 사용하면 테스트 어려움과 기능 확장의 어려움이 발생한다.

 

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

 

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

엔티티 (Entity)

: 고유의 식별자를 갖는 객체로 자신의 라이프 사이클을 갖는다. 도메인 모델의 데이터를 포함하며 해당 데이터와 관련된 기능을 함께 제공한다.

 

밸류 (Value)

: 고유의 식별자를 갖지 않는 객체로 주로 개념적으로 하나인 값을 표현할 때 사용한다. 엔티티의 속성으로 사용할 뿐만 아니라 다른 밸류 타입의 속성으로도 사용할 수 있다.

 

애그리거트 (Aggregate)

: 엔티티와 밸류 객체를 개념적으로 하나로 묶은 것이다.

 

리포지터리 (Repository)

: 도메인 모델의 영속성을 처리한다.

 

도메인 서비스 (Domain Service)

: 특정 엔티티에 속하지 않은 도메인 로직을 제공한다. 여러 엔티티와 밸류를 필요로 하면 도메인 서비스에서 로직을 구현한다.

 

5. 요청 처리 흐름

Presentation -> Application -> Domain -> Infrastructure

 

6. 인프라스트럭처 개요

인프라스트럭처는 표현 영역, 응용 영역, 도메인 영역을 지원한다.

도메인 영역과 응용 영역에서 인프라스트럭처의 기능을 직접 사용하는 것보다 두 영역에 정의한 인터페이스를 인프라스트럭처 영역에서 구현하는 것이 시스템을 더 유연하고 테스트하기 쉽게 만들어준다.

 

하지만 무조건 인프라스트럭처에 대한 의존을 없앨 필요는 없다.

- 스프링을 사용할 경우 응용 서비슨느 트랜잭션 처리를 위해 스프링이 제공사는 @Transactional 을 사용하는 것이 편리하다.

- 영속성 처리를 위해 JPA 를 사용하는 경우 @Entity 나 @Table 과 같은 JPA 전용 Annotation 을 도메인 모델 클래스에 사용하는 것이 XML 매핑 설정을 이용하는 것보다 편리하다.

 

구현의 편리함은 DIP 가 주는 다른 장점만큼 중요하다.

 

7. 모듈 구성

도메인 모듈은 도메인에 속한 Aggregate 를 기준으로 다시 패키지를 구성한다.

 

ㄴ com.myshop
  ㄴ ui
  ㄴ application
  ㄴ domain
    ㄴ product
    ㄴ category
  ㄴ infrastructure