네 개의 영역
아키텍처를 설계할때 출현하는 전형적인 영역은 표현, 응용, 도메인, 인프라스트럭처 네 영역이다.
Presentation 영역
- UI 영역은 사용자의 요청을 받아 Application 영역에 전달하고 Application 영역의 처리 결과를 다시 사용자에게 보여주는 역할을 한다.
- 스프링 MVC 프레임워크가 presentation 영역을 위한 기술에 해당
- 웹 어플리케이션에서 Presentation 영역의 사용자는 웹 브라우저를 사용하는 사람 혹은 REST API 를 호출하는 외부 시스템일 수 있다.
- HTTP 요청을 Application 영역이 필요로 하는 형식으로 변환해서 Application 영역에 전달하고, Application 영역의 응답을 HTTP 응답으로 변환해서 전송한다.
Application 영역
- Presentation 영역을 통해 사용자의 요청을 전달받아 시스템이 사용자에게 제공해야 할 기능(주문등록, 주문취소, 상품 상세 조회)을 구현한다.
- 기능을 구현하기 위해 도메인 영역의 도메인 모델을 사용한다.
주문 취소 기능을 제공하는 Application 서비스를 예를 들면 다음과 같이 주문 도메인 모델을 사용해 기능을 구현한다.
class CancelOrderService {
fun cancelOrder(orderId: String) {
val order = findOrderById(orderId) ?: throw OrderNotFoundException(orderId)
order.cancel()
}
}
- Application 서비스는 로직을 직접 수행하기 보다는 도메인 모델에 로직 수행을 위임한다. 위 코드도 주문 취소 로직을 직접 구현하지 않고 Order 객체에 취소 처리를 위임하고 있다.
도메인 영역
- 도메인 모델을 구현한다
- 도메인 모델은 도메인의 핵심 로직을 구현한다
Infrastructure 영역
- 구현 기술에 대한 것을 다룬다. 이 영역은 RDBMS 연동 처리, 메시징 큐에 메시지를 전송하거나 수신하는 기능을 구현, MongoDB나 HBase를 사용한 DB연동, SMTP를 이용한 메일 발송 기능을 구현, HTTP 클라이언트를 이용해서 REST API 호출하는 것을 처리한다.
- 논리적인 개념을 표현하기보다는 실제 구현을 다룬다.
Domain, Applicaton, Presentation 영역은 구현 기술을 사용한 코드를 직접 만들지는 않는다. 대신 Infrastructure 영역에서 제공하는 기능을 사용해서 필요한 기능을 개발한다.
- ex) Application 영역에서 DB에 데이터 보관된 데이터가 필요하면 Infrastructure 영역의 DB 모듈을 사용해서 데이터를 읽어오고, 외부에 메일을 발송해야하면 Infrastructure가 제공하는 SMTP 연동 모듈을 이용해 메일을 발송한다.
계층 구조 아키텍처
Presentation, Application 영역은 Domain 영역을 사용하고, Domain 영역은 Infrastructure 영역을 사용하므로 계층 구조를 적용하기에 적당하다. Domain 복잡도에 따라 Application과 Domain 을 분리하기도 하고 한 계층으로 합치기도 한다.
- 계층 구조는 특성상 상위 계층에서 하위 계층으로의 의존만 존재하고 하위 계층은 상위 계층에 의존하지 않는다.
- 표현 계층은 응용 계층에 의존하고 응용 계층이 도메인 계층에 의존하지만, 반대로 인프라스트럭쳐 계층이 도메인에 의존하거나 도메인이 응용 계층에 의존하지 않는다.
- 엄격하게 적용하면 상위 계층은 바로 아래의 계층에만 의존을 가져야 하지만 구현의 편리함을 위해 계층 구조를 유연하게 적용한다.
- 응용 계층은 바로 아래 계층인 도메인 계층에 의존하지만 외부 시스템과의 연동을 위해 더 아래 계층인 인프라 스트럭처 계층에 의존하기도 한다.
- 표현, 응용, 도메인 계층이 상세한 구현 기술을 다루는 인프라스트럭처 계층에 종속되게된다.