스프링 - 계층 구조

Spring

Posted by kwon on 2020-07-08

스프링 계층 구조

  • 진행중인 프로젝트에서 계층 구조를 고려하여 각 계층의 역할을 제대로 분담하도록 하기 위해 스프링의 계층 구조에 대해 조사해 정리한다.
  • 스프링 부트와 AWS로 혼자 구현하는 웹 서비스라는 책의 계층 구조에 관한 내용을 참고하였다.

용어 정리

DTO
  • 각 계층간 데이터 교환을 위한 자바 객체를 의미.
  • 데이터를 각 레이어 간에 전달하는 목적을가지며 객체의 속성과 getter, setter만 가지고 있다. (VO : value Object 라고도 함)
DAO
  • DB를 사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 객체

  • View Layer와 DB Layer의 역할 분리를 철저하게 하는 것이 좋다.
  • 실제로 Controller에서 결괏값으로 여러 테이블을 조인해서 줘야 할 경우가 빈번하므로 Entity 클래스 만으로 표현하기가 어려운 경우가 많다.
  • Entity 클래스와 Controller에서 쓸 DTO는 분리해서 사용해야 한다.

스프링 웹 계층

  • 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 참조vs_write

Web Layer

  • 흔히 사용하는 컨트롤러와 뷰 템플릿 영역이다.
  • 이외에도 필터, 인터셉터, 컨트롤러 어드바이스 등 외부 요청과 응답 에 대한 전반적인 영역을 의미한다.

Service Layer

  • @Service 에 사용되는 서비스 영역이다.
  • 일반적으로 Controller와 Dao의 중간 영역에서 사용된다.
  • @Transactional 이 사용되어야 하는 영역이기도 하다.
  • 서비스에서는 트랜잭션과 도메인 간의 순서만 보장한다.

Repository Layer

  • Database 와 같이 데이터 저장소에 접근하는 영역이다.
  • Dao(Data Access Object) 영역이라고 생각하면 된다.

DTOs

  • DTO(Data Transfer Object)는 계층 간에 데이터 교환을 위한 객체 를 의미, DTOs는 이들의 영역을 의미한다.
  • 예를 들어, 뷰 템플릿 엔진에서 사용될 객체나 Repository Layer에서 결과로 넘겨준 객체 등이 이들을 말한다.

Domain Model

  • 도메인이라 불리는 개발 대상을 모든 사람들이 동일한 관점에서 이해할 수 있고 공유할 수 있도록 단순화시킨 것을 도메인 모델이라 한다.
  • 비즈니스 로직을 처리하는 영역이다.
  • 이를테면 택시 앱이라 하면 배차, 탑승, 요금 등이 모두 도메인이 될 수 있다.
  • @Entity 가 사용된 영역 역시 도메인 모델이라고 이해하면 된다.
  • 다만, 무조건 데이터베이스의 테이블과 관계가 있어야 하는 것은 아니다.
  • VO처럼 값 객체들도 이 영역에 해당한다.

왜 비즈니스 로직을 도메인 계층에 작성하는가

  • Service Layer는 다양한 Model(Domain)을 읽어 제공한다. 복잡한 서비스는 더 많은 Model을 읽어 서비스를 제공하기 때문에 Service 로직의 복잡도가 매우 높아진다.
  • 이런 로직의 복잡도를 낮추기 위해 최대한 비즈니스 로직을 Model(Domain)쪽으로 이동시킨다.
  • 복잡도를 낮춤으로써 유지보수와 테스트하기 쉬운 코드가 생기고 결국엔 유연한 Software를 얻을 수 있다.

Service Layer 작성 시 주의사항

  • Service는 다른 Service를 조합하거나 DAO를 연결하는 역할을 수행.
  • Service는 가볍게, Service에 핵심 비즈니스 로직을 구현하기 보다는 로직의 상태값을 가지고 있는 모델이 담당해야 한다.
  • Service에서 Service를 참조 가능하나 계층 구조가 명확해야한다.
    • (순환참조를 방지하기 위해서)

참조
스프링 부트와 AWS로 혼자 구현하는 웹 서비스
<https://nesoy.github.io/articles/2018-04/why-close-to-domain>
<https://happyer16.tistory.com/entry/Spring-layered-architecture와-객체지향적으로-개발하기>
<https://umbum.tistory.com/1066>
<https://velog.io/@sumusb/Spring-Service-Layer에-대한-고찰>