Intro
์๋
ํ์ธ์. ์ด๋ฒ ์๊ฐ์๋ ์คํ๋ง๋ถํธ์ Pageable ํ์ด์ง๋ค์ด์
๊ฐ์ฒด์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
์ ๊ฒฝ์ฐ Task๋ฅผ ์งํํ๋ ๋์ค ํ์ด์ง๋ค์ด์
์ ์ถ๊ฐํด์ผ ํ๋ ์๊ตฌ์ฌํญ์ด ๋ค์ด์ธ์ต๋๋ค. ํ์ด์ง๋ค์ด์
์ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง๊ฐ ์๋๋ฐ์, ๊ทธ์ค์์๋ ์ ๋ Spring Data JPA๋ฅผ ์ด์ฉํ์ต๋๋ค.
Spring Data JPA๋ฅผ ์ด์ฉํ๋ฉด Pageable ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ์ฌ ํ์ด์ง๋ค์ด์
(pagination) ์ ๋ณด๋ฅผ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. JPA Query ๋ฉ์๋์ ํ๋ผ๋ฏธํฐ๋ก Pageable์ ๋๊ฒจ์ DB์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๋ฆด ์ ์์ต๋๋ค.
์ฆ, ์์์ ์ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋งค์ฐ ํธํ๊ฒ ์ฌ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค :-)
Pageable
Pageable๋ Pagination ์์ฒญ ์ ๋ณด๋ค์ ๋ด๊ธฐ ์ํ ์ถ์ ์ธํฐํ์ด์ค์ ๋๋ค.
- class QPageRequest : QueryDSL์ ์ํ Pageable ๊ตฌํ์ฒด
- class PageRequest : ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ Pageable ๊ตฌํ์ฒด
- enum Unpaged : pagination ์ ๋ณด๊ฐ ์๋ ๊ฒ์ ํํํ๊ธฐ ์ํ ๊ตฌํ์ฒด
๋ณดํต ์ด ์ค์์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ธ PageRequest๋ฅผ ๋ง์ด ์ฌ์ฉํ๋ค๊ณ ํฉ๋๋ค.
Example
UserController์ user ๋ชฉ๋ก์ ๊ฐ์ ธ์ค๋ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด๋ดค์ต๋๋ค. getPageRequest ํจ์๋ฅผ ํตํด PageRequest ๊ฐ์ฒด๋ฅผ ๊ฐ์ ธ์ค๊ณ ์์ต๋๋ค.
@RestController
@RequestMapping("api/v1/user")
class UserController(
private val userApiService: UserApiService
) : BaseMobileApiController() {
/**
* user ์กฐํ
*/
@GetMapping
suspend fun getUsers(
principal: Principal,
pageable: Pageable,
): ApiResponse<Page<UserRes>> {
val res = userApiService.getUsers(principal, getPageRequest(pageable))
return ApiResponse.ok(res)
}
}
์ user ์กฐํ API๋ฅผ ์คํํ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
"content":[
{
"content": [
{"id": 1, "username": "User 0", "address": UK", "age": 20},
...,
{"id": 5, "username": "User 4", "address": "Korea", "age": 4}
],
"pageable": {
"sort": {
"sorted": false, // ์ ๋ ฌ ์ํ
"unsorted": true,
"empty": true
},
"pageSize": 5, // ํ ํ์ด์ง์์ ๋ํ๋ด๋ ์์์ ์ (๊ฒ์๊ธ ์)
"pageNumber": 0, // ํ์ด์ง ๋ฒํธ (0๋ฒ ๋ถํฐ ์์)
"offset": 0, // ํด๋น ํ์ด์ง์ ์ฒซ ๋ฒ์งธ ์์์ ์
"paged": true,
"unpaged": false
},
"totalPages": 20, // ํ์ด์ง๋ก ์ ๊ณต๋๋ ์ด ํ์ด์ง ์
"totalElements": 100, // ๋ชจ๋ ํ์ด์ง์ ์กด์ฌํ๋ ์ด ์์ ์
"last": false,
"number": 0,
"sort": {
"sorted": false,
"unsorted": true,
"empty": true
},
"size": 5,
"numberOfElements": 5,
"first": true,
"empty": false
}
https://velog.io/@chlee4858/Jpa-Pagination-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0
https://wonit.tistory.com/483