경계에서 매핑을 해야하는 이유
핵사고날 아키텍처에서 웹 어댑터에서 도메인 그리고 영속성 저장소까지 같은 모델을 사용한다면 결합이 높아진다.
이로 인해서 도메인 모델에 영속성 저장소/웹 어댑터의 요구 사항들이 담기면서 단일 책임 원칙을 따르지 않게 되고 유지보수 비용이 높아지는게 문제다.
그리고 매핑이 필요하다는 뜻은 계층 별로 사용하기 적합한 형태의 표현이 있을 건데 각 계층 별로 사용하기 편하게 만들기 위해 매핑을 하는 것도 있다.
정리하자면 매핑이 필요한 이유는 이렇다:
- 특정한 계층의 요구사항이 공통으로 사용하는 모델에 들어가게 되면서 유지보수 비용이 높아지는 것을 막기 위해서.
- 각 계층 별로 사용하기 적합한 형태의 데이터 표현을 만들기 위해서.
아래와 같은 각 계층 별로 해야하는 역할에 대해서는 파악해두자.
- 유스 케이스의 역할:
- 입력을 받음
- 비즈니스 규칙을 검증
- 모델 상태를 조작
- 출력을 반환
- 영속성 어댑터의 역할:
- 입력 받음
- 데이터베이스에 저장하기 위한 포맷으로 변환
- 데이터베이스에 보냄
- 출력 반환
- 웹 어댑터의 역할:
- HTTP 요청을 자바 객체로 변환
- 권한 검사
- 입력 유효성 검사
- 입력을 유스 케이스의 입력 모델로 매핑 (Optional)
- 유스케이스 호출
- 유스케이스 출력을 HTTP 로 매핑
- 응답 반환
여러가지 매핑 전략들
매핑 전략을 세울 때 중요한 건 '언제든지 다른 전략으로 갈아타면 된다는 것' 이다.
지금 시점에 최선의 매핑 전략을 세우고 이후에 요구사항이 추가되면서 다른 전략이 더 적합해보인다면 그걸로 갈아타면 됨.
'매핑하지 않기' 전략

모든 계층에서 같은 모델을 이용하는 것.
모든 계층에서 정확하게 같은 데이터만 필요하게 된다면 굳이 매핑을 할 필요가 없다. 매핑을 하는 이유를 생각해보자.
- 모델에 특별한 계층에서만 사용되는 필드가 담기는 경우는 매핑이 필요하다.
- 도메인 로직을 작성하기 어려운 형태의 데이터 포맷이라면 이것도 매핑이 필요할 것이다.
이 전략의 특징:
- 장점:
- 간단하다.
- 단점:
- 여러 계층의 요구사항이 도메인 모델에 섞일 수 있다.
'양방향' 매핑 전략

각 계층 별로 전용 모델을 가지는 것을 말한다.
웹 계층은 요청을 받아들이기 적합한 모델을 가지면 되고, 도메인 계층은 유스 케이스를 제일 잘 구현할 수 있도록 하는 모델을 가지면 되고,
영속성 계층은 데이터베이스에 저장할 용도의 모델을 가지면 된다.
계층 별로 분리된 모델들이 존재해서 서로 침범하지 않는 것이 특징이다.
양방향 매핑 전략 특징:
- 장점:
- 계층 별로 분리된 모델들이 존재해서 서로 침범하지 않는 것이 특징이다.
- 단점:
- 많은 코드의 양
- 도메인 모델이 계층 경계에 위치하고 있고 각 계층 별로 전달된다. 그래서 각 계층 별의 요구사항에 의해 도메인 모델의 변경을 유도할 수 있다.
'완전' 매핑 전략

각 계층과 경계마다 별도의 입출력 모델을 가지고 있는 전략이다.
즉 웹/영속성/도메인 계층 모두 별도의 모델이 존재하고, 웹 어댑터에서 유스 케이스로 전달할 땐 커맨드 객체를 통해서 전달하고, 도메인에서 영속성 계층으로 전달할 때도 별도의 커맨드 객체를 통해서 전달한다.
완전 매핑 전략 특징:
- 장점:
- 계층 별로 철저한 모델의 격리가 일어난다. 도메인 모델이 경계에 있지 않게 됨.
- 계층 간에 데이터를 전달할 때 유효성 검사를 하는 부분에서 유리하다.
- 단점:
- 양방향 매핑 전략보다 더 많은 코드를 요구한다.
- 매핑 오버헤드가 클 수 있다.
'단방향' 매핑 전략

모든 계층이 같은 '인터페이스' 를 바라보게 만드는 것.
같은 인터페이스를 바라보게 만들어서 도메인 객체를 간단하게 그대로 드러낼 수도 있고, 필요하다면 매핑을 할 수도 있다. 유연함을 가진 전략임.
단방향 매핑 전략 특징:
- 장점:
- 필요하다면 매핑하고 아니면 그대로 사용할 수 있으니 유연함을 가진다.
- 단점:
- 모든 계층에 같은 인터페이스가 있으니 어떤 구현체를 사용하고 있는지 이해하기 어려울 수 있다.
언제 각 매핑 전략을 사용해야할까?
매핑을 하지 않는 전략을 선택하는 경우:
- 유스케이스가 해야하는 일이 극도로 단순해서 데이터베이스에서 필요한 데이터를 조회만 하고 이걸 응답으로 보내기만 하면 되는 경우
단방향 매핑 전략을 선택해야하는 경우:
- 매핑하지 않기 전략에서 보다 유연함을 주고 싶은 경우가 아닐까
양방향 매핑 전략을 선택해야하는 경우:
- 유스 케이스가 복잡해서 이에 맞게 도메인 모델을 조작해야하는 경우. 그리고 이게 데이터베이스에 저장하는 포맷과는 다른 것.
완점 매핑 전략을 선택해야하는 경우:
- 양방향 매핑 전략에서 계층 간 경계를 명확하게 나누고 싶은 경우, 경계에서 유효성 검사를 해야하는 경우
- 웹 어댑터에서 유효성 검사를 맡기면 되지 않느냐? 라고 물을 수 있다. 근데 그걸 완벽하게 누락이 없다라고 확신할 수 있나? 웹 어댑터에서만 쓰인다는 법이 있나? 를 생각해보면 된다.
'Domain Driven Design' 카테고리의 다른 글
도메인 주도 설계 핵심 구성 요소들 (0) | 2024.08.12 |
---|