ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [MapStruct] 여러 개의 소스 파라미터를 가지는 매핑 함수
    자바/mapstruct 2020. 11. 23. 23:40

    MapStruct는 또한 여러 개의 소스 Parameter(person, address)를 가지는 매핑 함수를 제공합니다.
    여러 개의 Entity들을 하나의 DTO로 합치는데 유용합니다.

    @Mapper
    public interface AddressMapper {
    
        @Mapping(source = "person.description", target = "description")
        @Mapping(source = "address.houseNo", target = "houseNumber")
        DeliveryAddressDto personAndAddressToDeliveryAddressDto(Person person, Address address);
    }


    보여지는 매핑 함수는 2개의 소스 Parameter(Person, Address)를 가지고 하나의 합쳐진 타겟 객체(DeliveryAddressDto)를 리턴합니다.
    하나의 소스 Parameter를 가지는 매핑 함수와 마찬가지로 Property들은 이름을 통해서 매핑되어집니다.

    여러 개의 소스 객체들이 같은 이름을 가진 Property를 정의할 상황을 대비해서, 그 Property를 검색할 소스 Parameter는 @Mapping 어노테이션을 사용하여 예제에서 보여진 description Property처럼 반드시 명시해야합니다.

    위 예제에서 person.description 또는 address.houseNo처럼 프로퍼티 description이나 houseNo 앞에 어떤 파라미터에 있는 프로퍼티인지 명시해주어야 합니다.
    모호성이 해결되지 않는다면 에러가 발생될 것입니다.
    주어진 소스 객체에서 오직 하나만 존재하는 Property들은 자동으로 결정되어질 수 있기 때문에 소스 Parameter의 이름을 명시하는 것은 생략가능합니다.

    이 때 모든 소스 Parameter들이 null인 경우 여러 개의 소스 Parameter를 가지는 매핑 매소드들은 null을 리턴합니다.

     

    Property가 존재하는 Parameter를 명시하는 것은 @Mapping 어노테이션을 사용할 때 반드시 있어야 합니다.

     

    MapStruct는 또한 직접적으로 소스 Parameter를 참조하는 기능을 제공합니다.

    @Mapper
    public interface AddressMapper {
    
        @Mapping(source = "person.description", target = "description")
        @Mapping(source = "hn", target = "houseNumber")
        DeliveryAddressDto personAndAddressToDeliveryAddressDto(Person person, Integer hn);
    }

    이 경우 소스 Parameter는 Target에 위에 예제처럼 직접 매핑되어집니다.

    Bean 타입이 아닌, hn Parameter는 houseNumber에 매핑되어집니다.

     

    댓글

Designed by Tistory.