겉바속촉

Error. MapStruct 사용 후 빌드 에러 본문

IT 일기 (상반기)/SPRING 기초

Error. MapStruct 사용 후 빌드 에러

겉바속촉 2023. 3. 21. 17:14
728x90
반응형

 

<상황>

- entity 생성 후 dto 생성

- entity 속성 중 일부는 dto에 작성하지 않음 (필요한 것만 쓰기 위해)

- 프로젝트 빌드 후 계속 null값이니? 질문 받음 (내 에러로그)

 

 

<내 Entity>

@Getter
@Setter
@Entity
public class Room {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer roomId;

    @Column(length = 50)
    private String ownerId;

    @Column(length = 20)
    private String roomCode;

    @Column(length = 20)
    private String roomName;

    @Column(length = 50)
    private String userId;

    @Column(length = 100)
    private String roomTag;

    private LocalDateTime regDate;

    private LocalDateTime updDate;

    @OneToMany(mappedBy = "room", cascade = CascadeType.REMOVE)
    private List<Room_comment> room_commentList;
}

 

 

<내 DTO>

@Builder
@Getter
public class RoomDto {

    private String ownerId;

    private String roomName;

    private String roomTag;

    private String roomCode;
}

 

 

<내 Mapper>

@Mapper(unmappedTargetPolicy = ReportingPolicy.ERROR,  componentModel = "spring")
public interface RoomMapper {

    RoomMapper INSTANCE = Mappers.getMapper(RoomMapper.class);

   // @Mapping(target = "roomId", ignore = true)
   // @Mapping(target = "userId", ignore = true)
   // @Mapping(target = "regDate", ignore = true)
   // @Mapping(target = "updDate", ignore = true)
    RoomDto toRoomDto(Room room);
}

 

ignore 속성을 사용하고 싶은데 아무리 넣어도 되질 않아서

그냥 주석처리한 후에 빌드했더니

빌드 성공함.....

대환장...

이틀동안 보고있는데 모르겠음 🤷‍♀️🤷‍♀️🤷‍♀️🤷‍♀️🤷‍♀️🤷‍♀️🤷‍♀️🤷‍♀️🤷‍♀️🤷‍♀️🤷‍♀️🤷‍♀️🤷‍♀️🤷‍♀️🤷‍♀️😢

 

 

구글링을 통해 반드시 lombok이 먼저, mapstruct가 나중에 오도록 디펜던시 설정을 해주어야 한다.

라는 글을 보았고

순서를 맞춰서 바꾸어주기까지 했으나 결과는 동일

 

 

어쨌든 빌드 후에 생성된 파일은 다음과 같음

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2023-03-21T15:55:16+0900",
    comments = "version: 1.5.3.Final, compiler: javac, environment: Java 17.0.6 (Oracle Corporation)"
)
@Component
public class RoomMapperImpl implements RoomMapper {

    @Override
    public RoomDto toRoomDto(Room room) {
        if ( room == null ) {
            return null;
        }

        RoomDto.RoomDtoBuilder roomDto = RoomDto.builder();

        roomDto.ownerId( room.getOwnerId() );
        roomDto.roomName( room.getRoomName() );
        roomDto.roomTag( room.getRoomTag() );
        roomDto.roomCode( room.getRoomCode() );

        return roomDto.build();
    }
}

 

인데 다시 공식문서 보면서 공부해보니

 

바보였던ㄱ것......

 

대상을 반대로 생각하고 있었음음음.

창피하지만 안까먹기위해 작성

 

 

만약 내가 DTO에서 ENTITY로 변환하고자 했을때라면 위의 방법처럼 ignore속성을 사용하는 것이 맞음.

즉,  매핑이 안됐으면 하는 것이 변환하고자하는 것의 속성에 있을 때에 사용하는 것임을 명심.

 

728x90
반응형