💋 레이어드 아키텍처란?
- 소프트웨어를 여러 개의 계층으로 분리해서 설계하는 방법
- 각각 계층이 서로 독립적으로 구성되어 있어서 한 계층의 변경이 다른 계층에 영향을 주지 않게 설계할 수 있다.
- 외부의 요구사항이나 세부적인 구현이 변화하더라도 도메인의 로직을 변경하지 않도록 보호하기 위해서 계층화를 하게 된다.
💋 레이어드 아키텍처의 구성
레이어드 아키텍처에 대해 대해 공부하면서 가장 혼란스러웠던 것은, 설명하는 사람마다 조금씩 다른 구성을 가지고 있었다는 것이다. 먼저, 레이어드 아키텍처의 구성은 딱 하나로 정해져 있지 않고, 애플리케이션의 크기, 복잡도, 요구사항 등에 따라 달라질 수 있다. 어떤 계층으로 정확히 나눴느냐보다도, 계층을 분리해 각 계층 사이의 의존성을 줄여서 외부 변화로부터 비즈니스 로직의 변화를 막고, 애플리케이션의 유지보수와 확장성을 높이려는 목적으로 만들어진 설계의 한 방법이라는 것을 알고, 이 목적을 달성하기 위해 이 공부를 시작하면 좋을 것 같다.
아래의 그림들처럼, 레이어드 아키텍처의 구성은 정말 다양하다.
레이어드 아키텍처를 Presentation Layer, Business Layer, Persistence Layer, Database Layer로 구성하는 경우도 있을 수 있고, 다른 구성의 레이어드 아키텍처를 적용하는 경우도 있을 수 있다! 프레젠테이션 계층, 비즈니스 로직 계층, 데이터 저장소 계층의 세 가지 계층으로 구성된 아키텍처도 일반적이다. 이 구성은 다양한 프레임워크와 라이브러리에서 적용할 수 있어서 널리 사용되고 있다.
나는 Presentation Layer, Application Layer, Domain Layer, Infrastructure Layer로 분류할 수 있는 이 네 가지 계층에 대해 공부해볼 것인데, 각각의 특징과 주의할 점에 대해서 정리해보려고 한다. 또, 당장 이 포스팅에서 공부할 내용은 아니지만, Spring 프레임워크를 사용해서 레이어드 아키텍쳐를 적용할 수 있는 방법에 대해서는 이탤릭체로 넣어 놓았다!
✔ Presentation Layer
- 사용자와 시스템 간의 상호작용을 처리한다.
- 사용자 인터페이스(UI)를 담당하며, 사용자의 입력값을 검증하고 비즈니스 로직에 따라 결과를 표시한다.
- Presentation Layer에서 비즈니스 로직을 처리하지 않아야하며, 단순히 UI를 표현하는 역할만을 수행해야 한다.
- Spring MVC와 Thymeleaf로 웹 어플리케이션, Spring WebFlux를 사용하여 비동기 웹 어플리케이션을 개발할 수 있다.
✔ Application Layer
- Presentation Layer와 Domain Layer 사이에서 비즈니스 로직을 처리한다.
- Presentation Layer로부터 전달받은 요청에 대해 Domain Layer와 데이터를 주고받으며, 요청에 대한 처리를 수행한다.
- Application Layer에서는 데이터베이스와 직접적으로 상호작용하지 않아야 하고, Domain Layer의 엔티티와 데이터를 처리하는 일만을 수행해야 한다.
- 프레젠테이션 계층, 비즈니스 로직 계층, 데이터 저장소 계층의 세 가지 계층으로 나누는 분류에서는 비즈니스 로직 계층과 비슷한 역할을 한다고 볼 수 있다.
- Spring AOP를 사용하여 로깅, 트랜잭션 처리 등의 공통 로직을 처리할 수 있고, Spring Batch를 사용하여 대용량 데이터 처리를 수행할 수 있다.
✔ Domain Layer
- 비즈니스 로직을 처리하는 핵심 계층으로, 시스템의 핵심 로직이 담겨 있다.
- 주요 역할은 데이터의 유효성 검증, 엔티티 간의 관계 처리, 비즈니스 로직 수행 등이 있다.
- Domain Layer에서는 Infrastructure Layer 계층을 직접적으로 참조하면 안되며, 해당 계층은 순수한 비즈니스 로직만을 담당해야 한다.
- Spring Data JPA를 사용하여 ORM(Object-Relational Mapping)을 구현할 수 있고, Spring Data Redis를 사용하여 Redis와 상호작용할 수 있다.
✔ Infrastructure Layer
- 시스템의 하부 기술적인 부분을 담당하며, 데이터베이스, 네트워크, 파일 시스템 등과 관련된 로직을 처리한다.
- 주요 역할은 시스템의 기술적인 문제 해결과 데이터의 영속성을 보장하는 것이다.
- Infrastructure Layer에서는 도메인 계층과의 상호작용을 최소화해야 한다.
- Spring JDBC를 사용하여 JDBC를 쉽게 사용할 수 있고, Spring Messaging을 사용하여 메시징 시스템과 상호작용할 수 있다.
레이어드 아키텍처를 구현하면서 주의할 점은 각 계층이 각자의 역할을 수행하도록 분리되어야 한다는 것이다.
레이어드 아키텍처에서는 계층 간의 의존성이 최소화되어야 하므로, 각 계층은 단방향으로 상위 계층의 기능만 사용할 수 있도록 구현해야 한다.