JAVA/Architecture

[DDD] 아키텍처 계층과 도메인 구성 요소

호두밥 2022. 2. 2. 20:36

아키텍처 계층(Layerd Architecture)

표현 영역 (User Interface Layer)

사용자의 요청을 응용 영역에 전달하고, 처리 결과를 다시 사용자에게 전달하는 역할을 하는 영역입니다. 

MVC 모델에서 View에 해당합니다. 

응용 영역 (Application Layer)

사용자가 사용할 기능을 구현한 영역으로, 도메인 영역의 도메일 모델을 사용합니다. 

도메인 영역(Domain Layer)

도메인 모델을 구현한 영역입니다. (핵심 비즈니스 기능을 구현한 영역입니다.)

인프라 영역 (Infrastructure Layer)

DB 접근, 메세지 전송 등 기술을 구현한 영역입니다. 

DIP (Dependency Injection Princple)

아키텍처 계층구조는 상위 계층이 하위 계층에 의존하고, 하위 계층은 상위 계층에 의존하지 않습니다. 그러나 도메인 영역에서 인프라 영역에 직접 의존하게 되면 테스트나 기능확장이 어렵습니다. 예를 들어 도메인 영역에서 특정 DBMS에서만 사용할 수 있는 기능을 직접 호출하게 되면, DBMS를 변경하는데 영향이 크고, DBMS를 실행해야만, 직접 데이터를 조작해야지만 테스트가 가능한 어려움이 있을 수 있습니다. 

때문에 인프라 영역의 객체가 도메인 영역의 인터페이스를 상속받아 구현하게 되면, (의존성이 역전되면) 수정사항이 발생했을 때, 도메인 영역에 영향을 주지 않고, 인프라 영역의 구현객체를 수정하는 것으로만 변경이 가능해집니다. 

2022.01.11 - [JAVA/Architecture] - 의존성 주입 Dependency Injection

도메인 영역의 구성요소

Entity 엔티티

식별자가 있는 객체로 라이프 사이클을 갖습니다. 도메인 모델의 데이터를 포함하여, 해당 데이터와 관련된 기능을 함께 제공합니다. 

Value Object VO

식별자가 없는 객체입니다. 엔티티의 속성이나, 다른 VO의 속성으로 사용될 수 있습니다. 

Aggregate 애그리거트

엔티티와 VO를 개념적으로 하나로 묶어낸 것입니다. 예를 들어 주문과 관련된, 주문 Order 엔티티, 주문항목들 OrderItem VO 등을 하나의 주문 Order Aggregate로 묶을 수 있습니다. 

Repository 리포지터리

도메인 모델에서 데이터의 영속성(저장)하는 역할을 합니다. DBMS에서 Entity 객체를 가져오거나, 저장하는 기능을 합니다. 

Domain Service 도메인 서비스

특정 엔티티에 속하지 않는 도메인 로직을 제공한다. 여러 엔티티와 VO를 가져와 구현해야 하는 기능인 경우 도메인 서비스에서 로직을 구현한다. 

 

참고자료