도메인이 제 기능을 하기 위해선 사용자와 도메인을 연결해 주는 매개체가 필요함 (응용 영역, 표현 영역)
표현 영역
- 응용서비스가 복잡하다면 응용 서비스에서 도메인 로직을 구현하고 있을 가능성이 있음
- 도메인 로직을 도메인 영역과 응용서비스에 분산해서 구현하면 코드 품질에 문제가 발생함
--> 코드의 응집성이 떻어지고 응용 서비스에서 동일한 도메인 로직을 구현할 가능성이 높아짐
소프트웨어의 가치를 높이려면 도메인 로직을 도메인 영역에 모아서 코드 중복이 발생하지 않도록 하고 응집도를 높여야함
6.3.1 응용 서비스의 크기
응용 서비스를 구현할때 응용서비스의 크기를 생각해야함
응용 서비스 구현 방식
1. 한 응용 서비스 클래스에 회원 도메인의 모든 기능 구현
정점 : 동일 코드에 대한 중복 로직을 private메서드 호출을 통해 제거할 수 있음
단점 : 한 서비스 클래스의 크기가 커짐. 관련 없는 코드가 뒤섞여 코드 이해를 방해함
2. 구분되는 기능별로 응용 서비스 클래스를 따로 구현
장점 : 코드 품질을 일정 수준으로 유지하는 데 도움을 줌
단점 : 클래스 개수가 많아짐, 클래스의 기능이 분산되어 중복 코드를 구현할 가능성이 있음
-> 공통되는 로직을 별도 클래스에 구현하여 코드 중복을 방지할 수 있음
6.3.2 응용 서비스의 인터페이스와 클래스
응용서비스를 구현할때 인터페이스를 구현하곤 한다. 항상 인터페이스를 만들고 이를 상속한 클래스를 만드는 것이 필요할까?
책에서는 인터페이스를 작성하는건 별로 좋지 않아보인다고 한다. 근데 의존성을 떨어트리라며......
6.3.4 표현 영역에 의존하지 않기
응용 서비스의 파라미터 타입을 결정할 때 표현 영역과 관련된 타입을 사용하면 안 됨
표현 영역의 책임
1. 사용자가 시스템을 사용할 수 있도록 알맞은 흐름(화면)을 제공하고 제어함
표현 : 필수 값, 값 형식, 범위 등에 대한 검증은 표현영역에서 진행
응용 : 데이터 존재 유무 등 논리적 오류에 대한 검증 응용영역에서 진행
권한 검사는 보통 표현
응용서비스
도메인
에서 검사를 수행할 수 있음
표현 영역에서의 권한 검사는 인증된 사용자인지 검사 함
스프링 시큐리티의 AOP를 활용해서 응용 서비스에서 권한 검사를 진행 할 수 있음 @PreAuthorize("hasRole('ADMIN')")
개별 도메인 객체단위로 권한 검사를 해야하는 경우 권한검사 로직을 구현 해야함
Ex) 본인이 작성한 게시글은 본인만 삭제가능
public class DeleteArticleService {
public void delete(String userId, Long articleId) {
Article article = articleRepository.findById(articleId);
checkArticleExistence(artice);
permissionService.checkDeletePermission(userId, article);
article.markDeleted();
}
}
글 잘 봤습니다.