대학교 시절과 회사에 입사한지 얼마 되지 않았을 때 까지는 아키텍처의 중요성에 대해 간과했습니다.
그나마 알고 있는 것이라고는 MVC 프레임워크 정도가 전부였습니다. 물론, MVC 프레임워크 역시 아키텍처 영역에서 보기에는 표현영역을 위한 기술 중에 하나일 뿐이지 아키텍처를 대변하지는 않습니다.
회사에서 프로젝트를 진행하면서 DDD 에 관해 접하게 되고 AA(Application Architecture) 분들과 협업을 하게 되면서 아키텍처에 대한 공부 역시 필요하다는 것을 알게 되었습니다. 사실 아키텍처 공부는 정말 끝이 없는 것 같습니다. 정확한 영역이 어디까지인지도 아직 잘 모르겠습니다. 아키텍처를 공부하다 보면 이와 관련된 수많은 다른 영역들을 접하게 됩니다. DIP, infrastructure, module, 등등 DDD에 관한 공부인지 아키텍처에 관한 공부인지 헷갈릴 때도 있었습니다.
오늘은 이렇듯 헷갈리는 아키텍처 공부 영역 가운데에서도 가장 기초적인 아키텍처의 개요에 대해 알아보고자 합니다. 아키텍처 공부에 있어 출발점이 될 부분이라고 생각하며 처음 공부 하시는 분들에게 도움이 되었으면 좋겠습니다.
네 개의 영역
아키텍처를 설계할 때 대표적으로 나누는 네 가지의 영역이 있습니다.
'표현', '응용', '도메인', '인프라스트럭처' 의 네 영역입니다.
이 네 가지 영역에 대해 기본적인 개념을 알아보도록 하겠습니다.
'표현 영역'
'표현 영역' 또는 'UI 영역' 이라고 불리는 영역은 사용자(클라이언트)의 요청을 받아 응용 영역에 전달하고 응용 영역에서 처리하여 응답한 결과를 다시 사용자(클라이언트)에게 전달하는 역할 을 합니다.
웹 애플리케이션을 개발할 때 많이 사용되는 스프링 MVC 프레임워크가 표현 영역을 구현하기 위한 기술 중에 하나입니다. 표현 영역의 사용자는 웹 브라우저, 또는 앱을 사용하는 실제 사용자일 수 있고, 해당 도메인의 REST API를 호출하는 외부 시스템일 수 있습니다.
위의 이미지에서 볼 수 있듯 웹 애플리케이션에서 '표현영역'은 HTTP 요청을 받아 '응용영역'이 필요로 하는 형식으로 객체 변환하여 전달하고 응용 영역의 응답을 HTTP 응답으로 변환(일반적으로 json 형식)하여 전송합니다.
'응용 영역'
'표현 영역'을 통해 요청을 전달받은 '응용 영역'은 시스템이 클라이언트에 제공해야 하는 기능을 구현합니다.
예를들어, '주문생성', '주문취소', '상품상세 조회' 와 같은 기능이 있을 수 있습니다. 응용영역은 일반적으로 이러한 기능을 구현하기 위해 도메인 영역의 도메인 모델을 사용합니다.
주문을 생성하는 응용서비스를 예로 든다면 아래와 같이 주문 도메인을 활용하여 구현 가능합니다.
public class OrderCreateService {
@Transactional
public Order createOrder(OrderCreateDto orderCreateDto){
Order order = Order.builder().orderProduct(orderCreateDto.getOrderProduct).build();
order.create();
}
}
응용 서비스는 로직을 직접 수행하기보다는 도메인 모델에 로직 수행을 위임합니다. 위의 코드 역시 order를 직접 응용 서비스에서 생성하는 것이 아니라 Order 객체에서 생성하도록 하고 있습니다.
위의 그림과 같이 응용 영역은 도메인 모델을 활용하여 사용자에게 제공해야 하는 기능을 구현하며 실제 도메인 로직 구현은 도메인 모델에서 이루어지게 됩니다.
'도메인 영역'
도메인 영역은 도메인 모델을 구현하게 됩니다. Order 도메인 과 같은 주문도메인과 OrderProduct, ShippingInfo 와 같은 ValueType의 도메인 모델들이 이 영역에 위치하게 됩니다.
이러한 도메인 모델은 도메인의 핵심 기능들에 관한 로직을 구현하게 됩니다. '배송지 변경', '주문완료 처리' 등과 같은 로직들이 도메인 모델에서 구현되게 됩니다.
'인프라스트럭처 영역'
인프라스트럭처 영역은 구현 기술에 대한 부분입니다. 이 영역에서 RDBMS와 같은 DB들과 연동을 하거나 메시징 큐를 사용한다면 큐에 메시지를 전송/수신 하는 기능을 구현하고 몽고 DB 등을 사용해서 테이터베이스와의 연동을 처리합니다. 이 영역에서 SMTP 를 활용하여 메일 발송이 이루어지거나 HTTP 클라이언트를 통해 REST API 를 호출에 관한 처리가 이루어지기도 합니다.
표현 영역, 응용 영역, 도메인 영역은 구현 기술에 대해서는 다루지 않습니다. 대신 인프라스럭처 영역에서 제공하는 기능을 사용하여 필요한 기능을 구현하게 됩니다. 예를 들어 응용영역에서 DB에 저장되어 있는 데이터가 필요하다면 인프라스턱처 영역의 DB모듈을 활용하여 필욯나 정보를 불러오게 됩니다.
이렇게 오늘은 아키텍처에서 가장 중요한 4가지 영역들에 대해 알아보았습니다. 네 영역은 도메인의 복잡도에 따라 응용과 도메인을 분리하거나 한 계층으로 합치기도 하지만 일밪ㄴ적으로 표현영영꽈 응용 영역이 도메인 영역을 사용하고 도메인 영역은 인프라스턱처 영역을 사용하는 다음과 같은 아키텍처 구성을 띄게 됩니다.
이러한 계층구조는 그 특성상 상위 계층에서 하위 계층으로만 의존하고 하위 계층은 상위 계층으로 의존하지 않습니다.
다음 포스팅에서는 이러한 의존성 때문에 발생하게 되는 문제점과 이러한 문제점을 해소하기 위한 방법인 의존성 역전의 원칙DIP(Dependency Inversion Princile)에 대해 다뤄 보도록 하겠습니다.
참고 : DDD START!
'Architecture' 카테고리의 다른 글
MVC 패턴 알아보기 (0) | 2023.11.03 |
---|---|
Layered Architecture 알아보기 (1) | 2023.11.02 |
응용 서비스는 어떻게 구현해야 하는가 (0) | 2023.03.25 |
백엔드 아키텍처 개요(2) - DIP (0) | 2023.01.22 |