Spring Layer
Spring

Spring Layer

Web Layer

웹 애플리케이션의 최상위에 존재하는 레이어로서 외부 요청을 처리하고 응답을 사용자에게 반환하는 역할을 한다. 또한 다른 예외에서 처리한 예외도 처리한다. (exception handler) 또한 인증을 관리하고 권한 없는 사용자의 인가를 거부하는 역할을 한다.

 

Service Layer

Web Layer 바로 아래에 위치하는 계층으로 트랜잭션에 대한 경계 역할을 하며, 애플리케이션과 인프라를 포함하고 있다. 애플리케이션 서비스로는 서비스 계층의 api를 공급하며 트랜잭션의 경계 역할과 응답을 담당한다. 인프라 서비스는 외부 리소스와 통신하는 것이 포함되어있다. 컨트롤러와 다오의 중간 영역에서 많이 사용되며 @Transactional, @Service에 사용되는 레이어이다.

 

더보기

여기서 잠깐, Service에서의 @Transactional 어노테이션이란? 

 

먼저 트랜잭션은 다음과 같은 네 가지 성질을 갖는다.

 

* 원자성 - 한 트랜잭션 내에서 실행한 작업들은 하나로 간주한다. 즉, 성공 or 실패

* 일관성 - 트랜잭션은 일관성 있는 DB 상태를 유지한다.

* 격리성 - 동시에 실행되는 트랜잭션들이 서로 영향을 미치지 않도록 격리한다.

* 지속성 - 트랜잭션을 성공적으로 마치면 결과가 항상 저장되어야 한다.

 

스프링에서 @Transactional을 클래스, 메서드 위에 추가하면 이 어노테이션이 적용된 곳에는 트랜잭션 기능이 적용된 프록시 객체가 생성된다.

 

이 프록시 객체는 @Transactional이 포함된 메소드가 호출될 경우, PlatformTransactionManager를 사용하여 트랜잭션을 시작하고, 정상 여부에 따라 Commit or Rollback한다.

Repository Layer

가장 하위 계층으로 사용되는 데이터 스토리지와 통신하는 역할을 한다. 직접적으로 데이터 저장소에 접근하는 영역이다.

 

Web Layer와 Service Layer는 DTO로 통신한다. DTO는 단순히 데이터를 저장하고 전달하는 컨테이너로서 서로 다른 계층 간에 데이터를 전달하는 데 사용된다. Service Layer와 Repository Layer는 도메인을 주고받는다. 도메인은 엔티티로서 전체 라이프 사이클 동안 변경되지 않는 개체이다. 

 

  • 그렇다면 Web Layer로 반환할 때 왜 도메인을 사용하면 안되는 걸까?

도메인은 애플리케이션의 내부 엔티티를 나타낸다. (테이블) 이를 외부에 노출시킨다면 변경 가능성이 있으므로 DTO를 통해 클라이언트에게 모델을 숨기고 더 사용하기 쉬운 API를 제공할 수 있다. 또한 도메인이 외부에 노출된다면 도메인 모델을 변경해야할 때 변경의 범위가 넓어지게 된다. (유지보수 극악)