ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Map Struct] Ambiguous Mapping Error
    프로그래밍/Map Struct 2021. 12. 19. 16:35
    반응형

    이 글은 혼자 학습한 내용을 바탕으로 작성되었습니다.

    틀리거나 잘못된 정보가 있을 수 있습니다.

    댓글로 알려주시면 수정하도록 하겠습니다.


     

     

    1. Ambiguous Mapping Error

    Entity를 DTO로 변경하거나 또는 DTO를 Entity로 변경하기 위해 Map Struct를 사용합니다.

     

    Map Struct는 Object 뿐만 아니라 Collection에 포함된 Element또한 변경이 가능 합니다.

     

    Collection의 Element를 변환하고자 할때는 변환 처리를 하는 작업을 Object를 변환하는 메소드를 호출하여 변환 작업을 진행 합니다.

     

    구현된 Mapper Class의 Collection 변환 메소드

    위 이밎 처럼 Collection Element 변환의 경우 Object 변환 메소드(entityToDTO, dtoToEntity)를 호출하여 Collection 변환을 처리하고 있습니다.

     

    이때 변환 메소드가 여러개 정의되어 있으면 Collection변경에서 어떠한 Object변경 메소드를 사용해야하는 모호한 경우 이러한 Compile 에러가 발생하게 됩니다.

     

    보통 기본적인 변환인 4가지(DTO -> Entity, Entity -> DTO, List ->List, List -> List)는 공통 Interface로 선언 후 상속을 통해 Mapper를 만들어 나갈 것 입니다.

     

    이후 개별 Mapper에서 특정 속성을 Ignore하는 메소드를 추가로 작성하거나 한다면 Collection 변경에 사용할 메소드가 모호하여 Abiguous Compile 오류를 확인할 수 있을 것입니다.

     

    public interface CommonMapper<E, D> {
        D entityToDTO(E entity);
    
        E dtoToEntity(D DTO);
    
        List<D> entityListToDTOList(List<E> entityList);
    
        List<E> dtoListToEntityList(List<D> dtoList);
    }

    공통 Mapper Interface 코드

     

    @Mapper
    public interface MemberMapper extends CommonMapper<MemberEntity, MemberDTO> {
        MemberMapper INSTANCE = Mappers.getMapper(MemberMapper.class);
    
        @Mapping(target = "team", ignore = true)
        MemberDTO ignoreTeamEntityToDTO(MemberEntity entity);
    }

    Member 변환 Mapper Interface

     

    이 경우 공통 Mapper에 선언된 Collection 변환 메소드인 entityListToDTOList가 변환에 사용할 메소드로 entityToDTO를 사용해야 하는지 ignoreTeamEntityToDTO를 사용해야하는지 결정하지 못하여 Ambiguous Mapping Comile Error가 발생하게 된다.

     

    문제 해결을 위해 Collection 변환 메소가 사용해야할 Object 변환 메소드를 지정해 주면 됩니다.

     

    public interface CommonMapper<E, D> {
        @Named("defaultE2D")
        D entityToDTO(E entity);
    
        @Named("defaultD2E")
        E dtoToEntity(D DTO);
    
        @IterableMapping(qualifiedByName = "defaultE2D")
        List<D> entityListToDTOList(List<E> entityList);
    
        @IterableMapping(qualifiedByName = "defaultD2E")
        List<E> dtoListToEntityList(List<D> dtoList);
    }

    Named를 정의한 공통 Mapper Interface 코드

     

    먼저 Object 변환 메소드에 @Named 어노테이션을 사용하여 해당 메소드에 이름을 정의합니다.

     

    이후 Collection 변환 메소드에는 @IterableMapping 어노테이션의 qualifiedByName속성에 사용하고자 하는 Object 변환 메소드의 @Named 값을 입력하여 줍니다.

     

    Named 지정으로 구현된 Mapper Class의 Collection 변환 메소드

    위 이미지와 같이 IterableMapping의 qualifiedByName속성에 입력된 Name을 가진 Object 변환 메소드로 Collection 변환을 진행 하는 것을 확인할 수 있습니다.

     

    사용된 예제 코드는 Git에 있습니다.

    반응형

    '프로그래밍 > Map Struct' 카테고리의 다른 글

    [Map Struct] Map Struct 사용법  (0) 2021.12.16

    댓글

Designed by Tistory.