본문 바로가기
Back-End/도메인 주도 개발 시작하기

[DDD] 도메인 주도 개발 시작하기_Ch2

by ChaSso 2023. 3. 11.

Chapter 2 아키텍처 개요

2.1 네 개의 영역

∘ 아키텍처를 설계할 때 표현, 응용, 도메인, 인프라스트럭처가 필요

 - 표현 영역(UI 영역) : 사용자의 요청을 받아 응용 영역에 전달함, 응용 영역의 처리 결과를 사용자에게 보여줌

 - 응용 영역 : 시스템이 사용자에게 제공해야 할 기능을 구현함, 도메인 영역의 도메인 모델 사용

 - 도메인 영역 : 도메인 모델을 구현함

 - 인프라스트럭터 영역 : 기술의 실제 구현

 

2.2 계층 구조 아키텍처

∘ 계층 구조의 아키텍처가 많이 사용됨. 계층 구조에서는 상위 계층에서 하위 계층으로의 의존만 존재하고 하위 계층은 상위 계층에 의존하지 않음

∘ 인프라스트럭처에 의존하면 많은 것을 만들고 나서야 테스트를 해볼 수 있다는 어려움‘, ’기능 확장의 어려움이 발생함

 

2.3 DIP

∘ DIP(Dependency Inversion principle)는 계층 구조 아키텍처의 문제를 해결하기 위해 추상화한 인터페이스를 이용해서 저수준 모듈이 고수준 모듈에 의존하도록 바꿈

∘ 고수준 모듈인 인터페이스를 구현한 것은 저수준 모듈에 속함

∘ 테스트의 어려움 -> 대역 이용해서 테스트 가능

 

2.3.1 DIP 주의사항

∘ 인터페이스를 추출해서 DIP의 구조만 만든다고 해결되는 게 아님. 인터페이스 추출했는데 고수준 모듈이 저수준 모듈에 의존하면 해결 안 된 것.

 

2.3.2 DIP와 아키텍처

∘ DIP를 적용하면 인프라스트럭처 영역이 응용 영역과 도메인 영역에 의존(상속)하는 구조

∘ 기술 변경시 도메인, 응용 영역에 영향을 덜 줄 수 있음

 

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

∘ 도메인 영역의 모델은 도메일의 주요 개념을 표현하며 핵심 로직을 구현

∘ 도메인 영영의 주요 구성요소 : 엔티티, 밸류, 애그리거트, 리포지터리, 도메인 서비스

 

2.4.1 엔티티와 밸류

∘ 도메인 모델의 엔티티 != DB 모델의 엔티티

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

 

2.4.2 애그리거트

∘ 애그리거트 : 관련 객체를 하나로 묶은 군집. 엔티티와 밸류 개수 증가로 도메인 모델이 복잡할 때 전체 구조를 이해하는 데에 도움을 줌.

 

2.4.3 리포지터리

∘ 리포지터리 : 도메인 객체 보관을 위한 도메인 모델. 애그리거트 단위로 도메인 객체를 저장하고 조회하는 기능을 정의

∘ 응용 서비스는 의존 필요한 도메인 객체를 구하거나 저장할 때 리포지터리를 사용함

∘ 응용 서비스는 트랜잭션을 관리하는데, 트랜잭션 처리는 리포지터리 구현 기술의 영향을 받음

∘ 리포지터리는 응용 서비스가 필요로 하는 애그리거트를 저장하는 메서드, 애그리거트 루트 식별자로 애그리거트를 조회하는 메서드를 제공함

 

2.5 요청 처리 흐름

∘ 사용자가 애플리케이션에 기능 실행 요청 -> 표현 영역에 요정이 전달됨 -> 표현 영역 컨트롤러가 요청을 변환한 데이터를 응용 서비스에 인자로 전달 -> 응용 서비스가 도메인 모델을 이용해서 기능 구현

 

2.6 인프라스트럭처 개요

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

∘ 구현의 편리함도 중요하기 때문에 무조건 인프라스트럭처에 대한 의존을 없앨 필요는 없음

 

2.7 모듈 구성

∘ 아키텍처의 각 영역은 별도 패키지에 위치

∘ 도메인 모듈은 도메인에 속한 애그리거트를 기준으로 다시 패키지를 구성

∘ 한 패키지에 타입 개수는 10~15개 미만이 적당함