경계에서 매핑을 해야하는 이유

핵사고날 아키텍처에서 웹 어댑터에서 도메인 그리고 영속성 저장소까지 같은 모델을 사용한다면 결합이 높아진다.

 

이로 인해서 도메인 모델에 영속성 저장소/웹 어댑터의 요구 사항들이 담기면서 단일 책임 원칙을 따르지 않게 되고 유지보수 비용이 높아지는게 문제다. 

 

그리고 매핑이 필요하다는 뜻은 계층 별로 사용하기 적합한 형태의 표현이 있을 건데 각 계층 별로 사용하기 편하게 만들기 위해 매핑을 하는 것도 있다.

 

정리하자면 매핑이 필요한 이유는 이렇다: 

  • 특정한 계층의 요구사항이 공통으로 사용하는 모델에 들어가게 되면서 유지보수 비용이 높아지는 것을 막기 위해서. 
  • 각 계층 별로 사용하기 적합한 형태의 데이터 표현을 만들기 위해서. 

아래와 같은 각 계층 별로 해야하는 역할에 대해서는 파악해두자.

  • 유스 케이스의 역할:
    • 입력을 받음
    • 비즈니스 규칙을 검증
    • 모델 상태를 조작
    • 출력을 반환
  • 영속성 어댑터의 역할:
    • 입력 받음
    • 데이터베이스에 저장하기 위한 포맷으로 변환
    • 데이터베이스에 보냄
    • 출력 반환
  • 웹 어댑터의 역할:
    • HTTP 요청을 자바 객체로 변환
    • 권한 검사
    • 입력 유효성 검사
    • 입력을 유스 케이스의 입력 모델로 매핑 (Optional)
    • 유스케이스 호출
    • 유스케이스 출력을 HTTP 로 매핑
    • 응답 반환

 

여러가지 매핑 전략들

매핑 전략을 세울 때 중요한 건 '언제든지 다른 전략으로 갈아타면 된다는 것' 이다.

 

지금 시점에 최선의 매핑 전략을 세우고 이후에 요구사항이 추가되면서 다른 전략이 더 적합해보인다면 그걸로 갈아타면 됨.

 

'매핑하지 않기' 전략

 

모든 계층에서 같은 모델을 이용하는 것.

 

모든 계층에서 정확하게 같은 데이터만 필요하게 된다면 굳이 매핑을 할 필요가 없다. 매핑을 하는 이유를 생각해보자. 

  • 모델에 특별한 계층에서만 사용되는 필드가 담기는 경우는 매핑이 필요하다. 
  • 도메인 로직을 작성하기 어려운 형태의 데이터 포맷이라면 이것도 매핑이 필요할 것이다. 

이 전략의 특징:

  • 장점:
    • 간단하다.
  • 단점:
    • 여러 계층의 요구사항이 도메인 모델에 섞일 수 있다.

 

'양방향' 매핑 전략

각 계층 별로 전용 모델을 가지는 것을 말한다.

 

웹 계층은 요청을 받아들이기 적합한 모델을 가지면 되고, 도메인 계층은 유스 케이스를 제일 잘 구현할 수 있도록 하는 모델을 가지면 되고,

영속성 계층은 데이터베이스에 저장할 용도의 모델을 가지면 된다.

 

계층 별로 분리된 모델들이 존재해서 서로 침범하지 않는 것이 특징이다.

 

양방향 매핑 전략 특징:

  • 장점:
    • 계층 별로 분리된 모델들이 존재해서 서로 침범하지 않는 것이 특징이다.
  • 단점:
    • 많은 코드의 양
    • 도메인 모델이 계층 경계에 위치하고 있고 각 계층 별로 전달된다. 그래서 각 계층 별의 요구사항에 의해 도메인 모델의 변경을 유도할 수 있다. 

 

'완전' 매핑 전략

 

각 계층과 경계마다 별도의 입출력 모델을 가지고 있는 전략이다.

 

즉 웹/영속성/도메인 계층 모두 별도의 모델이 존재하고, 웹 어댑터에서 유스 케이스로 전달할 땐 커맨드 객체를 통해서 전달하고, 도메인에서 영속성 계층으로 전달할 때도 별도의 커맨드 객체를 통해서 전달한다.

 

완전 매핑 전략 특징:

  • 장점:
    • 계층 별로 철저한 모델의 격리가 일어난다. 도메인 모델이 경계에 있지 않게 됨.
    • 계층 간에 데이터를 전달할 때 유효성 검사를 하는 부분에서 유리하다.
  • 단점:
    • 양방향 매핑 전략보다 더 많은 코드를 요구한다.
    • 매핑 오버헤드가 클 수 있다.

 

'단방향' 매핑 전략

 

모든 계층이 같은 '인터페이스' 를 바라보게 만드는 것.

 

같은 인터페이스를 바라보게 만들어서 도메인 객체를 간단하게 그대로 드러낼 수도 있고, 필요하다면 매핑을 할 수도 있다. 유연함을 가진 전략임.

 

단방향 매핑 전략 특징:

  • 장점:
    • 필요하다면 매핑하고 아니면 그대로 사용할 수 있으니 유연함을 가진다.
  • 단점:
    • 모든 계층에 같은 인터페이스가 있으니 어떤 구현체를 사용하고 있는지 이해하기 어려울 수 있다.

 

언제 각 매핑 전략을 사용해야할까?

매핑을 하지 않는 전략을 선택하는 경우:

  • 유스케이스가 해야하는 일이 극도로 단순해서 데이터베이스에서 필요한 데이터를 조회만 하고 이걸 응답으로 보내기만 하면 되는 경우

단방향 매핑 전략을 선택해야하는 경우:

  • 매핑하지 않기 전략에서 보다 유연함을 주고 싶은 경우가 아닐까

양방향 매핑 전략을 선택해야하는 경우:

  • 유스 케이스가 복잡해서 이에 맞게 도메인 모델을 조작해야하는 경우. 그리고 이게 데이터베이스에 저장하는 포맷과는 다른 것.

완점 매핑 전략을 선택해야하는 경우:

  • 양방향 매핑 전략에서 계층 간 경계를 명확하게 나누고 싶은 경우, 경계에서 유효성 검사를 해야하는 경우
    • 웹 어댑터에서 유효성 검사를 맡기면 되지 않느냐? 라고 물을 수 있다. 근데 그걸 완벽하게 누락이 없다라고 확신할 수 있나? 웹 어댑터에서만 쓰인다는 법이 있나? 를 생각해보면 된다.

+ Recent posts