https://www.petrikainulainen.net/software-development/design/understanding-spring-web-application-architecture-the-classic-way/

웹 어플리케이션의 책임은 예를들어 다음과 같습니다.

  • 사용자의 입력을 처리하고 올바른 응답을 사용자에게 반환해야합니다.
  • 합리적인 오류 메시지를 사용자에게 제공하는 예외 처리 메커니즘이 필요합니다.
  • 트랜잭션 관리 전략이 필요합니다.
  • 인증 및 권한 부여를 모두 처리해야합니다.
  • 응용 프로그램의 비즈니스 로직을 구현해야합니다.
  • 데이터 저장소 및 기타 외부 리소스와 통신해야합니다.

"오직"3 개의 레이어를 사용하여 이러한 모든 문제를 해결할 수 있습니다. 이러한 계층은 다음과 같습니다.

  • 웹 레이어 는 웹 응용 프로그램의 최상위 계층입니다. 사용자의 입력을 처리하고 올바른 응답을 사용자에게 반환하는 일을 담당합니다. 웹 레이어는 다른 레이어에서 던져지는 예외도 처리해야합니다. 웹 레이어는 응용 프로그램의 시작점이므로 인증을 처리하고 권한이없는 사용자를 차단하는 첫 번째 역할을 수행해야합니다.
  • 서비스 레이어 는 웹 레이어 아래에 있습니다. 트랜잭션 경계로 작동하며 응용 프로그램과 인프라 서비스를 모두 포함합니다. 응용 프로그램 서비스는 서비스 계층의 공용 API를 제공합니다. 또한 트랜잭션 경계로 작동하며 권한 부여의 책임이 있습니다. 인프라 서비스는 이러한 파일 시스템, 데이터베이스, 이메일 서버와 같은 외부 리소스와 통신하는 "배관 코드"가 포함되어 있습니다. 종종 이러한 메소드는 하나 이상의 응용 프로그램 서비스에서 사용됩니다.
  • 스토리지 레이어 는 웹 응용 프로그램의 최하위 계층입니다. 데이터 스토리지와 통신합니다.

특정 레이어에 속한 구성 요소는 동일한 레이어 또는 그 아래에 있는 레이어에 속한 구성 요소를 사용할 수 있습니다.

고전적인 Spring 웹 애플리케이션의 고수준 아키텍처는 다음과 같습니다

다음으로해야 할 일은 각 레이어의 인터페이스를 디자인하는 것이며, 이것은 DTO (데이터 전송 개체)도메인 모델과 같은 용어과 같은 용어를 사용하는 단계입니다

  • DTO는 단순한 데이터 컨테이너일 뿐이며 이러한 개체는 애플리케이션의 여러 프로세스와 계층 간에 데이터를 전송하는 데 사용됩니다.

도메인 모델은 세개의 다른 객체로 구성됩니다.

  • 도메인 서비스는 도메인 개념과 관련이 있지만 개체 또는 값 개체의 "자연스러운 "부분이 아닌 작업을 제공하는 상태 비저장 클래스입니다.
  • 엔티티는 전체 수명 주기 동안 변경되지 않은 상태로 유지되는 ID로 정의되는 개체입니다.
  • 값 객체는 속성이나 사물을 설명하며 이러한 객체는 고유한 ID나 수명 주기가 없습니다. 값 객체의 라이프 사이클은 엔티티의 라이프 사이클에 바인딩됩니다.

이제 이 용어의 의미를 알았으므로 각 레이어의 인터페이스로 이동하여 디자인 할 수 있습니다. 하나씩 레이어를 살펴 보겠습니다.

  • 웹 레이어는 DTO만 처리해야합니다.
  • 서비스 계층은 DTO (및 기본 유형)를 메소드 매개 변수로 사용합니다. 도메인 모델 객체를 처리 할 수 있지만 DTO 만 웹 레이어로 반환 할 수 있습니다.
  • 저장소 계층은 엔티티 (및 기본 유형)를 메소드 매개 변수로 사용하고 엔티티 (및 기본 유형)를 리턴합니다.

이것은 하나의 매우 중요한 질문을 제기합니다 :

DTO가 정말로 필요합니까? 엔티티와 값 객체를 웹 레이어로 되돌릴 수없는 이유는 무엇입니까?

이것이 나쁜 생각 인 두 가지 이유가 있습니다.

  1. 도메인 모델은 애플리케이션의 내부 모델을 지정합니다. 이 모델을 외부 세계에 노출 시키면 클라이언트는 이를 사용하는 방법을 알아야합니다. 즉, 우리 애플리케이션의 클라이언트는 자신이 속하지 않는 것을 처리해야합니다. DTO를 사용하는 경우 애플리케이션의 클라이언트에서이 모델을 숨기고 더 쉽고 깨끗한 API를 제공 할 수 있습니다.
  2. 도메인 모델을 외부 세계에 노출 시키면 다른 도메인을 깨뜨리지 않고 도메인 모델을 변경할 수 없습니다. DTO를 사용하는 경우 DTO를 변경하지 않는 한 도메인 모델을 변경할 수 있습니다.

고전적인 Spring 웹 애플리케이션의 "최종"아키텍처는 다음과 같습니다.