이유 : 유연성 향상
의존성 감소
상위 layer가 하위 layer의 세부사항에 의존하지 않아, 각 layer가 서로 독립접으로 관리
API변경으로 인해 Remote layer의 UserResponse 모델의 구조가 변경되더라도 Domain layer의 User 모델은 변함없이 유지 가능
참조하는 서버 자체가 변경되는 경우도 마찬가지
자체 서버 -> 외부 서버
로 바뀌어도, Remote layer의 모델만 바뀌고, 나머지 Domain layer 등의 모델은 그대로다.
이유1 : 유지보수와 확장성
단일 책임원칙을 지켜 각 layer의 모델이 자신의 layer의 역할에만 집중
모델의 구조가 변경되더라도 영향을 최소화하여 유지보수 비용 절감
새로운 요구사항이 추가되더라도 layer별로 필요한 모델만 추가하면 됨
예 ) Local layer에서 새로운 캐시 기능이 추가되더라도, 다른 layer의 모델에는 영향이 없음
이유2 : 보안(가시성)
민감함 정보나 불필요한 필드들은 특정 layer에서만 관리해서 노출 제한
Remote layer에서만 사용되는 민감한 정보를 다른 layer에서 알 필요 없음
너무 강한 결합
A layer의 변경이 B layer까지 영향을 미침
-> 코드 복잡도 증가
변경에 취약
DTO 구조가 변경되면 전체가 변경되야 함
-> 코드파악이나 디버깅이 어렵고, 테스트도 어려워짐
의존성 규칙 위반
아키텍처 계층 붕괴
layer사이의 Model을 변환해주는 역할
예 ) data model -> domain model (필요한 경우 반대도 수행)
Model Mapper는 자신이 속한 layer의 모델과 의존하는 layer의 모델 두 가지와 연결된다.
Model Mapper는 최종적으로 자신이 속한 layer의 모델로 변환해준다.
각 layer마다 Model Mapper가 존재
자바
자바에서는 필수적으로 Mapper Class를 만들어줘야 함.
코틀린
코틀린에서는 확장함수를 이용해, 자바와 같이 별도의 Model Mapper Class를 만들지 않고, 확장함수로 간결하게 표현
User.toPresentation()와 같은 방식으로 사용할 수 있도록 확장함수 지원
아래와 같이 구현
DataMapper, RemoteMapper로 추상회되어 있으므로 toDomain(), toData()와 같은 함수로만 사용하면 됨