웹 계층 구조
스프링의 웹 계층은 위 그림처럼 이루어져있다.
(1) Web Layer, (2)Service Layer, (3)Repository Layer 로 크게 세가지로 볼 수 있으며 각 레이어간 데이터를 공유할 때 (1)Domain(Entity), (2)DTO 를 통해 공유한다.
각 계층간 흐름은 아래 그림과 같다.
)이미지출처
하위 계층 부터 살펴보겠다.
Repository Layer
- 레퍼지토리 계층은 내 애플리케이션과 DB간의 연동을 책임지는 부분이다.
- DB와의 간단한 CRUD등을 구현한다.
- 내가 수강하고 있는 김영한 강사님의 강의에서는 구현체를 사용해서 Repository를 구성하였다. 내가 생각할 때 구현체로 레포지토리를 구현하는 장점에는 아래와 같은 것들이 있는 것 같다.
- 프로젝트에서 사용되는 DB의 종류는 언제든지 변경될 수 있음, 구현체로 구현하면 이러한 변경에 유연하게 대처 가능
- 스프링 부트에서는 DB에 접근하는 다양한 방법을 제시함(ex. JDBC, JDBC Template, JPA 등) 구현체로 레포지토리를 만들면 이런 DB 접근 방식 변경에 용이
🎈 *구현체: * 인터페이스 또는 추상 클래스를 직접 구현한 클래스
Service Layer
프로젝트의 비즈니스 로직을 책임지는 계층이다.
레퍼지토리 계층을 통하여 DB와 상호작용한다.
레퍼지토리 계층과 상호작용 할 때는 Domain 모델을 사용하여 상호작용한다.
최근 패러다임에서는 DDD(Domain Driven Design, 도매인 주도 설계)를 많이 사용하는 추세로, 이러한 경우에는 서비스 계층의 역할이 구현보다는 검증에 초점이 맞춰진 느낌인 것 같다.
- DDD 에서는 핵심 로직을 서비스 계층이 아닌, Domain 모델 내부에서 구현한다.
- 이에 따라 서비스 계층에서 처리하는 로직의 내용이 줄어든다.
- 나중에 기회가 되면 DDD에 대해서도 포스팅 하겠다.
물론 지금 나는 스프링 쪼랩이니 전통적인 계층 구조로 먼저 연습할거다..
Web Layer
- Controller 또는 뷰 템플릿 같은 최상단에서 사용자에게 보여지는 부분을 처리하는 레이어이다.
- 클라이언트에게 요청을 받으면 처리하고, 이에 대한 리턴값을 반환해준다.
- 사용자에게 요청을 받을 값을 DTO모델에 담아서 서비스 계층으로 데이터를 넘져준다. 이후 서비스 계층에서 로직을 처리한다.
Domain Model
- DB의 테이블을 클래스로 구현한 모델이다.
- Entity라고도 많이 불린다.
- 서비스 계층과 레퍼지토리 계층에서 주로 사용된다.
DTO
- 최 상단의 웹 계층에서, 클라이언트에게 전송 받은 데이터를 포장하는 모델이다.
- 웹 계층에서는 클라이언트가 전송한 데이터가 담긴 DTO 객체를 받은 후, 그 값들을 서비스 계층으로 전달한다.
Domain VS DTO ?
언뜻 살펴보면 도메인과 DTO의 개념이 같은 것으로 보여 혼동될 수 있다.
🎈 Domain: DB의 테이블을 클래스 모델로 구현
- Domain은 DB의 테이블 내용을 구현함으로써, 애플리케이션과 DB가 상호작용하는데 사용되는 도와주는 모델
- 주로 애플리케이션 하위 계층에서 사용
🎈 DTO: 클라이언트의 요청 형태(form)를 클래스 모델
- DTO는 애플리케이션의 최상단에서, 사용자의 요청 데이터를 받아오기 위해 사용되는 모델
상황에 따라서 하나의 모델을 Domain과 DTO로 겸용하여 사용할수도 있겠지만, 개인적으로는 좋지 못한 방법인 것 같다.
- DTO는 단지 데이터를 받아오기 위한 수단! 그 이상도 이하도 아니다. 웹 계층에서 데이터를 받아오는 경우를 제외하면, DTO 객체가 돌아다닐 일은 없다.
- 반면 Domain(Entity)는 DTO보다 유의미 한 모델이다.
- Domain 객체는 실제 DB에 반영될 수 있는 데이터를 가지고 있는 좀 더 중요한 객체이다.
- Domain과 DTO을 안전하게 분리하여 별도로 사용하는 것이, 내 생각에는 좀더 바람직한 방법인 것 같다.
'Back End > Spring && Spring Boot' 카테고리의 다른 글
스프링 부트 DB 연동(MySQL, JDBC Template) (0) | 2024.06.01 |
---|---|
[Spring boot] URL로 파라미터 넘기기(@PathVariable, @RequestParam) (0) | 2024.06.01 |
[인프런 강의] 스프링 빈 설정하기 (0) | 2024.06.01 |
[인프런강의] 스프링 웹 개발 기초(정적 컨텐츠, MVC, API) (0) | 2024.06.01 |
[인프런 강의] 3. 스프링 부트 프로젝트를 jar 파일로 빌드하고 실행하기 (0) | 2024.06.01 |