Layer Model, Mapper(클린 아키텍처)

장재용·2024년 11월 26일
0

Model

  • 각 layer마다 그에 맞은 Model을 각각 만들었음
    (예 : layer가 5개라면 Model도 5개)

  • Model을 정의할 때, Model마다 이름이 겹치면 안됨

layer별 Model 네이밍 규칙

  • Domain : User
  • Data : UserEntity
  • Remote : UserResponse / UserRequest
  • Local : UserLocal
  • Presentation : UserModel
  • UI : UserState (혹은 UserModel 공유)

왜 layer마다 Model을 만들어야 할까?

  • 이유 : 유연성 향상

  • 의존성 감소
    상위 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 구조가 변경되면 전체가 변경되야 함
    -> 코드파악이나 디버깅이 어렵고, 테스트도 어려워짐

  • 의존성 규칙 위반
    아키텍처 계층 붕괴

Model Mapper

  • layer사이의 Model을 변환해주는 역할
    예 ) data model -> domain model (필요한 경우 반대도 수행)

  • Model Mapper는 자신이 속한 layer의 모델과 의존하는 layer의 모델 두 가지와 연결된다.

  • Model Mapper는 최종적으로 자신이 속한 layer의 모델로 변환해준다.

  • 각 layer마다 Model Mapper가 존재

  • 자바

    자바에서는 필수적으로 Mapper Class를 만들어줘야 함.

  • 코틀린

    코틀린에서는 확장함수를 이용해, 자바와 같이 별도의 Model Mapper Class를 만들지 않고, 확장함수로 간결하게 표현
    User.toPresentation()와 같은 방식으로 사용할 수 있도록 확장함수 지원

구현 팁

  • Mapper 추상화
    각 Mapper를 추상화해서 일관성있게 다른 layer로 변환할 수 있도록 처리

아래와 같이 구현

DataMapper, RemoteMapper로 추상회되어 있으므로 toDomain(), toData()와 같은 함수로만 사용하면 됨

profile
enjoy_error_message!

0개의 댓글