본 글을 개인공부를 위해 참고자료에서 가져온 글입니다.
Hypermedia As The Engine of Application State 의 약자
간단히 말해서 다음 요청을 위한 하이퍼링크가 제공되어야 한다!!!
💁♀️ 얼만큼? 클라이언트 화면이 필요 없을 만큼!!
예를 들어 게시글 조회 API를 호출했을때
{
"data": {
"id": 1000,
"name": "게시글 1",
"content": "HAL JSON을 이용한 예시 JSON",
"self": "http://localhost:8080/api/post/1000", // 호출한 api 주소
"profile": "http://localhost:8080/docs#query-article", // 호출한 api 문서
"next": "http://localhost:8080/api/post/1001", // 다음 post를 조회 api 주소
"comment": "http://localhost:8080/api/post/comment", // post의 댓글 달기 api 주소
"save": "http://localhost:8080/api/feed/post/1000", // post을 내 피드로 저장 api 주소
},
}
SpringDataJPA 에서도 페이지를 응답할때 페이지 정보만 응답하는것이 아니라
이전/다음페이지를 조회하기 위한 링크를 바로 제공해줄 수 있다.
spring-boot-starter-hateoas
)// 9. SpringBoot HATEOAS 의존성 추가
implementation 'org.springframework.boot:spring-boot-starter-hateoas'
PagedResourcesAssembler
넣고 PagedModel
로 응답@RestController
public class ChannelController {
@Autowired
ChannelRepository channelRepository;
@GetMapping("/channels")
public PagedModel<User> getUsers(Pageable pageable, PagedResourcesAssembler<User> assembler) {
var all = channelRepository.findAll(pageable);
return assembler.toModel(all);
}
}
Pageable
){
"content":[
...
{
"id":140,
"title":"jpa"
}
],
"pageable":{
"sort":{
"sorted":true,
"unsorted":false
},
"offset":20,
"pageSize":10,
"pageNumber":2,
"unpaged":false,
"paged":true
},
"totalElements":200,
"totalPages":20,
"last":false,
"size":10,
"number":2,
"first":false,
"numberOfElements":10,
"sort":{
"sorted":true,
"unsorted":false
}
}
PageModel (PagedResource)
){
"_embedded":{
"channelList":[
{
"id":140,
"title":"jpa"
},
...
{
"id":109,
"title":"jpa"
}
]
},
"_links":{
"first":{
"href":"http://localhost/channels?page=0&size=10&sort=created,desc&sort=title,asc"
},
"prev":{
"href":"http://localhost/channels?page=1&size=10&sort=created,desc&sort=title,asc"
},
"self":{
"href":"http://localhost/channels?page=2&size=10&sort=created,desc&sort=title,asc"
},
"next":{
"href":"http://localhost/channels?page=3&size=10&sort=created,desc&sort=title,asc"
},
"last":{
"href":"http://localhost/channels?page=19&size=10&sort=created,desc&sort=title,asc"
}
},
"page":{
"size":10,
"totalElements":200,
"totalPages":20,
"number":2
}
}
💡 잠시! 꿀팁
참고