MapStruct 컬렉션 매핑

Kevin·2023년 9월 15일
0

Spring

목록 보기
3/11
post-thumbnail

문제 상황

@Override
    public ArrayList<RoomResponseDTO> toDTOsFromMenti(List<Room> room, Menti receiver) {
        if ( room == null && receiver == null ) {
            return null;
        }

        ArrayList<RoomResponseDTO> arrayList = new ArrayList<RoomResponseDTO>();

        return arrayList;
    }

    @Override
    public RoomResponseDTO toDTOFromMenti(Room room, Menti receiver) {
        if ( room == null && receiver == null ) {
            return null;
        }

        RoomResponseDTO.RoomResponseDTOBuilder roomResponseDTO = RoomResponseDTO.builder();

        if ( room != null ) {
            roomResponseDTO.roomPK( room.getId() );
            roomResponseDTO.lastLetter( RoomMapper.letterListToStr( room.getLetterList() ) );
            roomResponseDTO.updateAt( room.getLastSendTime() );
        }
        if ( receiver != null ) {
            roomResponseDTO.nickname( receiver.getNickname() );
            roomResponseDTO.memberPK( receiver.getMentiId() );
            roomResponseDTO.major( RoomMapper.initMentiMajor( receiver.getMemberMajors() ) );
        }

        return roomResponseDTO.build();
    }
}

toDTOsFromMenti가 → toDTOFromMenti로 자연스럽게 매핑이 되지 않는 문제


해결 방안

  1. 네이밍 문제인가? -> 아니었다.
  1. 인자 문제인가?
default ArrayList<RoomResponseDTO> toDTOsFromMento(List<Room> room, Mento receiver) {
        ArrayList<RoomResponseDTO> roomResponseDTOList = new ArrayList<>();
        for (Room roomEntity : room) {
            RoomResponseDTO roomResponseDTO = toDTOFromMento(roomEntity, receiver);
            roomResponseDTOList.add(roomResponseDTO);
        }
        return roomResponseDTOList;
    }

    @Mapping(source = "room.id", target = "roomPK")
    @Mapping(source = "receiver.nickname", target = "nickname")
    @Mapping(source = "receiver.mentoId", target = "memberPK")
    @Mapping(source = "room.letterList", target = "lastLetter", qualifiedByName = "letterListToStr")
    @Mapping(source = "receiver.memberMajors", target = "major", qualifiedByName = "initMentoMajor")
    @Mapping(source = "room.lastSendTime", target = "updateAt")
    RoomResponseDTO toDTOFromMento(Room room, Mento receiver);

인터페이스 default 메서드를 통해서 인터페이스 내에서 직접 for문을 통해 일일이 toDTOFromMento 메서드를 통해 엔티티 인자를 컬렉션 인자로 변환시킴.


참고 레퍼런스

MapStruct로 컬렉션 매핑하기

profile
Hello, World! \n

0개의 댓글

관련 채용 정보