반응형
환경: springboot3.4, java17
최신 버전의 스프링부트를 쓰면 어느 새부터 아래와 같은 워닝을 만나는데 상당히 신경 쓰인다. 그동안 Page 인터페이스를 아주 많이 사용했던 터라 혹시 안되거나 deprecated 된다면 난감하기 때문이다..
찾아보니 springboot3.3부터 변경되었다고 한다!
2024-12-12 13:57:23 WARN [ration$PageModule$WarningLoggingModifier.changeProperties : 156] 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))
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.
내용은 직렬화 시 안정적이지 않으니 Spring Data의 PagedModel 또는 PagedResourcesAssembler를 사용하여 안정적인 JSON 구조를 생성하라는 것이다.
그동안 직렬화할 때 PageImpl을 직접 직렬화하였는데, 더이상 안정적인 방식이 아니니 아래 두 방식 중 하나를 고르라는 뜻
- HATEOAS를 쓰면 PagedResourcesAssembler, 그렇지 않으면 PagedModel
프로젝트 전역으로 설정하는 방식은 아래와 같다.
@EnableSpringDataWebSupport(pageSerializationMode = EnableSpringDataWebSupport.PageSerializationMode.VIA_DTO)
PageSerializationMode 에는 아래와 같이 두 가지가 있다.
DIRECT
PageImpl 객체를 직접 JSON으로 직렬화함
- 직렬화된 JSON 구조는 PageImpl의 내부 구조에 따라 다를 수 있음
- JSON 구조가 API의 변경이나 버전 업그레이드에 따라 변할 수 있으므로, 안정성이 떨어질 수 있음
- 이 모드는 이전 버전의 Spring Data에서 기본적으로 사용되던 방식
DTO
DTO(Data Transfer Object)를 사용하여 페이지 데이터를 직렬화
- 안정적이고 일관된 JSON 구조를 제공
- DTO를 사용함으로써 페이지 데이터의 구조가 API 변경에 영향을 덜 받음
- 이 모드는 PagedModel 또는 PagedResourcesAssembler와 함께 사용되며, 이를 통해 클라이언트가 예측 가능한 형식의 데이터를 수신할 수 있다.
설정하고 기존과 똑같이 페이징하면 된다.
@GetMapping
public Page<BaseResponse> getPrices(
참고로 HATEOAS
HATEOAS는 REST API 설계의 원칙 중 하나로, 클라이언트가 서버 응답에 포함된 하이퍼미디어(hypermedia)를 통해 애플리케이션 상태를 동적으로 탐색할 수 있도록 하는 방식이다. 이 원칙은 REST의 자기 설명(self-descriptive) 특성을 강화한다
HATEOAS의 구성 요소
- 링크(Link): API 응답에 포함된 URL. 다음 가능한 액션을 안내.
- 상태(State): 현재 리소스의 상태.
- 동작(Action): 링크를 따라가면 수행할 수 있는 작업.
HATEOAS의 사용 이유
- API 탐색성 증가:
- 클라이언트는 추가적인 문서 없이 서버 응답에 포함된 링크를 통해 어떤 작업이 가능한지 동적으로 파악할 수 있음
- 클라이언트-서버 결합도 감소:
- 클라이언트는 서버가 제공하는 링크를 따라가기 때문에 특정 엔드포인트에 강하게 의존하지 않음
- 유연한 확장성:
- 서버에서 새로운 액션이나 엔드포인트를 추가하더라도, 클라이언트는 변경 없이 새로운 기능을 사용할 수 있음
- 자기 설명적 API:
- 서버 응답에 포함된 하이퍼미디어가 클라이언트에게 리소스 상태 및 가능한 작업을 설명하므로 API의 문서화와 유지보수가 용이
728x90
반응형
'개발 > spring' 카테고리의 다른 글
[mvc] pathVariable String -> enum으로 자동 변환해주는 법 (1) | 2024.12.09 |
---|---|
[JtaTransaction] 분산 트랜젝션 (0) | 2024.11.27 |
[jpa] Repository, CrudRepository, JpaRepository (0) | 2024.11.23 |
[jpa] 커스텀 Transactional 만들기 (0) | 2024.11.22 |
[jpa] EntityManager를 타지 않는 작업 (1) | 2024.11.20 |