-
도메인 주도 개발 시작하기 CH.6 ~ CH.7DESIGN PATTERN & ARCHITECTURE 2024. 6. 26. 22:42
Ch. 6 : 응용 서비스와 표현 영역
6.1
- 표현 영역
- 사용자의 요청 해석 및 담당 응용 서비스 호출
- 응용 서비스가 요구하는 형식으로 사용자 요청을 변환
- 응용 서비스 호출 후 실행 결과를 사용자에게 맞는 형식으로 응답
- 덕분에, 응용 서비스가 표현 영역에 의존하지 않을 수 있음
- 응용 영역
- 실제 사용자가 원하는 기능을 제공
- 기능 실행에 필요한 인자를 메서드 인자로 받고 실행 결과 리턴
- 실제 사용자가 원하는 기능을 제공
6.2
- 응용 서비스
- 사용자(클라이언트)가 요청한 기능 실행
- 역할
- 기능 실행
- 레포지터리에서 도메인 객체를 가져와 사용
- 도메인 객체를 사용
- => 도메인 영역과 표현 영역을 연결해주는 창구 역할
- 응용 서비스가 복잡하다면, 도메인 로직을 구현하고 있는지 파악해보아야 함
- 도메인 로직을 분산해서 구현하면, 코드 품질 문제 발생 및 반복 구현 가능성이 높아짐
- 응집도가 떨어지고 코드 변경이 어려워짐
- => 도메인 영역과 표현 영역을 연결해주는 창구 역할
- 트랜잭션 처리
- 도메인의 상태 변경할 수 있도록
- 접근 제어
- 이벤트 처리
- 기능 실행
6.3
- 응용서비스
- 도메인 영역을 연결하는 매개체 역할
- => 파사드와 같은 역할
- 구현 방법
- 도메인별 한 응용 서비스에 모든 기능 구현
- 동일 로직 코드 중복 제거 용이
- 클래스 크기가 커짐
- 연관성이 적은 코드가 한 서비스에 위치하게 됨
- 구분되는 기능별로 응용 서비스 따로 구현
- => 한 응용 서비스에서 한 개 내지 2~3개의 기능만을 구현
- 클래스 개수는 많아지지만, 코드 품질을 일정 수준으로 유지 가능
- 필요한 의존 객체만 포함하기 때문에 다른 기능을 구현한 코드에 영향 받지 않음
- 동일한 코드가 많아진다면, 별도 클래스에 로직을 구현해서 코드 중복 방지 가능
- ex) ServiceHelper
- 동일한 코드가 많아진다면, 별도 클래스에 로직을 구현해서 코드 중복 방지 가능
- 도메인별 한 응용 서비스에 모든 기능 구현
- 인터페이스
- 필요한 상황
- 구현 클래스가 여러개인 경우
- => 거의 없음
- 인터페이스가 명확하게 필요하기 전까지 응용 서비스에 대한 인터페이스를 작성하는 것이 필수는 아님
- 구현 클래스가 여러개인 경우
- 필요한 상황
- 메서드 파라미터와 데이터 전달
- 요청 파라미터가 두개 이상 존재하면 별도 클래스를 사용하는 것이 편리
- 결과 전달
- 응용 서비스가 애그리거트 자체를 리턴하면 코딩은 편하지만, 도메인 로직 실행을 으용 서비스와 표현 영역 두곳에서 할 수 있게 됨
- => 응집도를 높이기 위해서 필요한 데이터만 반환하자!
- 응용 서비스의 파라미터에 표현 영역과 관련된 타입을 사용하면 안됨
- 표현 영역의 응집도 저하
- 코드 유지 보수 비용 증가
- => 서비스 메서드의 파라미터와 리턴 타입으로 표현 영역의 구현 기술을 사용하지 않아야 함
- 트랜잭션
- 프레임 워크가 제공하는 트랜잭션 기능을 적극 사용하자!
- 도메인 영역을 연결하는 매개체 역할
6.4
- 표현 영역
- 책임
- 사용자가 시스템을 사용할 수 있는 흐름을 제공하고 제어
- 사용자가 요청한 내용을 응답으로 제공
- 사용자의 요청을 알맞은 응용 서비스에 전달하고 결과를 사용자에게 제공
- 사용자의 요청에 맞게 응용서비스에 기능 실행 호출 및 형식 변환 담당
- 사용자의 세션 관리
- 사용자의 연결 상태 관리
- 사용자가 시스템을 사용할 수 있는 흐름을 제공하고 제어
- 책임
6.5
- 값 검증
- 표현 영역과 응용 서비스에서 모두 수행 가능
- 원칙적으로 모든 값에 대한 검증은 응용 서비스에서 처리
- 에러 코드를 모아 하나의 익셉션으로 발생 시킬수도 있음
- 표현 영역에서 필수 값 검증
- 값의 형식을 검증
- => 즉, 표현영역에서는 값의 형식을 검사하고 응용 서비스는 논리적 오류를 검사
- 원칙적으로 모든 값에 대한 검증은 응용 서비스에서 처리
- 표현 영역과 응용 서비스에서 모두 수행 가능
6.6
- 권한 검사 수행 가능 영역
- 표현 영역
- 서블릿 필터 등
- 인증 여부 검사, 권한 검사
- ex) 스프링 시큐리티 프레임워크
- 인증 정보를 생성하고 웹 접근 제어
- 서블릿 필터 등
- 응용 서비스
- URL만으로 접근 제어가 불가능하고 메서드 단위의 권한 검사가 필요한 경우
- => AOP로도 권한 검사가 가능함
- ex) @PreAuthorize
- => AOP로도 권한 검사가 가능함
- URL만으로 접근 제어가 불가능하고 메서드 단위의 권한 검사가 필요한 경우
- 도메인
- 도메인 객체 수준의 권한 검사 로직은 도메인 별로 다르므로 도메인에 맞게 보안 프레임워크를 확장하려면 프레임워크에 대한 높은 이해 필요
- 표현 영역
6.7
- 조회 전용 서비스
- 트랜잭션이 필요하지 않은 경우 표현 영역에서 바로 조회 전용 기능 사용 가능
- 응용 서비스가 사용자 요청 기능을 실행하는데 별 기능을 하지 않는다면 굳이 필요 없음
Ch. 7 : 도메인 서비스
7.1 - 7.2
- 여러 애그리거트가 필요한 기능 구현
- 한 애그리거트가 필요한 데이터를 모두 가지도록 구현
- 한 애그리거트에 넣기 애매한 도메인 기능이 억지로 특정 애그리거트에 구현되면 안됨
- 애그리거트가 자신의 책임 범위를 넘어서는 기능을 구현하게 됨
- 외부 의존도가 높아지게 됨
- 수정이 어려워짐
- 범위를 넘어서는 도메인 개념이 파악이 어려워짐
- 도메인 기능을 별도로 도메인 서비스로 구현
- 도메인 영역에 위치한 도메인 로직을 표현할 때 사용
- 한 애그리거트에 넣기 애매한 도메인 개념을 구현
- 도메인의 애그리거트나 밸류와 달리 상태없이 로직만 구현
- 구현하는데 필요한 상태는 다른 방법으로 전달 받음
- 애그리거트 객체에 도메인 서비스를 전달하는 것은 응용 서비스 책임
- 도메인 서비스 객체를 애그리거트에 파라미터로 전달하거나 의존 주입하면 애그리거트가 일부 기능만 필요하면서 데이터와도 관계없는 도메인 서비스에 의존하게 됨
- -> 도메인 서비스의 기능을 실행할 때 애그리거트를 넘겨주는 방법을 사용할 수 있음
- 응용 로직은 수행하지 않고 도메인 로직만 수행함
- 트랜잭션과 같은 처리는 하지 않음
- => 애그리거트의 상태를 변경하거나 값을 계산하는 경우는 도메인 로직으로 판단하자!
- 외부 연동 도메인 서비스도 될 수 있음
- ex) 역할 관리 외부 시스템을 연동하여 권한 확인
- 인터페이스로 구현하고 실제 구현체인 클래스는 인프라스트럭쳐 영역에 위치하여 검사 기능 구현
- 도메인 서비스 로직이 고정되어 있지 않은 경우도 도메인 서비스자체를 인터페이스로 구현할 수 있음
- 실제 구현체는 intra 영역
- => 특정 구현 기술에 의존하거나 외부 시스템의 API를 실행한다면 도메인 영역의 도메인 서비스는 인터페이스로 추상화하자!
- => 특정 구현에 종속되는 것을 방지하고 테스트가 용이해짐
- 도메인 영역에 위치한 도메인 로직을 표현할 때 사용
- 한 애그리거트가 필요한 데이터를 모두 가지도록 구현
'DESIGN PATTERN & ARCHITECTURE' 카테고리의 다른 글
가상 면접 사례로 배우는 대규모 시스템 설계 기초 - 1장) 사용자 수에 따른 규모 확장성 (2) 2024.10.21 도메인 주도 개발 시작하기 CH.8 ~ CH.9 (1) 2024.07.03 도메인 주도 개발 시작하기 CH.4 ~ CH.5 (0) 2024.06.19 도메인 주도 개발 시작하기 CH.1 ~ CH.3 (0) 2024.06.10 도메인 주도 설계 핵심 (0) 2024.03.31 - 표현 영역