환경: springboot3.2
기존과 같이 new PageImpl()을 이용하여 Page<T> 객체를 내리는데 아래와 같은 에러(warn)가 발생한다.
Serializing PageImpl instances as-is is not supported, meaning that there is no guarantee about the stability of the resulting JSON structure!
For a stable JSON structure, please use Spring Data's PagedModel (globally via @EnableSpringDataWebSupport(pageSerializationMode = VIA_DTO))
에러 발생 이유
- Spring Boot 3.x
- 내부적으로 사용하는:
- Spring Data Commons 3.x (2023.0.x 이상)
- Spring Framework 6.x
이 조합에서 PageImpl을 그대로 @RestController에서 반환하면 Jackson 직렬화 구조가 불안정하다는 경고가 발생한다.
Spring 팀은 PageImpl<T>의 직렬화가 다음 문제를 가진다고 판단했다:
- Jackson 직렬화 시 필드 순서나 구조가 변경될 수 있음
- 필드 이름이 내부 구현에 의존
- API 스펙을 안정적으로 유지하기 어려움
그래서 Spring Data 팀이 공식적으로 PagedModel<T> 또는 DTO 변환을 권장하게 됨.
해결 방법
1. hate oas 를 사용하는 경우
PagedModel<T> 사용
return pagedResourcesAssembler.toModel(page);
2. hate oas 사용 안하는 경우
@Configuration
@EnableSpringDataWebSupport(pageSerializationMode = PageSerializationMode.VIA_DTO)
public class WebConfig {
}
2) 직접 커스텀 DTO를 만들어서 사용
public class PageResponse<T> {
private List<T> content;
private int page;
private int size;
private long totalElements;
public PageResponse(List<T> content, int page, int size, long totalElements) {
this.content = content;
this.page = page;
this.size = size;
this.totalElements = totalElements;
}
// getters, setters
}
'개발 > spring' 카테고리의 다른 글
open feign에서 401일 때 바디가 안 나올 경우 (0) | 2025.03.11 |
---|---|
[atomikos] jta XID already exists (0) | 2025.02.26 |
[pageImpl] 기존이랑 똑같이 페이징 시 갑자기 경고가? EnableSpringDataWebSupport (1) | 2024.12.18 |
[mvc] pathVariable String -> enum으로 자동 변환해주는 법 (1) | 2024.12.09 |
[JtaTransaction, atomikos] 분산 트랜젝션 (0) | 2024.11.27 |