표현 영역의 책임은 크게 다음과 같습니다.
- 사용자가 시스템을 사용할 수 있는 흐름(화면)을 제공하고 제어한다.
- 사용자의 요청을 알맞은 응용 서비스에 전달하고 결과를 사용자에게 제공한다.
- 사용자의 세션을 관리한다.
값 검증
값 검증은 표현 영역과 응용 서비스 두 곳에서 모두 수행할 수 있습니다. 원칙적으로는 모든 값에 대한 검증은 응용 서비스에서 처리합니다.
표현 영역과 응용 서비스는 값 검사를 다음과 같이 나누어 수행할 수 있습니다.
- 표현 영역 : 필수 값, 값의 형식, 범위 등을 검증
- 응용 서비스 : 데이터의 존재 유무와 같은 논리적 오류를 검증
하지만, 응용 서비스에서 필요한 값 검증과 논리적 값 검증을 모두 처리하면 작성할 코드가 늘어나는 불편함이 있지만, 응용 서비스의 완성도가 높아진다는 장점 또한 존재합니다. 각자의 판단에 맞게 사용하면 될 것 같습니다.
권한 검사
권한 검사는 다음 세 곳에서 수행할 수 있습니다.
- 표현 영역
- 응용 서비스
- 도메인
표현 영역
표현 영역에서 할 수 있는 기본적인 검사는 인증된 사용자인지 아닌지 검사하는 것입니다. 주로, URL만으로 접근 제어가 가능한 경우 표현 영역에서 처리할 수 있습니다.
응용 서비스
URL 만으로 접근 제어를 할 수 없는 경우,
응용 서비스의 메서드 단위로 권한 검사를 수행해야 합니다.
만약, Spring Security를 사용하면 제공하는 AOP를 활용해 아래와 같이 어노테이션으로 서비스 메서드에 대한 권한 검사를 진행할 수 있습니다.
public class BlockMemberService {
private MemberRepository memberRepository;
@PreAuthorize("hasRole('ADMIN')")
public void block(String memberId) {
Member member = memberRepository.findById(memberId);
if(member == null) throw new NoMemberException(memberId);
member.block();
}
}
도메인
하지만, 개별 도메인 객체 단위로 권한 검사를 진행해야 하는 경우는 구현이 복잡해질 수 있습니다.
예를 들어, 게시글 삭제는 본인 or 관리자 역할을 가진 사용자만 할 수 있다 해봅시다. 이 경우에는 게시글 작성자가 본인인지 확인하기 위해서는 게시글 애그리거트를 먼저 로딩해야 합니다.
즉, 응용 서비스의 메서드 수준에서 권한 검사를 할 수 없기 때문에 아래와 같이 직접 권한 검사 로직을 구현해야 합니다.
public class DeleteArticleService {
public void delete(String userId, Long articleId) {
Article article = articleRepository.findById(articleId);
checkArticleExistance(article);
permissionService.checkDeletePermission(userId, article);
article.markDeleted();
}
}
Spring Security와 같은 보안 프레임워크를 확장해 개별 도메인 객체 수준의 권한 검사 기능을 프레임워크에 통합할 수도 있지만, 복잡성이 높아 도메인에 맞는 권한 검사 기능을 직접 구현하는 것이 코드 유지 보수에 유리할 수 있습니다.
'DDD' 카테고리의 다른 글
[DDD] : 응용 영역 (0) | 2025.03.10 |
---|---|
[DDD] : 리포지터리와 모델 구현 (0) | 2025.03.06 |
[DDD] : 아키텍처 (0) | 2025.03.04 |
[DDD] : 도메인 모델 (0) | 2025.02.27 |