CHAPTER 2. 아키텍처 개요
1. 아키텍처
🏛️ 네 개의 영역
아키텍처의 전형적인 영역, '표현', '응용', '도메인', '인프라스트럭처'의 네 영역이다.
웹 애플리케이션에서 표현 영역은 HTTP 요청을 응용 영역이 필요로 하는 형식으로 변환해서 전달하고, 응용 영역의 응답을 HTTP 응답으로 변환해서 전송한다.
예를 들어, 표현 영역은 웹 브라우저가 HTTP 요청 파라미터로 전송한 데이터를 응용 서비스가 요구하는 형식의 객체 타입으로 변환해서 전달하고, 응용 서비스가 리턴한 결과를 JSON 형식으로 변환해서 HTTP 응답으로 웹 브라우저에 전송한다.
표현 영역을 통해 사용자의 요청을 전달받는 응용 영역은 시스템이 사용자에게 제공해야 할 기능을 구현한다. 주문 취소 기능을 제공하는 응용 서비스를 예로 들면 다음과 같이 주문 도메인 모델을 사용해서 기능을 구현한다.
public class CancelOrderService {
@Transactional
public void cancelOrder(String orderId) {
Order order = findOrderById(orderId);
if(order == null) throw new OrderNotFoundException(orderId);
order.cancel();
}
...
}
응용 서비스는 로직을 직접 수행하기보다는 도메인 모델에 로직 수행을 위임한다. 위 코드도 주문 취소 로직을 직접 구현하지 않고 Order
객체에 취소 처리를 위임하고 있다.
도메인 영역은 도메인 모델을 구현한다.
-- chap1에서 봤던 Order
, OrderLine
, ShippingInfo
와 같은 도메인 모델이 이 영역에 위치한다.
-- 도메인 모델은 도메인의 핵심 로직을 구현한다.
인프라스트럭처 영역은 구현 기술에 대한 것을 다룬다.
-- RDBMS 연동을 처리
-- 메시징 큐에 메세지를 전송하거나 수신하는 기능을 구현
-- 몽고DB나 HBase를 사용해서 데이터베이스 연동을 처리
-- SMTP를 이용한 메일 발송 기능을 구현하거나 HTTP 클라이언트를 이용해서 REST API를 호출하는 것도 처리
인프라스트럭처 영역은 논리적인 개념을 표현하기보다 실제 구현을 다룬다.
도메인, 응용, 표현 영역은 구현 기술을 사용한 코드를 직접 만들지 않는다.
대신 인프라스트럭처 영역에서 제공하는 기능을 사용해서 필요한 기능을 개발한다.
ex)
-- 응용 영역에 DB 보관 데이터가 필요하면 인프라스트럭처 영역의 DB 모듈을 사용해서 데이터를 읽어온다.
-- 외부 메일 발송을 위해 인프라스트럭처가 제공하는 SMTP 연동 모듈을 이용
🏛️ 계층 구조 아키텍처
표현, 응용 영역은 도메인 영역을 사용하고, 도메인 영역은 인프라스트럭처 영역을 사용하므로 계층 구조를 적용하기에 적당해 보인다.
도메인의 복잡도에 따라 응용과 도메인을 분리하기도 하고 한 계층으로 합치기도 하지만 전체적인 아키텍처는 아래의 그림과 같다.
계층 구조는 그 특성상 상위 계층에서 하위 계층으로의 의존만 존재하고 하위 계층은 상위 계층에 의존하지 않는다.
ex) 응용 계층이 도메인 계층에 의존하지만, 인프라스트럭처 계층이 도메인에 의존하지 않는다.
계층 구조를 엄격하게 적용하면 상위 계층은 바로 아래의 계층에만 의존을 가져야 하지만 구현의 편리함을 위해 계층 구조를 유연하게 적용한다.
ex) 응용 계층 아래 계층인 도메인 계층에 의존하지만 외부 시스템과의 연동을 위해 더 아래 계층인 인프라스트럭처 계층에 의존하기도 한다.
위 그림과 같이 응용 영역과 도메인 영역은 DB나 외부 시스템 연동을 위해 인프라스트럭처의 기능을 사용한다.
하지만 알아야 할 것은 표현, 응용, 도메인 계층이 상세한 구현 기술을 다루는 인프라스트럭처 계층에 종속된다는 점이다.
인프라스트럭처에 의존하면 '테스트의 어려움', '기능 확장의 어려움'이라는 두 가지 문제가 발생한다.
이에 대한 해답이 DIP이다.
Reference
- DDD Start! - 도메인 주도 설계 구현과 핵심 개념 익히기 - 최범균
'DDD' 카테고리의 다른 글
[DDD/도메인 주도 설계] 🏛️ chap 1. 도메인 모델 시작 - 도메인 용어 (1) | 2024.10.28 |
---|---|
[DDD/도메인 주도 설계] 🏛️ chap 1. 도메인 모델 시작 - 엔티티와 밸류 (4) | 2024.10.25 |
[DDD/도메인 주도 설계] 🏛️ chap 1. 도메인 모델 시작 - 도메인 모델 (3) | 2024.10.22 |