반응형
문제
Review 엔티티에 기본형 boolean 타입의 isReported 필드가 있었는데, 이를 DTO로 변환하는 mapStruct 매퍼를 사용 중, 컴파일 시 아래와 같은 경고가 떴다.
// ReviewMapper.class
// ...
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import static org.mapstruct.MappingConstants.ComponentModel.SPRING;
@Mapper(componentModel = SPRING)
public interface ReviewMapper {
ReviewResponseDto toReviewResponseDto(Review review);
}
// ReviewResponseDto.class
public record ReviewResponseDto(
// ...
boolean isReported
) {
}
ReviewMapper.java:17: warning: Unmapped target property: "isReported".
ReviewResponseDto toReviewResponseDto(Review review);
상황
// ReviewMapper 인터페이스의 구현체
@Component
public class ReviewMapperImpl implements ReviewMapper {
@Override
public ReviewResponseDto toReviewResponseDto(Review review) {
if ( review == null ) {
return null;
}
// ...
boolean isReported = false; // 여기 !!!
ReviewResponseDto reviewResponseDto = new ReviewResponseDto( // ... , isReported );
return reviewResponseDto;
}
// ...
}
컴파일된 매퍼를 보니 isReported가 false로 초기화 되어있고 따로 review에서 값을 가져오지는 않았다.
해결
// ReviewMapper.class
// ...
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import static org.mapstruct.MappingConstants.ComponentModel.SPRING;
@Mapper(componentModel = SPRING)
public interface ReviewMapper {
@Mapping(target = "isReported", source = "reported") // 여기 !!!
ReviewResponseDto toReviewResponseDto(Review review);
}
위와 같이, is- 접두사를 제거한 reported 로 해두면 적용이 된다.
설명
@Entity
@Table(name = "p_review")
public class Review extends BaseEntity {
// ...
@Column(name = "is_reported")
private boolean isReported;
// ...
@Generated // 롬복이 만들어준 코드는 @Generated 어노테이션이 붙음
public boolean isReported() {
return this.isReported;
}
// ...
}
@Getter 롬복 어노테이션을 사용할 때, 기본형 boolean 타입의 경우 is- 프리픽스를 그대로 유지한 isReported() getter가 만들어진다.
// ReviewMapper 인터페이스의 구현체
@Component
public class ReviewMapperImpl implements ReviewMapper {
@Override
public ReviewResponseDto toReviewResponseDto(Review review) {
if ( review == null ) {
return null;
}
// ...
boolean isReported = review.isReported(); // 여기 !!!
ReviewResponseDto reviewResponseDto = new ReviewResponseDto( // ... , isReported );
return reviewResponseDto;
}
// ...
}
그리고 source = "reported"로 작성을 해두면 mapStruct는 java beans 8.3.2 스펙에 따라 isReported() getter로 isReported 필드의 값을 가져오도록 코드를 만들어준다.
반응형
'TIL ✍️' 카테고리의 다른 글
24/08/28(수) 108번째 TIL : EmbeddedId 식별자 값객체 (0) | 2024.09.09 |
---|---|
24/08/27(화) 107번째 TIL : Embeddable 값객체 (0) | 2024.09.09 |
24/08/23(금) 105번째 TIL : Gradle로 WAR 파일 빌드하기 (2) | 2024.08.30 |
24/08/22(목) 104번째 TIL : Redis maxmemory 소숫점 설정 (0) | 2024.08.30 |
24/08/21(수) 103번째 TIL : EC2 EBS 재부팅 없이 용량 확장 도전기 (0) | 2024.08.30 |