레이어드 아키텍처란?
소프트웨어를 여러 개의 계층으로 분리해서 설계하는 방법
각각 계층이 서로 독립적으로 구성되어 있어서 한 계층의 변경이 다른 계층에 영향을 주지 않게 설계할 수 있다.
외부의 요구사항이나 세부적인 구현이 변화하더라도 도메인의 로직을 변경하지 않도록 보호하기 위해서 계층화를 하게 된다.
레이어드 아키텍쳐의 구성
레이어드 아키텍처의 구성은 딱 하나로 정해져 있지 않고, 애플리케이션의 크기, 복잡도, 요구 사항 등에 따라 달라질 수 있다. 어떤 계층으로 정확히 나눴느냐보다도, 계층을 분리해 각 계층 사이의 의존성을 줄여서 외부 변화로부터 비즈니스 로직의 변화를 막고, 애플리케이션의 유지보수와 확장성을 높이려는 목적으로 만들어진 설계의 한 방법이라는 것을 알아야한다.
프레젠테이션 계층, 비즈니스 로직 계층, 데이터 저장소 계층의 세 가지 계층으로 구성된 아키텍쳐도 일반적이고
레이어드 아키텍처를 Presentation Layer, Business Layer, Persistence Layer, Database Layer로 구성하는 경우도 있다.
계층의 개수와 무슨 계층으로 나눈다는 것에 집중하는 것보다는 각자 처리하는 역할을 나누어 코드의 유지보수를 쉽게 한다는 것을 중점으로 생각해야할 것 같다.
여기선 Presentation Layer, Application Layer, Domain Layer, Infrastructure Layer 로 분류할 수 있는 네가지 계층에 대해 정리할 것이다.
Presentation Layer
사용자와 시스템 간의 상호작용을 처리한다.
사용자 인터페이스를 담당하며, 사용자의 입력값을 검증하고 비즈니스 로직에 따라 결과를 표시한다.
Presentation Layer에서 비즈니스 로직을 처리하지 않아야하며, 단순히 UI를 표현하는 역할만을 수행해야한다
Application Layer
Presentation Layer와 Domain Layer 사이에서 비즈니스 로직을 처리한다.
Presentation Layer로부터 전달받은 요청에 대해 Domain Layer와 데이터를 주고받으며, 요청에 대한 처리를 수행한다.
Application Layer에서는 데이터베이스와 직접적으로 상호작용하지 않아야하고, Domain Layer의 엔티티와 데이터를 처리하는 일만을 수행해야 한다.
프레젠테이션 계층, 비즈니스 로직 계층, 데이터 저장소 계층의 세가지 계층으로 나누는 분류에서는 비즈니스 로직 계층과 비슷한 역할을 한다고 볼 수 있다.
Domain Layer
비즈니스 로직을 처리하는 핵심 계층으로, 시스템의 핵심 로직이 담겨있다.
주요 역할은 데이터의 유효성 검증, 엔티티간의 관계 처리, 비즈니스 로직 수행 등이 있다.
Domain Layer에서는 Infrastructure Layer 계층을 직접적으로 참조하면 안되며, 해당 계층은 순수한 비즈니스 로직만 담당해야한다.
Infrastructure Layer
시스템의 하부 기술적인 부분을 담당하며, 데이터베이스, 네트워크, 파일 시스템 등과 관련된 로직을 처리한다.
주요 역할은 시스템의 기술적인 문제 해결과 데이터의 영속성을 보장하는 것이다.
Infrastructure Layer에서는 도메인 계층과인 상호작용을 최소화해야한다.
중요한 부분
각 계층의 각자의 역할만 수행하도록 분리되어야 한다는 것!
계층 간의 의존성이 최소화되어야 하므로, 각 계층은 단방향으로 상위 계층의 기능만 사용할 수 있도록 구현해야한다!
예제에서는 controller, service, dao, entity로 나눠서 각자 http 요청 분기, 데이터처리, query, 정보저장의 역할로 나누어 해보았다