아키텍처를 설계할 때 출현하는 전형적인 영역이 '표현', '응용', '도메인', '인프라스트럭처'의 네 영역이다. 네 영역 중 표현 영역 또는 UI 영역은 사용자의 요청을 받아 응용 영역에 전달하고 응용 영역의 처리 결과를 다시 사용자에게 보여주는 역할을 한다.

웹 애플리케이션을 개발할 때 많이 사용하는 스프링 MVC 프레임워크가 표현영역을 위한 기술에 해당한다. 웹 애플리케이션에서 표현 영역의 사용자는 웹 브라우저를 사용하는 사람일 수도 있고, REST API를 호출하는 외부 시스템일 수도 있다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/f3e89333-18f1-4774-b184-f7e62574a392/Untitled.png

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

표현 영역을 통해 사용자의 요청을 전달받는 응용 영역은 시스템이 사용자에게 제공해야 할 기능을 구현한다. 예를 들어 '주문 등록', '주문 취소', '상품 상세 조회'와 같은 기능을 구현한다. 응용 영역은 기능을 구현하기 위해 도메인 영역의 도메인 모델을 사용한다. 주문 취소 기능을 제공하는 응용 서비스를 예로 들면 다음과 같이 주문 도메인 모델을 사용해서 기능을 구현한다.

public class CancelOrderService {

    @Transactional
    public void cancelOrder(String orderId) {
        Order order = findOrById(orderId);
        if (order == null) throw new OrderNotFoundException(orderId);
        order.cancel();
    }
    ...
}

응용 서비스는 로직을 직접 수행하기보다는 도메인 모델에 로직 수행을 위임한다. 위 코드도 주문 취소 로직을 직접 구현하지 않고 Order 객체에 취소 처리를 위임하고 있다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/7349246b-d0c0-4228-9e91-b65c8e40405a/Untitled.png

응용 영역은 도메인 모델을 이용해서 사용자에게 제공할 기능을 구현한다. 실제 도메인 로직 구현은 도메인 모델에 위임한다.

도메인 영역은 도메인 모델을 구현한다. Order, OrderLine, ShippingInfo와 같은 도메인 모델이 이 영역에 위치한다. 도메인 모델은 도메인의 핵심로직을 구현한다. 주문 도메인의 경우 '배송지 변경', '결제완료', '주문 총액 계산' 과 같은 핵심 로직을 도메인 모델에서 구현한다.

인프라스트럭처 영역은 구현 기술에 대한 것을 다룬다. 이 영역은 RDBMS 연동을 처리하고, 메시징 큐에 메시지를 전송하거나 수신하는 기능을 구현하고, 몽고DB나 HBase를 사용해서 데이터베이스 연동을 처리한다. 이 영역은 SMTP를 이용한 메일 발송 기능을 구현하거나 HTTP 클라이언트를 이용해서 REST API를 호출하는 것도 처리한다. 인프라스트럭처의 영역은 논리적인 개념을 표현하기보다는 실제 구현을 다룬다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/2d9bd30a-c3dc-4d4a-b6fe-3273ae41fdf6/Untitled.png

도메인 영역, 응용 영역, 표현 영역은 구현 기술을 사용한 코드를 직접 만들지 않고 대신 인프라스트럭처 영역에서 제공하는 기능을 사용해서 필요한 기능을 개발한다. (ex. 응용 영역에서 DB에 보관된 데이터가 필요하면 인프라스트럭처 영역의 DB 모듈을 사용해서 데이터를 읽는다, 이와 비슷하게 외부에 메일을 발송해야한다면 인프라스트럭처가 제공하는 SMTP 연동 모듈을 이용해서 메일을 발송한다. c.f SMTP)

계층 구조 아키텍처

네 영역을 구성할 때 많이 사용하는 아키텍처가 아래의 그림과 같은 계층 구조이다. 표현 영역과 응용 영역을 도메인 영역을 사용하고, 도메인 영역은 인프라스트럭처 영역을 사용하므로 계층 구조를 적용하기에 적당해 보인다. 도메인의 복잡도에 따라 응용과 도메인을 분리하기도 하고 한 계층으로 합치기도 하지만 전체적인 아키텍처는 아래의 계층 구조를 따른다.

https://s3-us-west-2.amazonaws.com/secure.notion-static.com/0185620c-fad1-4f86-b3d9-84cca89069dc/Untitled.png

계층 구조는 그 특성상 상위 계층에서 하위 계층으로의 의존만 존재하고 하위 계층은 상위 계층에 의존하지 않는다. 예를 들어, 표현 계층은 응용 계층에 의존하고 응용 계층이 도메인 계층에 의존하지만, 반대로 인프라스트럭처 계층이 도메인에 의존하거나 도메인이 응용 계층에 의존하지는 않는다.

계층 구조를 엄격하게 적용하면 상위 계층은 바로 아래의 계층에만 의존을 가져야하지만 구현의 편리함을 위해 계층 구조를 유연하게 적용한다. (ex. 외부 시스템과의 연동을 위해 더 아래 계층인 인프라스트럭처 계층에 의존하기도 한다)