레이어드 아키텍처
레이어드 아키텍처(Layered Architecture)란, 애플리케이션의 컴포넌트를 유사 관심사를 기준으로 레이어로 묶어 수평적으로 구성한 구조를 의미한다. 레이어드 아키텍처는 여러 방면에서 쓰이는 개념이고 어떻게 설계하느냐에 따라 용어와 계층의 수가 달라지게 된다.
일반적으로 레이어드 아키텍처는 3 or 4계층 구성을 의미한다. 이 차이는 인프라(데이터베이스) 레이어의 추가 여부로 결정된다.
3계층으로 예를 들면 이러하다.
프레젠테이션 계층
-> 애플리케이션의 최상단 계층으로, 클라이언트의 요청을 해석하고 응답하는 역할
-> UI나 API를 제공
-> 프레젠테이션 계층은 별도의 비즈니스 로직을 포함하고 있지 않으므로 비즈니스 계층으로 요청을 위임하고 받은 결과를 응답하는 역할만 수행한다.
비즈니스 계층
-> 애플리케이션이 제공하는 기능을 정의하고 세부 작업을 수행하는 도메인 객체를 통해 업무를 위임하는 역할을 수행한다.
-> DDD(Domain-Driven Design) 기반의 아키텍처에서는 비즈니스 로직에 도메인이 포함되기도 하고, 별도로 도메인 계층을 두기도 한다.
데이터 접근 계층
-> 데이터베이스에 접근하는 일련의 작업을 수행한다.
레이어드 아키텍처는 하나의 애플리케이션에도 적용되기도 하지만 애플리케이션 간의 관계를 설명하는 데도 사용할 수 있다. 레이어드 아키텍처 기반 설계는 아래와 같은 특징을 가진다.
위 그림은 스프링에 레이어드 아키텍처를 적용해본 것이다.
스프링 부트는 별도의 설정 없이 spring-boot-starter-web의 의존성을 사용할 때는 스프링 MVC 구조를 띠게 된다.
Spring MVC는 Model-View-Controller의 구조로 View와 Controller는 프레젠테이션 계층 영역이고, Model은 비즈니스와 데이터 접근 계층의 영역으로 구분할 수 있다. 다만 스프링 MVC 모델로 레이어드 아키텍처를 구현하기 위해서는 역할을 세분화하게 된다. 비즈니스 계층에 서비스를 배치해 엔티티와 같은 도메인 객체의 미즈니스 로직을 조합하도록 하고 데이터 접근 계층에는 DAO(Spring Data JPA에서는 Repository)를 배치해 도메인을 관리하게 된다.
스프링에 아키텍처를 적용한 모습을 설명해보면,
프레젠테이션 계층
-> 상황에 따라 유저 인터페이스(UI) 계층이라고도 한다.
-> 클라이언트와의 접점이 된다.
-> 클라이언트로부터 데이터와 함께 요청을 받고 처리 결과를 응답으로 전달하는 역할을 한다
비즈니스 계층
-> '서비스 계층'이라고도 한다.
-> 핵심 비즈니스 로직을 구현하는 영역이다.
-> 트랜잭션 처리나 유효성 검사 등의 작업도 수행한다.
데이터 접근 계층
-> 영속(Persistence) 계층이라고도 한다.
-> 데이터베이스에 접근해야 하는 작업을 한다
※ 레이어드 아키텍처를 설꼐할 때는 비즈니스 로직을 어디서 담당할지 결정하고 설계하면 좋다. 다만 비즈니스 로직은 도메인 계층에서 담당하는 것이 일반적이다.
※ 스프링에서 JPA를 사용하면 @Entity를 정의한 클래스가 도메인 객체가 되고, 이곳에서 비즈니스 로직을 설계하는 것을 추천한다. 다만 서비스 레이어에서 비즈니스 로직을 담당하는 경우도 있어 역할과 책임을 잘 구분해서 설계해야 한다.