Mapper

2 minute read

Mapper with Dto and Entity

목적

라라벨 프레임워크는 유용한 프레임워크이지만, 기본적으로 연관배열의 사용을 권장합니다. 이는 생산성을 증가 시키는데 크게 기여하지만 협업 및 유지보수 관리의 어려움을 발생시킬 수 있습니다. 생산성에 영향을 최대한 줄이면서 유지보수 관리 또한 쉽게하기 위해 view를 위한 DTO와 DB 데이터 관리를 위한 Entity객체로 분할하려고 합니다. 하지만 DTO의 경우는 계층간 데이터 교환을 위한 객체이고 Entity는 DB테이블 스키마를 그대로 가진 객체이기 때문에 서로 속성간의 차이가 발생할 수 있으며, Entity에 비해 상대적으로 변경사항이 많을 수 있기 때문에 두 클래스간의 변환 및 제어를 해주는 기능이 필요하다고 판단하여 현재 패키지를 구상했습니다.

구조 및 용도

  • DTO
    • DataTransferObject로 데이터 전달의 역할을 수행합니다. Request에서 받은 데이터를 다른 계층간 데이터 전달 용도입니다.

  • Entity
    • DB의 테이블의 속성을 그대로 갖는 클래스입니다.

  • Mapper
    • Dto혹은 Entity타입에 따라서 config/mapper.php파일을 이용해 dto,entity,map 클래스를 연결합니다.
    • Mapper는 따로 호출할 수 있지만, DTO, Entity에 내장되어 toDto(), toEntity() 메서드를 통해 호출이 가능합니다.

  • Entities
    • 라라벨 모델에서 여러개의 레코드를 가져올 경우 라라벨 컬렉션을 상속받은 Eloquent Collection 객체를 사용하는 것을 보고 Entity객체를 컬렉션객체를 통해 컨트롤하면 좋겠다고 판단하여, 라라벨 컬렉션을 상속받은 Entities클래스를 구현했습니다. 기본 컬렉션과 다른 점은 Entities::toDtos() Entities와 같은 목적의 Dto컬렉션으로 변환하는 메서드가 추가되었습니다.

  • Dtos
    • Entities와 같은 목적으로 설계하여 Dto객체를 보다 쉽게 제어할 수 있습니다.

  • Map
    • Dto와 Entity간의 변환시 각 속성들을 매핑해 줄 수 있는 클래스입니다.
    • 구현할 method는 2개로 toEntity()와 toDto()입니다.
    • Dto와 Entity의 속성명과 유형이 모두 일치하지 않을 경우, 서로 다른 속성의 매칭이 필요할 때 사용됩니다.

    • Map클래스를 구현하지 않을 경우 Dto, Entity의 map() 메서드를 사용하게 됩니다.(단, 속성이 일치해야 원하는 결과를 얻을 수있습니다.)
    • toEntity()와 toDto() 구현 시, getter,setter를 사용하면서 PHP docblock으로 getter 및 setter의 유효성을 체크하는 것을 권장합니다. 아니면 ‘ instanceof’를 사용하여도 무관 합니다. 현재 mapper2.0의 구현 목적 중 하나로 개발과정에서 발생할 수 있는 에러를 IDE를 통해 미리 방지하는 것도 포함되어 있기 때문입니다.

  • MapperConfig
    • config/mapper.php에서 원하는 값을 보다 쉽게 가져올 수 있게 해주는 클래스입니다.

  • DataMapper
    • Dto, Entity 클래스의 map(), mapList() 메서드 내부에서 호출되는 클래스입니다.
    • JsonMapper 라이브러리를 사용합니다.

  • Dynamic
    • 동적 속성할당 클래스입니다. $fillable 속성에 문자열 배열로 사용할 속성을 정의하여 사용합니다.
    • 라라벨 Model 클래스를 모방하여 만들었습니다. 속성들을 매직 메서드를 활용하여 제어 합니다.(테스트 혹은 속성이 자주 변할 수 있는 경우에 사용)

  • CustomCollection Dtos, Entities 의 공통 기능을 통합하기 위해서 해당 클래스를 상속 받습니다.

  • Traits: 공통 기능들을 가능한대로 Trait 을 활용하여 적용 시켰습니다.
    • ReadOnlyDto: 읽기 전용 DTO
    • ToDto: toDto() 메서드 구현
    • ToDtos: toDtos() 메서드 구현
    • ToEntities: toEntities() 메서드 구현
    • ToEntity: toEntity() 메서드 구현
    • Transformation: toArray(), toJson(), makeHidden(), makeVisible(), jsonSerialize() 구현

  • Mapable
    • map(), mapList(), toArray()(Arrayable 상속), toJson()(Jsonable 상속) 메서드를 가진 interface Dynamic 클래스의 추가하면서 map(), mapList() , toArray() 와 같은 Data 객체들의 공통 기능들을 묶을 interface가 필요하다고 판단하여 추가하였습니다.

Mapper

Readme Card