최근 springboot와 JPA를 공부하면서 새롭고 작은 지식을 하나 알았다.
여태 Service 안에서 트랜잭션 처리도 하는 등 비즈니스 로직을 처리해야 한다라고 알고 있었다.
알고보니 Service에서 비즈니스 로직을 처리하는 것이 아니였다!!!...
Service는 트랜잭션, 도메인 간 순서 보장의 역할만 한다.
아래 그림은 spring 웹 계층을 나타내는 그림이다.
간단하게 각 영역을 정리하면 다음과 같다.
Web Layer
흔히 사용하는 컨트롤러(@Controller)와 JSP/Freemarker 등의 뷰 템플릿 영역이다.
이 외에도 필터(@Filter), 인터셉터, 컨트롤러 어드바이스(@ControllerAdvice) 등 외부 요청과 응답에 대한 전반적인 영역을 이야기 한다.
Service Layer
@Service에 사용되는 서비스 영역이다.
일반적으로 Controller와 Dao의 중간 영역에서 사용된다.
@Transactional이 사용되어야 하는 영역이기도 하다.
Repository Layer
Database와 같이 데이터 저장소에 접근하는 영역이다.
DAO(Data Access Object) 영역으로 이해하면 쉽다
Dtos
DTO(Data Transfer Object)는 계층 간에 데이터 교환을 위한 객체를 이야기하며 Dtos는 이들의 영역을 이야기 한다.
ex) 뷰 템플릿 엔진에서 사용될 객체나 Repository Layer에서 결과로 념겨준 객체 등이 이들을 이야기 한다.
Domain Model
도메인이라 불리는 개발 대상을 모든 사람이 동일한 관점에서 이해할 수 있고 공유할 수 있도록 단순화시킨 것을 도메인 모델이라고 한다.
ex) 택시 앱이라고 하면 배차, 탑승, 요금 등이 모두 도메인이 될 수 있다.
@Entity가 사용된 영역 역시 도메인 모델이라고 이해하면 된다. 다만, 무조건 데이터베이스의 테이블과 관계가 있어야만 하는 것은 아니다.
VO처럼 값 객체들도 이 영역에 해당하기 때문이다.
그렇다면 Web, Service, Repository, Dto, Domain 이 5가지 레이어에서 비즈니스 처리를 담당해야 할 곳은 어디일까? 바로 Domain 이다.
기존에 서비스로 처리하던 방식을 트랜잭션 스크립트라고 한다.
주문 취소 로직을 작성한다면 다음과 같다.
위의 코드는 모든 로직이 서비스 클래스 내부에서 처리된다. 그러다 보면 서비스 계층이 무의미하며, 객체란 단순히 데이터 덩어리 역할만 하게 된다.
반면에 도메인 모델에서 처리할 경우 다음과 같은 코드가 될 수 있다.
order, billing, delivery가 각자 본인의 취소 이벤트 처리를 하며, 서비스 메소드는 트랜잭션과 도메인 간의 순서만 보장해 준다.
'TIL > Spring' 카테고리의 다른 글
[TIL/Spring] SpringBoot JUnit을 사용한 간단한 단위테스트(feat. 단위테스트와 TDD란 다른 것) (0) | 2023.02.15 |
---|---|
[TIL/Spring] 스프링 시큐리티와 OAuth 2.0으로 구글 로그인 기능 구현 (0) | 2022.10.30 |
[TIL] Spring Framework - HandlerInterceptorAdapter (0) | 2022.09.28 |
[TIL] 의존관계 자동 주입과 조회 빈이 2개 이상일 때 문제 해결하기, 조회한 빈이 모두 필요할 때 사용하는 법 (0) | 2022.08.19 |
[TIL] 컴포넌트 스캔 (0) | 2022.08.19 |