์ถ์ฒ : ๋ด์ผ๋ฐฐ์์บ ํ
in PagingAndSortingRepository
ํ์ด์ง ํ๋ก์ธ์ค
- PageRequest ๋ฅผ ์ฌ์ฉํ์ฌ Pageable์ ํ์ด์ง ์ ๋ณด๋ฅผ ๋ด์ ๊ฐ์ฒดํ
- Pageable์ JpaRepository๊ฐ ์์๋ ์ธํฐํ์ด์ค์ ๋ฉ์๋์ T(Entity)์ ํจ๊ผ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ
- return ์ผ๋ก Page<T>๊ฐ ์๋ต
- ์๋ต๋ Page<T>์ ๋ด๊ฒจ์ง Page ์ ๋ณด๋ฅผ ๋ฐํ์ผ๋ก ๋ก์ง์ ์ฒ๋ฆฌํ๋ฉด ๋๋ค.
Pageable : ํ์ด์ง ์ ๊ณต ์ธํฐํ์ด์ค
Pageable ๋ง๋๋ ๋ฒ
PageRequest.of(int page, int size) : 0๋ถํฐ ์์ํ๋ ํ์ด์ง ๋ฒํธ์ ๊ฐ์. ์ ๋ ฌ์ด ์ง์ ๋์ง ์์
PageRequest.of(int page, int size, Sort sort) : ํ์ด์ง ๋ฒํธ์ ๊ฐ์, ์ ๋ ฌ ๊ด๋ จ ์ ๋ณด
PageRequest.of(int page int size, Sort sort, Direction direction, String ... props) :
0๋ถํฐ ์์ํ๋ ํ์ด์ง ๋ฒํธ์ ๊ฐ์, ์ ๋ ฌ์ ๋ฐฉํฅ๊ณผ ์ ๋ ฌ ๊ธฐ์ค ํ๋๋ค
Pageable์ ๋ฉ์๋
pageable.getTotalPages() : ์ด ํ์ด์ง ์
pageable.getTotalElements() : ์ ์ฒด ๊ฐ์
pageable.getNumber() : ํ์ฌ ํ์ด์ง ๋ฒํธ
pageable.getSize() : ํ์ด์ง ๋น ๋ฐ์ดํฐ ๊ฐ์
pageable.hasnext() : ๋ค์ ํ์ด์ง ์กด์ฌ ์ฌ๋ถ
pageable.isFirst() : ์์ํ์ด์ง ์ฌ๋ถ
pageable.getContent(), PageRequest.get() :
์ค์ ์ปจํ ์ธ ๋ฅผ ๊ฐ์ง๊ณ ์ค๋ ๋ฉ์๋. getContext๋ List<Entity> ๋ฐํ, get()์ Stream<Entity> ๋ฐํ
๋ฐํ ํ์
1) Page<T>
- ๊ฒ์ํ ํํ์ ํ์ด์ง์์ ์ฌ์ฉ
- ์ ์ฒด ์์ ๊ฐ์๋ ํจ๊ผ ์กฐํํ๋ค
- ์๋ต ํํ
{
"content": [
{"id": 1, "username": "User 0", "address": "Korea", "age": 0},
...
{"id": 5, "username": "User 4", "address": "Korea", "age": 4}
],
"pageable": {
"sort": {
"sorted": false, // ์ ๋ ฌ ์ํ
"unsorted": true,
"empty": true
},
"pageSize": 5, // ํ์ด์ง ํฌ๊ธฐ
"pageNumber": 0, // ํ์ด์ง ๋ฒํธ (0๋ฒ ๋ถํฐ ์์)
"offset": 0, // ํด๋น ํ์ด์ง์ ์ฒซ๋ฒ์งธ ์์์ ์ ์ฒด ์๋ฒ (๋ค์ ํ์ด์ง์์๋ 5)
"paged": true,
"unpaged": false
},
"totalPages": 20, // ํ์ด์ง๋ก ์ ๊ณต๋๋ ์ด ํ์ด์ง ์
"totalElements": 100, // ๋ชจ๋ ํ์ด์ง์ ์กด์ฌํ๋ ์ด ์์ ์
"last": false, // ๋ง์ง๋ง ํ์ด์ง ์ฌ๋ถ
"number": 0,
"sort": {
"sorted": false, // ์ ๋ ฌ ์ฌ์ฉ ์ฌ๋ถ
"unsorted": true,
"empty": true
},
"size": 5, // Contents ์ฌ์ด์ฆ
"numberOfElements": 5, // Contents ์ ์์ ์
"first": true, // ์ฒซํ์ด์ง ์ฌ๋ถ
"empty": false // ๊ณต๋ฐฑ ์ฌ๋ถ
}
2) Slice<T>
- '๋๋ณด๊ธฐ' ํํ์ ํ์ด์ง์์ ์ฌ์ฉ
- ์ ์ฒด ์์ ๊ฐ์ ๋์ offset ํ๋๋ก ์กฐํ ๊ฐ๋ฅ ~ count ์ฟผ๋ฆฌ๊ฐ ์๊ณ limit + 1 ์กฐํ๋ฅผ ํ๋ค(ํ์ ์์ ์ ์ฐ์ง ์๋๋ค)
- ์๋ต ํํ
{
"content": [
{ "id": 13, "username": "User 12", "address": "Korea", "age": 12 },
...
{ "id": 16, "username": "User 15", "address": "Korea", "age": 15 }
],
"pageable": {
"sort": { "sorted": false, "unsorted": true, "empty": true },
"pageNumber": 3,
"pageSize": 4,
"offset": 12,
"paged": true,
"unpaged": false
},
"number": 3,
"numberOfElements": 4,
"first": false,
"last": false,
"size": 4,
"sort": { "sorted": false, "unsorted": true, "empty": true },
"empty": false
}
3) List<T> ํ์
์ ์ฒด ๋ชฉ๋ก๋ณด๊ธฐ ํํ์ ํ์ด์ง์์ ์ฌ์ฉ
๊ธฐ๋ณธ ํ์ ์ผ๋ก Count ์กฐํ๊ฐ ๋ฐ์ํ์ง ์๋๋ค
Sort : ์ ๋ ฌ
Sort ์ฌ์ฉ๋ฒ
1) ์ปฌ๋ผ ๊ฐ์ผ๋ก ์ ๋ ฌ : ๋ฉ์๋์ ์ธ์ ๊ฐ์ผ๋ก ์ปฌ๋ผ์ ๋ฃ๊ณ , ๊ทธ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๊ธฐ
Sort sort1 = Sort.by("name").descending(); // ๋ด๋ฆผ์ฐจ์
Sort sort2 = Sort.by("password").ascending(); // ์ค๋ฆ์ฐจ์
Sort sortAll = sort1.and(sort2); // 2๊ฐ์ด์ ๋ค์ค์ ๋ ฌ๋ ๊ฐ๋ฅํ๋ค
Pageable pageable = PageRequest.of(0, 10, sortAll); // pageable ์์ฑ์ ์ถ๊ฐ
2) ์ปฌ๋ผ์ด ์๋ ๊ฐ์ผ๋ก ์ ๋ ฌ : @Query์ผ๋ก Alias๋ฅผ ๊ฑธ์ด์ค ๊ฐ์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ
// ์๋์ ๊ฐ์ด AS user_password ๋ก Alias(AS) ๋ฅผ ๊ฑธ์ด์ฃผ๋ฉด
@Query("SELECT u, u.password AS user_password FROM user u WHERE u.username = ?1")
List<User> findByUsername(String username, Sort sort);
// ์ด๋ ๊ฒ ํด๋น user_password ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ ์ ์๋ค.
List<User> users = findByUsername("user", Sort.by("user_password"));
3) SQL ํจ์๋ฅผ ์ฌ์ฉํ ์ ๋ ฌ : JpaSort
// ์๋์ ๊ฐ์ด ์ผ๋ฐ์ ์ธ ์ฟผ๋ฆฌ์์
@Query("SELECT u FROM user u WHERE u.username = ?1") // ์ด๊ฑด ์์ด๋๋จ
List<User> findByUsername(String username, Sort sort);
// ์ด๋ ๊ฒ ์ฟผ๋ฆฌํจ์ LENGTH() ์กฐ๊ฑด์ ๊ฑธ์ด์ password ๋ฌธ์๊ธธ์ด ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ ์ ์๋ค.
List<User> users = findByUsername("user", JpaSort.unsafe("LENGTH(password)"));
์ค๋ฌด ํ
1. List<T>๊ฐ ํ์ํ ๊ฒฝ์ฐ LIst<T>๋ก ๋ฐ์ ๊ฒ :
์ ์ฒด Count ์ฟผ๋ฆฌ๊ฐ ์ถ๊ฐ๋ก ๋ฐ์ํ๋ Page<T>๋ณด๋ค๋ List<T>๊ฐ ๋์ฉ๋ ์ฒ๋ฆฌํ ๋ ๋ ์์ ์ ์ด๊ณ ๋น ๋ฅด๋ค
2. Pageable๊ณผ ์ค์ ํ์ด์ง ์ฌ์ด -1 ๋ฌธ์ ํด๊ฒฐํ๊ธฐ : JPA ํ์ด์ง๋ 0๋ถํฐ์ธ๋ฐ ํ๋ฉด์ 1๋ถํฐ ์์ํ๋ ๋ฌธ์
~ -1 ์ฒ๋ฆฌ๋ฅผ ์ค๋ณต์ผ๋ก ํด์ค์ผํ๋ ์ด์
-> PageDTO๋ฅผ ๋ง๋ค์ด toPageable() ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์
3. Pageable์ Get API์ ์์ฒญ ํ๋๋ก ๋ฐ์์ค๊ธฐ
get API์์ ํ๋ผ๋ฏธํฐ๋ฅผ Pageable๋ก ๋ฐ์ผ๋ฉด ๋ณ๋๋ก @RequestParam์ ์ฌ์ฉํ์ง ์๊ณ ๋ ๋ฐ๋ก ๋ฐ์์ฌ ์ ์๋ค
'Spring๐' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| T ์์นด๋ฐ๋ฏธ : JPA ํ๋ก๊ทธ๋๋ฐ ๊ธฐ์ด (3) (0) | 2023.02.10 |
|---|---|
| SpringData ์ฟผ๋ฆฌ์ QueryDSL (0) | 2023.02.08 |
| SpringData ๊ตฌ์กฐ ๋ฐ JpaRepository ์๋ฆฌ (0) | 2023.02.03 |
| Raw JPA (0) | 2023.02.02 |
| ORM์ ํ์ ๋ฐฐ๊ฒฝ(JDBC, Querry Mapper) + ์ฑ์ฅ ๊ณผ์ (0) | 2023.02.01 |