[ ddd start! ] 6. 응용 서비스와 표현 영역
CHAPTER 6. 응용 서비스와 표현 영역
1. 표현 영역과 응용 영역
- 도메인 영역을 잘 구현하지 않으면 사용자의 요구를 충족하는 제대로 된 소프트웨어를 만들지 못한다.
- 그러나 도메인 영역만 잘 만든다고 끝나는 것이 아닌, 도메인이 제 기능을 하려면 사용자와 도메인을 연결해주는 매개체가 필요하다.(응용 영역)
- 실제 사용자가 원하는 기능을 제공하는 것은 응용 영역에 위치한 서비스이다.
- 응용 서비스는 기능을 실행하는 데 필요한 입력값을 메서드 파라미터로 전달받고 실행결과를 리턴한다.
2. 응용 서비스의 역할
- 응용 서비스는 사용자의 요청을 처리하기 위해 리포지토리로부터 도메인 객체를 구하고, 도메인 객체를 사용한다.
- 도메인 로직을 도메인 영역과 응용 서비스에 분산해서 구현하면 코드 품질에 문제가 발생한다
- 소프트웨어의 가치를 높이려면 도메인 로직을 도메인 영역에 모아서 코드 중복이 발생하지 않도록 하고 응집도를 높여야 한다.
3. 응용 서비스의 구현
- 응용 서비스는 표현 영역과 도메인 영역을 연결하는 매개체 역할을 하는데 이는 디자인 패턴에서 파사드(facade)와 같은 역할을 한다.
- 한 도메인과 관련된 기능을 하나의 응용 서비스 클래스에서 모두 구현하는 방식보다 구분되는 기능을 별도의 서비스 클래스로 구현하는 방식이 더 용이하다.
- 응용 서비스는 표현 영역에서 필요한 데이터만 리턴하는 것이 기능 실행 로직의 응집도를 높이는 확실한 방법이다.
- 스프링의 기본 동작은 @Transactional이 적용된 메서드에서 RuntimeException이 발생하면 트랜잭션을 롤백하고 그렇지 않으면 커밋하는 것이므로 이 규칙에 따라 코드를 작성하는 데 어려움이 없다.
4. 표현 영역
표현 영역의 책임
- 사용자가 시스템을 사용할 수 있는 (화면) 흐름을 제공하고 제어한다.
- 사용자의 요청을 알맞은 응용 서비스에 전달하고 결과를 사용자에게 제공한다.
- 사용자의 세션을 관리한다.
5. 값 검증
- 원칙적으로 모든 값에 대한 검증은 응용 서비스에서 처리한다.
- 스프링 MVC의 경우 폼에 입력한 값이 잘못된 경우 에러 메시지를 보여주기 위한 용도로 Errors나 BindingResult를 사용하는데, 스프링 MVC의 컨트롤러에서 에러 메시지를 보여주기 위해선 다소 번잡한 코드를 사용해야 한다.
그리고 Exception이 발생하여 사용자에게 불편함을 제공해 주는 문제점을 해결하기 위해 표현 영역에서 값을 검사하여, 올바르지 않을 경우 다시 입력폼을 보여주는 방법이 있다.
- 스프링 프레임워크에서 제공해주는 Validator 인터페이스를 사용하여 조금 더 간결하게 줄일 수 있다.
- Validator를 사용해서 필수값과 값의 형식을 검사하면, 실직적으로 응용 서비스는 논리적 오류만 검사하면 된다.
6. 권한 검사
- 개발할 시스템마다 권한의 복잡도가 달라진다.
- 보통 프레임워크의 복잡도를 떠나 다음의 세 곳에서 권한 검사를 수행할 수 있다.
- 접근제어를 하기 좋은 위치가 서블릿 필터이다. 서블릿 필터에서 사용자의 인증 정보를 생성하고 인증 여부를 검사하는 것이다. 인증된 사용자라면 다음 과정을 진행하고 그렇지 않으면 로그인 화면이나 에러 화면을 보여주면 된다.