개발바닥

2장 아키텍처 개요 본문

도메인 주도 개발 시작하기

2장 아키텍처 개요

라이언 2022. 10. 19. 21:41
반응형

2.1 네개의 영역

“표현”, “응용”, “도메인”, “인프라스트럭쳐” 는 아키텍처를 설계할 때 출현하는 전형적인 네 가지 영역이다. 

책에서도 주의할 점으로 일반적으로 사용하는 구성이지 반드시 이렇게 구성해야된다는 것은 아니라고 강조하듯이 참고만 할 뿐 상황과 이점에 맞게 아키텍처를 설계하는 것이 중요하다.

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

응용 영역은 로직을 수행하기 보다는 도메인 모델에 로직 수행을 위임한다.

도메인 영역은 도메인 모델을 구현한다. 즉, 도메인의 핵심 로직을 구현한다.

인프라스트럭쳐 영역은 구현 기술에 대한 것을 다룬다. DB, 메시징 큐 등을 다룬다.

 

2.2 계층 구조 아키텍처

계층 구조는 그 특성상 상위 게층에서 하위 계층으로의 의존만 존재하고 하위 계층은 상위 계층에 의존하지 않는다. 

표현 -> 응용 -> 도메인 -> 인프라스트럭쳐로 의존을 하고 있다.

상위 계층이 하위 계층에 의존을 하게 되면 하위 계층 변화에 상위 계층이 영향을 받게 되는 문제가 발생한다.

그 뿐만 아니라 테스트 코드 작성에도 어려움이 발생하게 된다.

이러한 문제를 해결하기 위해서 DIP를 사용한다.

 

2.3 DIP

DIP는 의존 역전 원칙으로 의존하는 방향을 반대로 바꾼다.

상위 계층에서 하위 계층이 아닌 하위 계층에서 상위 계층으로 바꾸도록 하는 것이다. 

그리고 의존 주입을 위해서는 추상화한 인터페이스를 만들어야 된다.

상위 계층에서는 추상화한 인터페이스를 의존하고 있기 때문에 하위 계층이 변경이 되더라도 문제가 없거나 약간의 변화만 발생하게 된다. 

또한 테스트 코드도 완벽하게 코드가 구현이 되어 있어야만 테스트가 가능했다면 인터페이스를 통해서 해당 인터페이스 메소드를 Mock 데이터를 구성해서 반환하겠금 해서 테스트 코드를 진행할 수 있다.

DIP 주의사항으로 DIP의 핵심은 고수준 모듈이 저수준 모듈에 의존하지 않도록 하기 위함인데 DIP를 적용한 결과 구조만 보고 저수준 모듈에서 인터페이스를 추출하는 경우가 있다.

DIP를 적용할 때 하위 기능을 추상화한 인터페이스는 고수준 모듈 관점에서 도출한다.

여기서도 주의할 점으로 DIP를 반드시 사용해야 되는 것은 아니며, 상황에 따라서 사용하기를 추천하고 있다.

 

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

도메인 영역의 주요 구성요소로 "엔티티","밸류","애그리거트","리포지토리","도메인 서비스"에 대해서 설명하고 있다.

도메인 모델의 엔티티와 DB 테이블의 엔티티에 대해서 헷갈렸는데 책에서 정확하게 차이점을 알려주고 있다.

도메인 모델의 엔티티데이터와 함께 도메인 기능을 제공한다.

DB 테이블의 엔티티에는 기능을 제공하지 않는다.

 

또다른 차이점으로 도메인 모델 엔티티는 두 개 이상의 데이터 개념적으로 하나인 경우 밸류 타입을 이용해서 표현이 가능하다는 점이다.

이부분은 사실 애매한거 같다. RDBS와 같은 관계형 데이터베이스는 밸류 타입을 제대로 표현하기 어렵지만, NOSQL 데이터베이스는 밸류 타입을 표현 가능하기 때문에 애매모호한거 같다. (몽고디비만 보더라도 데이터 형식이 자유롭기 때문에 밸류 형식으로 나타내는게 가능하다.)

 

애그리거트 개념에 대해서 연관된 엔티티와 밸류 객체를 개념적으로 하나로 묶은 것이다.

개발이 진행될 수록 구조가 커지게 되면 한가지에만 집중하게 되서 큰 틀을 이해 못하는 상황이 발생하는데 그러한 상황을 막기 위해서 애그리거트로 해결할 수 있다.

애그리거트는 루트 엔티티를 통해서 속해 있는 객체를 관리한다. 해당 기능을 사용하기 위해서 반드시 루트 엔티티를 통해서 사용하도록 하는 것이 애그리거트에 원칙 중 하나이다.

 

2.5 요청 처리 흐름

앞선 장에서도 설명했듯이 4개의 영역으로 나누어져 있고 각 영역마다 기능 실행을 위임 받아서 실행한다.

표현 -> 응용 -> 도메인 -> 인프라스트럭쳐 -> 도메인 -> 응용 -> 표현 으로 순환하게 된다.

 

2.6 인프라스트럭쳐 개요

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

도메인 객체의 영속성 처리, 트랜잭션, SMTP 클라이언트, REST 클라이언트 등 다른 영역에서 필요로 하는 프레임워크, 구현 기술, 보조 기능을 지원한다.

 

2.7 모듈 구성

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

패키지 구성에 정답이 없기 때문에 관리하기 쉽도록 패키지 구성을 추천한다.

도메인 별로 구성, 영역 별로 구성 등

 

책에서 강조하듯이 아키텍처에는 정답이 없다. 상황과 이점을 잘 고려해서 적절하게 잘 사용하는 것이 중요한거 같다.

그러므로 책에 나온 그대로 구성을 하지 못했다고 고민할 필요가 없다.

 

 

 

 
 
반응형

'도메인 주도 개발 시작하기' 카테고리의 다른 글

3장 애그리거트  (0) 2022.10.22
1장 도메인 모델 시작하기  (0) 2022.10.16
Comments