인스타그램이나 유튜브와 같은 매체에서 검색 시,
G O O O O ... L E 와 같이 클릭하여 페이지를 넘기는 형식과 다르게
끝도 없이 스크롤이 생기며 컨텐츠들이 로드되는데요!
이런 무한스크롤을 구현하기 위해서 필요한 것이 Pagination 입니다!!
사실 무한스크롤 뿐만 아니라 그냥 값들을 다 받아올 때 Pagination을 쓰는 것을 추천드립니다.
데이터가 몇백,, 몇천을 넘어 몇백만개,, 이거 다 한번에 넘길 거 아니잖아요?
모든 코드는 Java, Spring(boot) 개발 환경을 기준으로 작성합니다!!
먼저, 프론트로부터 페이지 값을 넘겨받습니다.
가령, 유저가 처음으로 데이터들을 요청을 했을 시 프론트가 백으로 요청해야되는 page 값은 1이되겠죵!(default 값)
무한스크롤로 구현할 시 현재 2페이지 마지막 부분을 유저가 보고있다면, page = 3으로 요청을 해야겠죵
여기서 두 가지로 방법이 나뉩니다.
1. 처음부터 pageable 개체로 받기
@PostMapping("/get-list-by-pageable")
public ResponseEntity<?> getListByPageable(Pageable pageable, @RequestBody Object otherMethods) {
Page<?> page = pageServiceImpl.getListByPageable(pageable, otherMethods);
// 이하생략...
}
2. int page, int sort, int size 등 param값으로 넘겨받기
@PostMapping("/get-list-by-params")
public ResponseEntity<?> getListByParams(@RequestParam("page") int page, @RequestParam("size") int size, @RequestParam("sort") int sort, @RequsetBody Object otherMethods) {
Page<?> page = pageServiceImpl.getListByParams(page, size, sort, otherMethods);
// 이하 생략...
}
사실 뭐가됐듬 상관 없습니다 하지만 전 2번이 더 좋더라고용 처리하기가 쉬워서
그 다음, 서비스 단에서 Pageable 객체를 생성합니당
public Page<?> getListByParams(int page, int size, int sort, Object otherMethods) {
//pageable 객체를 만들어주기~
Pageable pageable = PageRequestOf(page, size, sort);
List<?> list = pageMapper.getList(otherMethods);
return new PageImpl<>(list, pageable, list.size());
}
만약 본인이 Controller단에서부터 Pageable로 받는다!! 하면 Pageable 객체를 만들어 줄 필요가 없겠죠~~
List를 가져온 다음, 만들거나 받아온 pageable 객체와 함께 Page를 만들어서 return하면 된답니다!
Swagger로 돌려보면!
"pageable": {
"sort": {
"empty": true,
"sorted": false,
"unsorted": true
},
"offset": 0,
"pageNumber": 0,
"pageSize": 5,
"paged": true,
"unpaged": false
},
"last": false,
"totalElements": 99,
"totalPages": 20,
"size": 5,
"number": 0,
"sort": {
"empty": true,
"sorted": false,
"unsorted": true
},
"first": true,
"numberOfElements": 99,
"empty": false
이런식으로 list와 함께 현재 페이지 정보가 같이 return되는 것을 알 수 있어요~
참 쉽죠!
'개발일지' 카테고리의 다른 글
[개발일지02] 프로젝트가 깔끔해지는 방법: ErrorHandler, Validator 사용 (0) | 2024.08.11 |
---|