스프링에 대해 공부할 때 우리가 항상 배우는 중요한 개념이 바로 스프링의 웹 계층 구조이다.
Service, Repository, Controller, Entity, DTO 등이 스프링 웹 계층에 포함되는데 항상 배우면 까먹고를 반복하다 보니 명확하게 알고 가는 것이 필요할 것 같아서 정리해보고자 한다.
스프링 웹 계층을 그림으로 나타내면 다음과 같다.
1. Web Layer
웹 애플리케이션의 최상위에 위치한다.
외부의 요청을 받고 이에 응답하는 영역이며, 다른 레이어에서 발생한 예외도 처리한다.
인증을 관리하고 권한을 받지 못한 사용자에 대한 인증 거부도 진행한다.
@Controller와 JSP/Freemarker 등의 뷰 템플릿 영역이다.
필터, 인터셉터, 컨트롤러 어드바이스 등을 포함한다.
데이터 전송 객체(DTO)만 처리하도록 코드를 짜야한다.
(현실 세계에서 비유하자면 식당에서 주문을 받는 웨이터?)
2. Service Layer
Web Layer 아래의 계층으로, 애플리케이션 서비스와 인프라 서비스를 동시에 포함한다.
일반적으로 Controller와 데이터 접근 객체(DAO)의 중간 영역에 위치한다.
@Service, @Transaction이 사용되는 영역이다.
데이터 전송 객체를 메서드의 매개변수로 사용하여 도메인 모델 객체를 처리한다.
도메인 객체가 아닌 DTO만 웹 레이어로 반환할 수 있음.
(현실 세계에서 비유하자면 음식을 전달하는 웨이터?)
※ 비즈니스 로직은 Service 계층에서 처리되서는 안된다.
서비스 계층이 무의미해지고 단지 객체는 데이터 덩어리 역할만 하게 된다.
또한 서비스가 복잡해지면 많은 모델들을 불러와야하므로 로직이 매우 복잡하게 된다.
그렇기 때문에 서비스 계층에서는 트랜잭션과 도메인 간 순서보장의 기능만 하도록 구성해야 한다.
3. Repository Layer
가장 아래 계층으로 데이터 스토리지 계층과 통신하는 역할을 한다.
데이터베이스와 같은 데이터 저장소(Repository)에 접근하는 영역으로 DAO와 동일하다.
Entity를 메서드 매개변수로 가져올 수 있고 Entity를 반환한다.
(현실 세계에서 비유하자면 음식을 만드는 주방장?)
4. DTOs
데이터 전송 객체(Data Transfer Object)로, 데이터를 저장하는 역할을 한다.
스프링의 계층 간의 데이터 교환을 위한 객체이며, DTOs는 이들이 존재하는 영역을 의미한다.
뷰 템플릿 엔진에서 사용될 객체와 Repository Layer에서 Service 계층으로 넘겨준 객체 등이 DTO에 해당한다.
5. Domain Model
Entity를 의미하며, 웹 애플리케이션의 전체 라이프 사이클동안 변하지 않는다.
Value Object(VO)로 DTO와 비슷한 개념이나 DTO는 Setter를 가지기에 변할 수 있는 반면, VO는 값 객체로 불변(readonly)이다.
Domain Model은 Domain을 모든 사람이 동일한 관점에서 이해, 공유할 수 있도록 단순화시킨 것이다.
대부분 DB의 테이블와 관련 있으나 VO 등도 해당되므로 무조건 관련 있는 것은 아니다.
※ 비즈니스 로직은 Domain Model에서 처리되도록 한다.
6. 전체 흐름
7. Layered Architecture에 대입
복잡하고 규모가 큰 프로젝트를 관리할 때 사용하는 Layered Architectrue Pattern이 있다.
여기에 오늘 정리한 스프링 웹 계층을 대입해 보면 아래와 같다.
- Presentation Layer → Web Layer(@Controller, View)
- Business Layer → Service Layer (@Service)
- Persistence Layer → Repository Layer (@Repository)
참고
[Spring] 스프링 웹 계층, Spring Web Layer
스프링 웹 계층을 그림으로 나타내면 아래와 같다. 이 포스팅에서는 각 계층에 대한 설명과 계층 간 상호작용이 이루어지는 방식, 개발 시 유의할 점 등에 대해 기술한다.controllers, exception handlers
velog.io
https://lildev.tistory.com/59?category=994753
[Spring Boot & AWS] Chpt 3 - 스프링 부트에서 JPA로 데이터베이스 다뤄보자
이 글은 이동욱 님의 스프링 부트와 AWS로 혼자 구현하는 웹 서비스를 읽고 정리한 글입니다. 웹 서비스를 개발하고 운영하다 보면 항상 다루어야 할 것이 바로 데이터베이스(DB)이다. 과거에는
lildev.tistory.com
'개발 > 스프링 개념' 카테고리의 다른 글
[Spring] Session이란? (0) | 2023.01.25 |
---|---|
[Spring] Select에 @Transaction을 사용하는 이유 (0) | 2023.01.20 |
[Spring] 의존성 주입이란? (0) | 2023.01.13 |
[Spring] 영속성 컨텍스트와 @Transactional 어노테이션 (0) | 2022.11.19 |
[Spring] Open-In-View란? (0) | 2022.11.19 |