경계 간 매핑 하기란 입력받은 데이터를 다음 계층에서 사용할 수 있는 모델로 매핑하는 것을 말합니다. 매핑 방법에는 매핑하지 않기, 양방향 매핑, 완전 매핑, 단방향 매핑이 있습니다.

매핑하지 않기

모든 계층이 같은 모델을 사용한다면 매핑할 필요가 없습니다. 즉 모든 계층이 정확히 같은 구조의, 정확히 같은 정보를 필요로 한다면 매핑하지 않기 전략을 사용할 수 있습니다. 예를 들어 간단한 CRUD에서 생성 요청 같은 경우에는 전 계층이 사용하는 모델이 거의 똑같기 때문에 매핑을 안 하는 게 더 단순할 수 있습니다.

그러나 애플리케이션 계층이나 도메인 계층에서 웹과 영속성 문제를 다루게 되어 단일 책임 원칙을 위배할 때는 다른 전략을 선택해야 합니다.

양방향 매핑

양방향 매핑은 계층마다 전용 모델을 만드는 전략으로, 바깥쪽 계층의 어댑터는 안쪽 계층의 모델로 매핑하고, 다시 반대 방향으로 매핑합니다. 각 계층이 가지는 전용 모델을 인커밍 포트에서 필요한 모델로 매핑하고, 반환된 객체를 다시 다음 계층의 전용 모델로 매핑하여 양방향 매핑을 구현할 수 있습니다. 즉 웹 계층, 영속성 계층과 애플리케이션 계층이 서로 다른 모델을 사용하게 됩니다.

이런 매핑 전략은 도메인 모델을 다른 계층과 완전히 분리하여 깨끗하게 만들고 싶을 때 사용할 수 있습니다. 하지만 너무 많은 보일러 플레이트 코드가 생길 수 있고, 도메인 모델이 계층 경계로 넘어서 통신하는 데 사용되어 바깥쪽 계층의 요구에 따라 변경될 가능성이 있습니다.

완전 매핑

각 연산마다 별도의 입출력 모델을 매핑하는 것이 완전 매핑전략입니다. 유스 케이스마다 작업에 특화된 모델이 따로 존재하므로, 모델이 하나의 유스 케이스 요구사항만 충족하면 됩니다. 따라서 여러 유스 케이스의 요구사항을 함께 다뤄야 하는 매핑보다는 구현하고 유지 보수하기가 쉽습니다.

단방향 매핑

모든 계층의 모델들이 같은 인터페이스를 구현하는 것이 단방향 매핑전략입니다. 도메인 모델은 자체적으로 도메인 로직을 구현할 수 있고, 애플리케이션 계층에서 이 로직에 접근할 수 있습니다. 도메인 객체를 바깥 계층으로 전달하고 싶으면 매핑 없이 바로 전달할 수 있습니다. 왜냐하면 도메인 객체가 인커밍/아웃고잉 포트가 기대하는 대로 상태 인터페이스를 구현하고 있기 때문입니다.

한 계층이 다른 계층으로부터 객체를 받으면 상태 인터페이스를 구현할 수도 있고, 혹은 전용 모델로 매핑할 수도 있어서, 해당 계층에서 이용할 수 있도록 선택할 수 있습니다.

계층 간의 모델이 비슷할 때 가장 효과적이지만, 매핑이 계층을 넘나들며 퍼져있기 때문에 다른 전략에 비해 개념적으로 어렵습니다.

언제 어떤 매핑 전략을 사용할 것인가?

각 매핑 전략이 저마다 장단점을 갖고 있기 때문에, 한 가지 전략을 모든 코드에 적용할 필요는 없습니다. 팀 내에서 합의할 수 있는 가이드라인을 만들어서 지켜야 합니다.

유스 케이스마다 다른 매핑 전략을 사용하기 위해서는 좁은 포트를 사용해야 합니다. 다른 유스 케이스에 영향을 미치지 않으면서 코드를 개선할 수 있고, 상황과 시점에 맞는 최선의 전략을 선택할 수 있습니다.