PPAK

[Spring/SpringBoot] Spring Boot Layered Architecture 본문

spring

[Spring/SpringBoot] Spring Boot Layered Architecture

PPakSang 2022. 7. 31. 00:21

Spring MVC 패턴에서 핸들러 어댑터에 의해 호출되는 Controller 는 클라이언트의 요청에 따른 서버 로직을 수행해야 한다.

 

대표적으로 수행해야하는 로직으로는 아래 3가지가 존재한다.

 

1. 요청 값의 유효성 판별

2. 비즈니스(서비스) 로직 수행

3. 결괏값 보존(영속화)

 

위와 같이 명확하게 역할이 분리된 상황에서 Controller 가 모든 역할을 부담하는 것은 유지 보수 측면에서나, 역할과 책임 그리고 관심사의 분리를 중요시하는 객체지향적 관점에서나 적절하지 않는 전략일 것이다.

 

따라서 Spring Boot 에서는 Controller(Presentation) - Service(Business) - Repository(Data Access 혹은 Persistence) 의 3 가지 레이어를 두고 서버 로직을 수행하는 Layered Architecture 방식을 사용한다.

 

 

 

Controller

 

1. 실질적인 Spring MVC 객체로, Client 의 요청을 직접적으로 가공하여 Service Layer 로 전달하는 역할을 수행합니다. 

 

2. Client 의 요청(request) 정보는 일반적인 parameter 형식일 수도 있고, JSON 형태의 데이터일 수도 있습니다.

 

3. 해당 요청 정보가 서비스에서 요구하는 형식과 일치하는지 검증하고, 일치하다면 가공하여 다음 Layer(Service) 에 전달하는 역할을 합니다.

 

Service

 

1. 비즈니스 로직을 수행하고, 하나의 로직은 하나의 Transaction 으로 이루어져 있습니다.

 

2. 비즈니스 로직 수행 간 데이터베이스에 접근해야하는 경우에는 다음 Layer(Repository) 를 호출하여 수행합니다.

 

3. 이 외에도, 요청 정보가 유효한지(Validation) 체크하고, 비즈니스 로직 접근 권한(Authorization) 을 관리합니다.

 

Repository

 

1. 쿼리가 생성되는 계층, 직접 데이터베이스에 쿼리를 생성하고 전송합니다.

 

2. 다시 말해 도메인 객체를 영속화하고, 전송된 쿼리의 결과를 통해 얻은 영속화 객체를 바탕으로 서비스 레이어에 필요로 하는 데이터를 반환합니다.

 

기본적으로 각 레이어는 하위 레이어에는 의존할 수 있으나, 같은 레이어 혹은 상위 레이어는 의존하지 않음으로써 순환참조를 방지합니다.

(의존의 단방향성)

 

실제 프로젝트를 진행하면서 같은 레이어에 존재하는 Repository 끼리 의존관계를 형성하려 했으나 명확한 계층구조가 확보되지 않는 이상은 사용하지 않는 것이 낫습니다.

 

DTO : 각 계층 간 데이터의 교환이 필요한 경우 사용할 수 있는 객체(Data Transfer Object) 로 기본적으로 각 서비스 로직별 관심있는 데이터를 하나로 묶기 위해서 사용합니다. 영속화된 객체를 직접 다루지 않음으로써 데이터 무결성을 지키는데에도 좋습니다.

Comments