Spring 웹 계층 구조, Spring Web Layer

권하준·2024년 4월 24일
1

Spring Boot

목록 보기
7/14
post-thumbnail

웹 계층 구조

이미지출처

스프링의 웹 계층은 위 그림처럼 이루어져있다.

(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을 안전하게 분리하여 별도로 사용하는 것이, 내 생각에는 좀더 바람직한 방법인 것 같다.
profile
자바 BE 개발자 지망생입니다.

0개의 댓글