ํ์ด์ง๋ค์ด์ ?
ํ์ด์ง์ ๊ฒ์๊ธ, ๋๊ธ ๋ฑ์ ํ์ถํ ์์ด ๋ง์์ง๋, ์์ฃผ ์ค์ํ ์ญํ ์ ํ๋ค. ํ์ด์ง์ ํตํด์ ๋ง์ ์ ๋ณด ์ฆ, ์๋ฐฑ ์์ฒ๊ฐ์ ๊ฒ์๊ธ๋ฑ์ ์ ๋ณด๋ฅผ ํ์ด์ง๋ก ๋๋ ์ ํจ๊ณผ์ ์ผ๋ก ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ฒ ํ๋ค.
์ด๋ฐ ํ์ด์ง์ ์ํด์๋ page๊ด๋ จ ์ฟผ๋ฆฌ๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ด ์์ง๋ง, Spring Data JPA์์ ํจ๊ณผ์ ์ธ ํ์ด์ง ์ฒ๋ฆฌ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
JpaRepository ์ ๋ถ๋ชจ์ธํฐํ์ด์ค์ธ PagingAndSortingRepository์์ ํ์ด์ง๊ณผ Sorting ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ค.
findAll() ๋ฉ์๋์ ๋ฐํ ํ์ ์ ์ดํด๋ณด๋ฉด, ์๋์ ๊ฐ์ ๋ฉ์๋๊ฐ ์กด์ฌํ๋ค.
- Pageable : ํ์ด์ง์ ์ ๊ณตํ๋ ์ธํฐํ์ด์ค
- Page : ํ์ด์ง์ findAll()์ ๊ธฐ๋ณธ์ ์ธ ๋ฐํ ๋ฉ์๋๋ก ์ฌ๋ฌ ๋ฐํํ์ ์ค ํ๋
์ฆ, JpaRepository<>๋ฅผ ์ฌ์ฉํ ๋ findAll() ๋ฉ์๋๋ฅผ Pageble ์ธํฐํ์ด์ค๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ๋๊ธฐ๋ฉด ํ์ด์ง์ ์ฌ์ฉํ ์์๋ค.
์ฝ๋
Controller
/**
* ์คํ๋ง์์๋ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ด์ง ๋ฒํธ๋ฅผ 0๋ถํฐ ์์ํ๋ค. -> ์ด๋ฅผ ์ํด์ controller์ชฝ์์ page-1 ์ ํด์ ์ฌ๋ฐ๋ฅธ ๋ฒํธ๋ฅผ ์กฐํํ ์์๊ฒ ํด์ค.
* @param page : ํ์ด์ง๋ค์ด์
์ ์ํ ํ์ด์ง ๋ฒํธ
* @param size : ํ ํ์ด์ง์ ํ์๋์ด์ผ ํ ๋ฐ์ดํฐ ๊ฐ์(row)
* @return
*/
@GetMapping
public ResponseEntity getLicenses(@RequestParam int page,
@RequestParam int size){
Page<License> pageLicenses = licenseService.findLicenses(page, size);
List<License> licenses = pageLicenses.getContent();
return new ResponseEntity<>(
new MultiResponseDto<>(licenses,pageLicenses),HttpStatus.OK
);
}
Service
/**
* ํ์ด์ง๋ค์ด์
์ฒ๋ฆฌ๊ฐ ๋ ์๊ฒฉ์ฆ ์ ๋ณด ๋ชฉ๋ก์ ๋ฆฌํด
* @param page
* @param size
* @return
*/
public Page<License> findLicenses(int page, int size) {
return licenseRepository.findAll(PageRequest.of(page-1, size, Sort.by("id").ascending()));
}
//page-1 ์ ํ๋ ์ด์ ๋ page+1์ด ๋์ด์์ผ๋ฏ๋ก.
//id๋ก sorting ์ค๋ฆ์ฐจ์(ascending)
MultiResponseDto
@Getter
public class MultiResponseDto<T> {
private List<T> data; // ์๋ต ๋ฐ์ดํฐ ๋ชฉ๋ก ๋ด๋ ํ๋
private PageInfo pageInfo; // ํ์ด์ง ์ ๋ณด ๋ด๋ ํ๋
public MultiResponseDto(List<T> data, Page page) {
this.data = data;
// ํ์ด์ง ๋ฒํธ 0๋ถํฐ ์์ํ๊ธฐ ๋๋ฌธ์ 1๋ถํฐ ์์ํ๋ ๊ฑธ๋ก ๋ณ๊ฒฝ
this.pageInfo = new PageInfo(page.getNumber() + 1,
page.getSize(), page.getTotalElements(), page.getTotalPages());
}
}
PageInfo
@AllArgsConstructor
@Getter
public class PageInfo {
private int page;
private int size;
private long totalElements;
private long totalPage;
}
๊ฒฐ๊ณผ
ํ์ด์ง ๋ฐํํ์
Page<T>
type
Page<T>
ํ์ ์ผ๋ก ๋ฐํํ๋ฉด offset๊ณผ totalPage๋ฅผ ์ด์ฉํด์ ์๋น์ค๋ฅผ ์ ๊ณตํ ์์๋ค.Page<T>
๋ ์ผ๋ฐ์ ์ธ ๊ฒ์ํ ํํ์ ํ์ด์ง์์ ์ฌ์ฉ๋๋ค.- ์์ ์์ ์ฝ๋์ ์์ฑ๋๊ฒ์ด Pageํ์ ์ผ๋ก ๋ํ๋ธ๊ฒ์ด๋ค.
Page<T>
ํ์ ์ count์ฟผ๋ฆฌ๋ฅผ ํฌํจํ๋ ํ์ด์ง์ผ๋ก count์ฟผ๋ฆฌ๊ฐ ์๋์ผ๋ก ์์ฑ๋์ด ํจ๊ป ๋๊ฐ๋ค.
Slice<T>
type
- slice ํ์ ์ ๋ฐํ ํ์ ์ผ๋ก ๋ฐ์ผ๋ฉด ๋๋ณด๊ธฐ ํํ์ ํ์ด์ง์ผ๋ก ๋ํ๋๋ค.
List<T>
type
@GetMapping("/users")
public List<User> getAllUsers(Pageable pageable) {
return userRepository.findAll(pageable); }
- List ๋ฐํ ํ์ ์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก count ์ฟผ๋ฆฌ ์์ด ๊ฒฐ๊ณผ๋ง ๋ฐํ๋๋ค.