[JDBC] Pagination ์ค์ต
Categories: Spring
๐ ๊ฐ์ธ์ ์ธ ๊ณต๊ฐ์ผ๋ก ๊ณต๋ถ๋ฅผ ๊ธฐ๋กํ๊ณ ๋ณต์ตํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ๋ธ๋ก๊ทธ์
๋๋ค.
์ ํํ์ง ์์ ์ ๋ณด๊ฐ ์์ ์ ์์ผ๋ ์ฐธ๊ณ ๋ฐ๋๋๋ค :๐ธ
[ํ๋ฆฐ ๋ด์ฉ์ ๋๊ธ๋ก ๋จ๊ฒจ์ฃผ์๋ฉด ๋ณต๋ฐ์ผ์ค๊ฑฐ์์]
Pagination ๊ตฌํ ์ค์ต
1์ฐจ ์๋
Paginaiton์ด ์ฒ์์ด๋ผ ์ค์ต ํ๊ธฐ ์ ๋ถํฐ ๋ฏธ๋ฆฌ ๊ฒ์ํด๋ดค๋๋ฐ ๋ค ๋ฌด์จ ๋ง์ธ์ง ์ ๋ชจ๋ฅด๊ฒ ์ด์
ํ์ฐธ ๊ฒ์ํ๋ค๊ฐ ์ ๋ง ์ดํดํ๊ธฐ ์ฝ๊ฒ posting ๋ ์ฌ์ดํธ๊ฐ ์์ด์ ๊ณต์ ๋ฌธ์ ๊ฐ์ ๊ฑด ์ค ์์๋๋ฐ ๋ธ๋ก๊ทธ ๊ฐ์ ๊ณณ์ ๊ฒ์๋ ๊ธ์ด์์
๊ทธ๋๋ ์ฒ์์ ์ ๊ทผํ๊ธฐ ์ฌ์์ ํด๋น ํฌ์คํธ๋ฅผ ์ ์ผ ๋ง์ด ์ฐธ๊ณ ํ๋ค.
https://medium.com/@barisalgun/spring-boot-pagination-524083e699fc
์ผ๋จ ์ด๋ป๊ฒ๋ ๊ตฌํํด๋ณด๊ณ @Repository ์์ฑ ์ํด์ ์ค๋ฅ๋ ๊ฒช๋ค๊ฐโฆ
POSTMAN์ ๋๋์ด get์์ฒญ์ ํ๋ค.
Pageinfo๊ฐ ์ ๋์ด
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
{
"data": [
{
"memberId": 16,
"email": "hgd16@gmail.com",
"name": "ํ๊ธธ๋16",
"phone": "010-1616-1616"
},
{
"memberId": 15,
"email": "hgd15@gmail.com",
"name": "ํ๊ธธ๋15",
"phone": "010-1515-1515"
},
{
"memberId": 14,
"email": "hgd14@gmail.com",
"name": "ํ๊ธธ๋14",
"phone": "010-1414-1414"
},
{
"memberId": 13,
"email": "hgd13@gmail.com",
"name": "ํ๊ธธ๋13",
"phone": "010-1313-1313"
}
],
"pageInfo": {
"page": 0,
"size": 0,
"totalElements": 0,
"totalPages": 0
}
}
์๊ทธ๋๋ ์์ฑํ๋ค๊ฐ ์ฐ์ฐํ๋ ๋ถ๋ถ์ด ์์๋๋ฐ mapper ์์ฑ ๋ถ๋ถ์์ Dto๋ก ๋ณํ์ PageInfo์ ๊ฐ์ ๋ถ๋ฌ์์ผ ๋๋๋ฐ ๋ถ๋ฌ์ฌ ์ ์์ด์ ๊ธฐ๋ณธ ์์ฑ์๋ก ๋ฃ์ด์ ๊ทธ๋ฐ ๊ฒ ๊ฐ์
1
2
3
4
5
6
default MemberPageResponseDto membersToMemberPageResponseDto(Page<Member> members){
//members.getContent() => List<Member>
MemberPageResponseDto memberPageResponseDto =
new MemberPageResponseDto(members.getContent(),new PageInfo());
return memberPageResponseDto;
}
PageInfo๋ ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญ์ ์๋์ผ๋ก ๋งค๊ฐ๋ณ์๊ฐ ๋ค์ด์ค๋,,,? ์๊ฐํ๋๋ฐ
๋น์ฐํ ๋ด๊ฐ ๊ตฌํํด์ผ ํ๊ณ ์ด๊ฑธ ์ด๋ป๊ฒ ๊ตฌํํ๋ ์ถ์ด์ ์ฐพ์๋ณด๋
Page๋ Slice๋ฅผ ์์๋ฐ๊ณ Slice์ ์ด๋ฏธ ๊ตฌํ๋์ด์์ด์
Page
์ฆ ๋งค๊ฐ๋ณ์๋ก ๋ค์ด์ค๋ Page
2์ฐจ ์๋ ๋ฐ ๋ค๋ฅธ Entity ๊ตฌํ
member์ด์ธ์ Order์ Coffee์๋ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๋จผ์ ๊ตฌํ ํ ๋ฆฌํฉํ ๋ง ํ๊ธฐ๋ก ํจ,
coffee ๊ตฌํ ๋คํ๊ณ ์ค๋ฅ ๋ง๋ฌ๋๋ฐ get ์์ฒญ์ 500์๋ฌ๊ฐ ๋์๋ค.
๋นํฉํด์ ์ฝ์๋ณด๋ HttpMediaTypeNotAcceptableException: Could not find acceptable representation ๋ผ๊ณ ์ค๋ฅ๋ฉ์ธ์ง ๋ฐ์..
ํน์ ์ ๋ํ ์ด์ ์ด๋ ๋ญ ๋น ์ง๊ฒ ์๋ ํ์ฐธ ์ฐพ๋ค๊ฐ ์๊ฒ๋ ๊ฒ์
DTO ํด๋์ค ๋ง๋ค๋ฉด์ @Getter ๋น ์ ธ๋จน์โฆ!
๋ค์ฌ ๋ค๋ ํ์ง๋ง ๋ฌดํผ ๋ค ๊ตฌํํ๋๋ฐ ๋ช๊ฐ์ง ๋ฌธ์ ์ ์ด ์์์.
๋ฌธ์ ์
- pagination 0๋ถํฐ ์์ํ๋ฏ๋ก ์์ ํ์
- data๊ฐ 20๋ถํฐ์ธ๋ฐ ์ค์ ๋ก page 1์ ์กฐํํ๋ฉด ์๊พธ 20 ๋ถํฐ ์๋์ค๊ณ ์ด์ค๊ฐํ ์ซ์๊ฐ ์กฐํ๋จ.
- paginationํ ๋ ๊ฐ์ฅ ์ฒซ ํ์ด์ง๋ 0์ธ ๊ฒ, ์ด๊ฑด ํญ์ ๊ธฐ์ตํ๊ธฐ.
- ์ผ๊ด๋๊ฒ ๋์ํด์ผ ํจ : PSA ( ์ด๋ค ๊ฒ์ด ๋ค์ด์ค๋ findAll์ด ์ผ๊ด๋๊ฒ ๋์ํด์ผ ํจ. โ PagingAndSortingRepository ํ์ฉํด๋ณด๊ธฐ
- PageResponseDto โ ์ ์ญ์์ ์ฌ์ฉํ ์ ์๊ฒ ์ ๋ค๋ฆญ ํ์ฉ
Refactoring
page, size ์์
-
coffee์ ๋ฐ์ดํฐ๋ 2๊ฐ ๋ค์ด๊ฐ ์๊ณ coffeeId๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์กฐํํ๊ณ ์๊ธฐ ๋๋ฌธ์ page= 1์ size=1๋ก ์์ฒญํ๋ฉด coffeeId๋ 2๊ฐ ๋์ค๋๊ฒ ๋ง๋๋ฐ 1์ด ๋์ด,
-
๋ชฐ๋๋๋ฐ Pagination์์ page๋ 0๋ถํฐ ์์ํ๋ค๊ณ ํจ.
๊ทธ๋์ controller์์๋ page-1, pageinfo์์ .getNumber()์๋ +1๋ก ์์ ํจ.
1 2 3 4 5 6 7 8 9 10 11 12 13 14
//Cotroller @GetMapping public ResponseEntity getCoffees(@Positive @RequestParam(name="page",defaultValue = "1") int page, @Positive @RequestParam(name="size",defaultValue = "1") int size){ Pageable pageable = PageRequest.of(page-1, size, Sort.by("coffeeId").descending()); CoffeePageResponseDtos response = mapper.CoffeesToCoffeePageResponseDtos(coffeeService.findCoffees(pageable)); return new ResponseEntity<>(response, HttpStatus.OK); } //PageInfo new PageInfo(coffees.getNumber()+1, coffees.getSize(), coffees.getNumberOfElements(), coffees.getTotalPages());
-
๊ฒฐ๊ณผ ์๋์ด!
PSA ์ ์ฉ โ PagingAndSortingRepository
-
PagingAndSortingRepository ์ CrudRepository๋ฅผ ์์ ๋ฐ๊ธฐ ๋๋ฌธ์ ์ฝ๊ฒ ์์ ๊ฐ๋ฅ.
์ค์ ๊ตฌํ์ฒด๋ SimpleJdbcRepository.class
findAll์ด ๊ตฌํ๋์ด ์์.
-
๊ทธ๋์ ๋ค๋ฅธ ์ฝ๋ ์์ ์์ด CrudeRepository ์์ PagingAndSortingRepository๋ง ๋ณ๊ฒฝํ๋ฉด ๋๋๋ฐ ๋๊ฐ์ ๊ฒฝ์ฐ Sort ๊ธฐ๋ฅ ์ถ๊ฐ ํ๊ณ ์ถ์ด์ cotroller์์ ์ถ๊ฐํจ
1
Pageable pageable = PageRequest.of(page-1, size, Sort.by("coffeeId").descending());
-
PageRequest.of์ ํ๋ผ๋ฏธํฐ์ Sort๊ฐ ์์ ๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์๋ฌด๊ฒ๋ ๋ฃ์ง ์์
โจโจโจ~PageResponseDto โ ์ ์ญ์์ ์ฌ์ฉํ ์ ์๊ฒ ํ๊ธฐ.
-
๋น์ทํ ๊ธฐ๋ฅ์ ํ๋ ํด๋์ค๋ฅผ ์ ์ญ์ผ๋ก ๋บ ํ ๋ชจ๋ ์ํฐํฐ์ ์ ์ฉํ ์ ์๊ฒ ๊ฐ์ ํ๊ธฐ.
-
์ ์ญ์ ์๋ response ํจํค์ง์ PageResponseDtos๋ง๋ค๊ณ ํด๋น ๊ฐ์ฒด๊ฐ ์๋ mapper์ cotroller ์์
1 2 3 4 5 6
@AllArgsConstructor @Getter public class PageResponseDtos <T> { private List<T> data; private PageInfo pageInfo; }
- ์ฌ์ค ์ ๋ค๋ฆญ์ ์ฌ์ฉํ ์ ์ ์ ์์ด์ data์ Object ํ์ ์ฌ์ฉํ์๋ค๊ฐ ๊ฐ์ฌ๋ํํ ์ฝ๋ ๊ฒํ ์์ฒญ์ Object๋ ์ฌ์ฉํ๋ฉด ์๋๋ค๊ณ ํ์ฌ.
- ๊ทธ๋์ List
๋ก ์ฐ๋ ค๊ณ ํ์๋๋ฐ ์๊พธ ์ค๋ฅ๋์ ์ฌ์ฉ ๋ชปํ์๋ค. - ํด๋์ค ์ด๋ฆ์๋
๋ฅผ ๋ช ์ํด ์ฃผ์ด์ผ ์๋ฌ๊ฐ ์๋จ!
-
์ ๋ค๋ฆญ
- ์ ๋ค๋ฆญ ๋์ Object ์ฌ ์ ์์ง๋ง ์ฐ๋ฉด ๋๋ฌด ์ํํ๊ธฐ ๋๋ฌธ์ ์ ์ฐ๋ ๊ฒ์ด ์ข์.
- ์ ๋ค๋ฆญ์ ๋ชจ๋ ํ์ ์ ํ์ฉํ๋ ๊ฒ์ด ์๋ ์ ํํ๋ ๊ฒ โ ๋ชจ๋ ํ์ ํ์ฉ์ Object.
- ์ ๋ค๋ฆญ์ ํ์ ์ ์ ํํ๊ธฐ ์ํด ์ฌ์ฉ, ๋ฐํ๊ฐ์ด List๋ผ๋ ๊ฒ์ ๋ณด์ฅํ ์ ์์ (์ํํ ์ ํ ์์ด๋)
Comment
์ค๋ ๊ฑฐ์ ๋๋ถ๋ถ์ Paginaition ๊ตฌํํ๋ ์ค์ต๊ณผ ๋ฆฌํฉํ ๋ง ํ๋ ์๊ฐ์ ๊ฐ์ก๋๋ฐ
๋ฐฐ์ฐ์ง ์์๋ ๊ฑธ ๊ตฌํํ๋ ๊ฒ์ ์ ๋ง ์ฝ์ง ์์ ์ผ์ธ ๊ฒ ๊ฐ๋คโฆ
Page์ Pageable์ด ์ด๋ฏธ ๊ตฌํ๋์ด ์์ด์ ๋คํ์ด์ง ์ค์ ๋ก ๋ด๊ฐ ๊ตฌํํ๋ผ๊ณ ํ์ผ๋ฉด ์์ง๋ ๋๋์ง ์์์์ง๋โฆ? ๋ชจ๋ฅธ๋คโฆ๊ทผ๋ฐ ๊ฐ์ฌ๋์ ๊ทธ๊ฒ๋ ๊ตฌํํ ์ค ์์์ผ ํ๋ค๊ณ ํ์ฌ.
๊ทธ๋ฆฌ๊ณ ์๊พธ ๋ธ๋ก๊ทธ ๊ธ์ ์ฐธ์กฐํ๊ฒ ๋๋๋ฐ ๊ณต์๋ฌธ์๋ ์ธํ ๋ฆฌ์ ์ด์์ ๊ตฌํ์ฒด ๋ค์ด๊ฐ์ ํ์ธํ๋ ๊ฒ ์ฐ์ตํด์ผ๊ฒ ๋ค.
Leave a comment