표현 영역과 응용 영역
응용 영역과 표현 영역이 사용자와 도메인을 연결해 주는 매개체 역할을 한다.
- Controller
- 사용자와 상호 작용하는 영역은 표현 영역의 역할
- 표현 영역은 사용자의 요청을 해석한다.
- 웹 브라우저에서 폼에 입력한 데이터를 전송하면 요청 파라미터를 포함한 HTTP 요청을 표현 영역에 전달한다.
- Service
- URL, 요청 파라미터, 쿠키, 헤더 등을 이용해서 사용자가 실행하고 싶은 기능을 판별하고 그기능을 제공하는 응용 서비스를 실행한다.
- 표현 영역에서 파라미터로 넘어온 데이터로 어떤 서비스를 제공을 하는지는 응용 서비스의 역할이다.
웹 개발을 진행 하면서 많이 보이는 구조다.
RestController 의 코드라던지 Controller 코드라던지 이러한 영역이 표현 영역이다.
응용 서비스의 역할
사용자(클라이언트)가 요청한 기능을 실행한다.
응용 서비스는 사용자의 요청을 처리하기 위해 리포지터리에서 도메인 객체를 가져와 사용한다.
도메인 객체 간의 흐름을 제어한다.
메모.
- 응용 서비스가 복잡하다면 도메인 로직의 일부를 구현하고 있을 가능성이 높다.
- 코드의 중복이 발생되며 로직 분산 등 코드 품질에 안 좋은 영향을 줄 수 있다.
- 응용 영역의 역할의 응집도도 떨어져 코드 변경을 어렵게 만든다.
- 그러므로 응용 서비스와 도메인 로직의 역할을 재분배하여 리팩터링 해야한다.
- 응용 서비스는 트랜잭션 처리 담당도 한다.
- 도메인의 상태 변경을 트랜잭션으로 처리해야 하기 때문이다.
- 데이터의 일관성을 지키기 위해 트랜잭션 처리를 해야 한다.
도메인 로직 넣지 않기
- 응용 서비스는 도메인 로직을 구현하지 않는다고 했다.
- 예를 들어 회원 가입시에 패스워드 중복 검사 코드를 생각해보자.
- 응용 서비스에서 패스워드 중복 검사 코드가 포함되어 있으면 서비스 영역의 코드는 복잡해진다.
- 이러한 코드는 도메인 영역에 로직을 추가 해야 한다.
- 예를 들어 회원 가입시에 패스워드 중복 검사 코드를 생각해보자.
응용 서비스의 구현
- 응용 서비스를 구현할 때 몇 가지 고려할 사항과 트랜잭션과 같은 구현 기술의 연동에 대해 살펴보자.
응용 서비스의 크기
회원 도메인을 생각해보자. 응용 서비스는 회원 가입하기, 회원 탈퇴하기, 회원 암호 변경하기, 비밀번호 초기화하기와 같은 기능을 구현하기 위해 도메인 모델을 사용하게 된다.
보통 응용 서비스를 다음 두 가지 방식 중 하나로 구현한다.
- 한 응용 서비스 클래스에 회원 도메인의 모든 기능 구현하기
- 구분되는 기능별로 응용 서비스 클래스를 따로 구현하기
한 클래스에 모든 기능을 구현하게 되면 코드의 중복은 일어나지 않겠지만 복잡성과 코드의 크기가 커진다는 것이 단점이다.
결과적으로 한 클래스에 관련의 적은 기능들이 점점 모여 코드를 이해하는 데 방해가 될 수 있다는 점이다.
개발을 진행하면서 처음에 한 두개인 기능들에 점점 기능이 추가가 되면 관련된 기능끼리 묶고 역할을 잘 분배해서 리팩터링을 시도 해야한다.
응용 서비스의 인터페이스와 클래스
- 인터페이스가 명확하게 필요하기 전까지는 응용 서비스에 대한 인터페이스를 작성하는 것이 좋다.
메서드 파라미터와 값 리턴
- 파라미터의 갯수가 많아 지면 DTO 객체를 만들어 사용한다.
- 응용 서비스는 표현 영엑서 필요한 데이터만 리턴하는 것이 기능 실행 로직의 응집도를 높이는 확실한 방법이다.
표현 영역에 의존하지 않기
- 표현 영역과 관련된 타입을 파라미터로 사용하면 안된다.
- 왜?
- 응용 서비스에서 표현 영역에 대한 의존이 발생하면서 응용 서비스만 단독으로 테스트하기가 어려워 진다.
- 왜?
트랜잭션 처리
- @Transactional 을 적용한 메서드가 RuntimeException을 발생 시키면 롤백이 되고 그렇지 않으면 커밋하므로 이 규칙에 따라 코드를 작성하면 코드를 간결하게 유지할 수 있다.
표현 영역
- 표현 영역의 책임은 크게 다음과 같다.
- 사용자가 시스템을 사용할 수 있는 흐름(화면)을 제공하고 제어한다.
- 사용자의 요청을 알맞은 응용 서비스에 전달하고 결과를 사용자에게 제공한다.
- 사용자의 세션을 관리한다.
값 검증
- 표현 영역과 응용 서비스 두 곳에서 모두 수행할 수 있다.
- 역할을 나누어 수행할 수 있다.
- 표현 영역
- 필수 값, 값의 형식, 범위 등을 검증
- 응용 서비스
- 데이터의 존재 유무와 같은 노리적 오류를 검증
- 표현 영역
권한 검사
- 세 곳에서 권한 검사를 수행할 수 있다.
- 표현 영역
- 응용 서비스
- 도메인
회원 정보 변경을 처리하는 URL에 대해 표현 영역은 다음과 같이 접근 제어를 할 수 있다.
- URL을 처리하는 컨트롤러에 웹 요청을 전달기 전에 인증 여부를 검사해서 인증된 사용자의 웹 요청만 컨트롤러에 전달한다.
- 인증된 사용자가 아닐 경우 로그인 화면으로 리다이렉트 시킨다.
이러한 접근 제어를 하기에 좋은 위치가 서블릿 필터다.
- 사용자의 인증 정보를 생성하고 인증 여부를 검사한다.
스프링 시큐리티를 활용해 인증, 권한 프로그래밍을 편리하게 진행할 수 있다.
조회 전용 기능과 응용 서비스
- 단일 쿼리만 실행하는 조회 전용 기능이면 표현 영역에서 바로 조회 전용 기능을 사용해도 문제가 없다.
'Book > 도메인 주도 계발 시작하기' 카테고리의 다른 글
애그리거트 트랜잭션 관리 (1) | 2022.12.28 |
---|---|
도메인 서비스 (0) | 2022.12.28 |
스프링 데이터 JPA를 이용한 조회 기능 (0) | 2022.12.26 |
리포지터리와 모델 구현 (0) | 2022.12.22 |
애그리거트 (0) | 2022.12.21 |
아키텍처 개요 (0) | 2022.12.21 |
도메인 모델 시작하기 (0) | 2022.12.20 |