겪은 문제
PropertyReferenceException: No property 'created' found for type 'Post'; Did you mean 'createdAt’
이 에러가 계속 떠서 어디서 발생하는 에러지? 하고 보니 findByTitleContainingAndCreatedAtBetween 쿼리 메서드를 호출할 때 발생했다.
public PostsResponseDto getPosts(int page, String sortTypeStr, String search, String start, String end) {
SortType sortType = SortType.fromColumn(sortTypeStr);
Sort sort = Sort.by(sortType.getColumn());
Pageable pageable = PageRequest.of(page, 10, sort);
search = search != null ? search : "";
LocalDateTime startDate = start != null ?
LocalDate.parse(start, DateTimeFormatter.ISO_DATE_TIME).atStartOfDay() : LocalDateTime.MIN;
LocalDateTime endDate = end != null ?
LocalDate.parse(end, DateTimeFormatter.ISO_DATE_TIME).atTime(LocalTime.MAX) : LocalDateTime.MAX;
Page<Post> posts = postRepository.findByTitleContainingAndCreatedAtBetween(search, startDate, endDate, pageable);
List<PostGetResponseDto> postGetResponseDtoList = posts.map(PostGetResponseDto::new).getContent();
if(posts.getTotalElements() > 0 && postGetResponseDtoList.isEmpty()) {
throw new BusinessException(ErrorCode.POST_NOT_FOUND);
}
return PostsResponseDto.builder().page(page)
.data(postGetResponseDtoList)
.build();
}
그래서 난 이 JPA 쿼리 메서드가 잘못된 줄 알고 CreatedAt이 왜 파싱이 안되는 거지? 하고 계속 뜯어 봤다.
그런데 아무리 봐도 메서드에는 이상이 없는 것이다.
애초에 메서드에 이상이 있었다면 런 하자마자 메서드를 구현하기 때문에...
그 때 에러가 났었어야 한다.
원인
SortType sortType = SortType.fromColumn(sortTypeStr);
Sort sort = Sort.by(sortType.getColumn());
황당하게도 원인은 정렬 기준을 정하는 곳이었다.
@Getter
@RequiredArgsConstructor
public enum SortType {
CREATED_AT("created_at"),
LIKE("like");
private final String value;
}
정렬할 칼럼 이름이 created_at이라 되어 있다.
그러나 Hibernate에서 에서 파싱할 때 자바 카멜 → DB 스네이크로 변환을 해준다.
스네이크로 표기가 되어 있어서 created까지만 잘려 파싱 에러 난 것.
해결
@Getter
@RequiredArgsConstructor
public enum SortType {
CREATED_AT("createdAt"),
LIKE("like");
private final String value;
}
카멜 표기법으로 변경을 해주면 지가 알아서 파싱 잘 해준다.
'Spring' 카테고리의 다른 글
[Spring] JUnit 5 단위 테스트 (0) | 2024.06.11 |
---|---|
[Spring] Naver, Google 로그인 (OAuth2) (0) | 2024.06.10 |
[Spring] Naver 로그인 (Oauth2 X) (1) | 2024.06.08 |
[Spring] @Transactional 사용 시 NullPointerException 발생 (0) | 2024.06.05 |
[Spring] 이메일 인증하기 feat. google SMTP (0) | 2024.06.04 |