[일정관리앱] Page 객체 사용시 콘솔창 경고 문구
[ 목차 ]
✏️ 경고 문구 발생
페이징 처리를 하고 페이지별로 데이터를 확인하는 get 요청을 보내면 데이터는 제대로 나오는데 콘솔 창에 문구가 떴다.
For a stable JSON structure, please use Spring Data's PagedModel (globally via @EnableSpringDataWebSupport(pageSerializationMode = VIA_DTO))
or Spring HATEOAS and Spring Data's PagedResourcesAssembler as documented in https://docs.spring.io/spring-data/commons/reference/repositories/core-extensions.html#core.web.pageables.
이게 뭐여
🔍 찾아본 결과
Page객체를 api에서 그대로 반환하면 엔티티를 그대로 json으로 변환하는 거나 다름 없기 때문에 내부 구조 노출 문제나 구조 변경시 안정성이 떨어진다는 것이었다.
우리가 엔티티를 반환하기 위해 dto로 변환해서 반환하는 것처럼
springboot가 page 객체에 대한 dto를 PageModel이라고 만들어 준 것과 같다!
👉🏻 기존 코드와 응답 형태
@GetMapping("/paging")
public ResponseEntity<Page<ScheduleResponseDto>> findSchedulesByPage(
@RequestParam(value = "pageNum") int pageNum,
@RequestParam(value = "pageSize") int pageSize
) {
return new ResponseEntity<>(scheduleService.findSchedulesByPage(pageNum, pageSize), HttpStatus.OK);
}
기존 코드와 기존 response json 형태는 이랬다.
안그래도 json이 first, last, size, number 등등이 다 나오고 중복 값들도 있어서 지저분해보인다고 생각하긴 했는데 Page 객체를 그대로 내보내서 그런 것인 줄 몰랐다...
✏️ 해결 방법
해결 방법은 두가지가 있다.
1. 두가지 해결방법 중 첫번째로 스프링 빈에 @EnableSpringDataWebSupport(pageSerializationMode = VIA_DTO)
를 붙이는 방법을 사용할 수 있다. 이렇게 하면 모든 Page 객체들이 전부 PagedModel 타입으로 변경된다.
2. 기존에 Page<ResponseDto>로 반환하던 API를 PagedModel<ResponseDto>로 변경하고 반환하는 곳에 new PagedModel<>(Page 객체) 를 작성한다.
나는 두번째 방법을 사용했다.
👉🏻 해결 후 코드와 응답 형태
@GetMapping("/paging")
public ResponseEntity<PagedModel<ScheduleResponseDto>> findSchedulesByPage(
@RequestParam(value = "pageNum") int pageNum,
@RequestParam(value = "pageSize") int pageSize
) {
return ResponseEntity.ok(new PagedModel<>(scheduleService.findSchedulesByPage(pageNum, pageSize)));
}
Page가 아닌 PagedModel 타입으로 변경되어 json이 직렬화되었다.
이전에는 pageable, last, totalPages 등 뭐가 많았는데 content와 page로 딱 구분이 된 것을 볼 수 있다.
✏️ 결론
Page 객체를 그대로 json으로 내보내면 구조와 보안상 좋지 않기 때문에
우리가 엔티티를 반환하기 위해 dto로 변환해서 반환하는 것처럼
springboot가 Page 객체에 대해 dto로 변환한 PageModel을 쓰는 것이 좋다!
api에서 Page가 아닌 PageModel을 반환하는 것으로 해결 가능!