도메인 주도 개발 시작하기: 2. 아키텍처 개요

ParkIsComing·2023년 3월 13일
0

2.1 네 개의 영역

아키텍처는 네 개의 영역으로 이뤄져있다.

  1. 표현
  2. 응용
  3. 도메인
  4. 인프라스트럭처
  • 웹 애플리케이션의 표현 영역은 HTTP 요청을 응용 영역이 필요로 하는 형식으로 변환하여 응용 영역에 전달하고, 응용 영역에서 온 응답을 HTTP 응답으로 변환하여 보낸다.
  • 응용 영역은 시스템이 사용자에게 제공해야 할 기능을 구현한다.
  • 도메인 영역은 도메인 모델을 구현한다.
  • 인프라스트럭처 영역은 구현 기술에 대한 것을 다룬다.
  • 도메인 영역, 응용 영역, 표현 영역은 구현 기술을 사용한 코드를 직접 만들지 않고 인프라스트럭처에서 제공하는 기능을 사용해 필요한 기능을 개발한다.

2.2 계층 구조 아키텍처

  • 계층 구조는 상위 계층에서 하위 계층으로의 의존만 있고, 그 반대는 존재하지 않는다.
  • 하지만 계층 구조를 유연하게 적용하기도 하는데, 응용 계층은 바로 아래 도메인 계층과 더 아래의 인프라 스트럭처 계층 모두에 의존할 수 있다.

2.3 DIP(Dependency Inversion Principal)

  • DIP는 저수준 모듈이 고수준 모듈에 의존하도록 한다.
  • 추상화한 인터페이스를 상속받아 DIP를 실현하는 것이다.
  • DIP를 적용하면 인프라스트럭처 영역에 의존할 경우 발생하는 아래 두 가지 문제를 해결할 수 있다.
  1. 구현 교체가 어렵다.
  2. 테스트가 어렵다.

이를 앞서 언급한 계층 구조의 아키텍처에 적용해보자.

저수준 모듈 -> 인프라 스트럭처
고수준 모듈 -> 응용 영역과 도메인 영역

이 성립하는 것이다.

결국 인프라스트럭처에 위치한 클래스가 도메인 or 응용 영역에서 정의한 인터페이스를 상속받아서 구현함으로서 DIP를 실현할 수 있다.

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

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

  • 엔티티
  • 밸류
  • 애그리거트
  • 리포지터리
  • 도메인 서비스

엔티티와 밸류에 대해서 앞선 포스팅에서 언급하였으므로 넘어가고 나머지 구성 요소에 대해 알아보자.

1. 애그리거트

  • 애그리거트르란 관련 객체를 하나로 묶은 군집이다.

  • 예를 들어, 주문이라는 도메인 개념은 주문, 배송지 정보, 주문자, 주문 목록 등의 하위모델로 이뤄진다.

  • 애그리거트를 사용하면 개별 객체가 아닌 관련 객체를 묶어 거시적으로 바라볼 수 있게 된다.

  • 애그리거트는 군집에 속한 객체를 관리하는 루트 엔티티를 갖는다.

  • 루트 엔티티를 통해 다른 엔티티나 밸류에 접근하게 된다.

2. 리포지터리

  • 리포지터리는 구현을 위한 도메인 모델이다.
  • 리포지터리는 애그리거트 단위로 도메인 객체를 저장하고 조회하는 기능을 정의한다.

2.5 요청 처리 흐름

  • 표현 영역
    • 사용자가 전송한 데이터 검사, 문제 없을 경우 응용 서비스에 기능 실행 위임
    • 응용 서비스가 요구하는 형식으로 변환하여 전달.
  • 응용 서비스
    • 도메인 모델을 이용하여 기능 구현
    • 도메인 객체리를 리포지터리에서 가져와 실행 or 신규 도메인 객체를 생성해 리포지터리에 저장

2.6 인프라스트럭처 개요

  • 인프라스트럭처는 표현 영역, 응용 영역, 도메인 영역을 지원
  • DIP를 이용해 도메인 영역과 응용 영역에서 정의한 인터페이스를 인프라스트럭처에서 상속받아 구현하는 것이 시스템을 더 유연하게 만들어준다.
  • 하지만 무조건 의존을 없애려하면 더 복잡해질 수도 있다.

2.7 모듈 구성

정답은 없다. 하지만 정석적인 방법은 다음과 같다.

  • 도메인이 크면 -> 하위 도메인으로 나눠 별도 패키지 구성
  • 도메인 모듈은 도메인에 속한 애그리거트를 기준으로 다시 패키지 구성
  • 애그리커트, 모델, 리포지터리는 같은 패키지에 위치

0개의 댓글