조회할 데이터가 너무 많은 경우 자주 사용하게 되는 Paging 처리.
사실 필요한 경우는 너무 많고 예제도 다른 블로그에 잘 정리되어 있지만,
막상 만들자니 조회할 전체 건수를 불러오고 페이징할 단위별로 계산해주고 과정이 너무 복잡하다.
귀찮은 페이징을 Spring Data JPA에서 지원하는 방법으로 처리해보자.
간단한 예시로 이전 포스팅과 동일하게 게임 길드원에 대한 정보를 조회해보자.
GuildRepository에 Paging 메소드를 선언한다.
// 길드원 기여도에 따른 오름차순 Paging
public Page<Guild> findByContributionGreaterThan(int contribution, Pageable paging);
test 코드를 작성한다.
@Test
public void testFindByUserGreaterThan() {
Pageable paging = PageRequest.of(1, 10);
Page<Guild> results = guildRepo.findByContributionGreaterThan(100, paging);
results.forEach(guild -> System.out.println(guild));
}
코드를 보면 Pageable 객체와 PageRequest.of(1, 10)가 눈에 띈다.
Hibernate: select guild0_.index_no as index_no1_0_, guild0_.authority as authorit2_0_, guild0_.contribution as contribu3_0_, guild0_.guild_reg_date as guild_re4_0_, guild0_.level as level5_0_, guild0_.user_job as user_job6_0_, guild0_.user_name as user_nam7_0_ from tbml_guild_info guild0_ where guild0_.contribution>? limit ?, ?
Hibernate: select count(guild0_.index_no) as col_0_0_ from tbml_guild_info guild0_ where guild0_.contribution>?
Guild(indexNo=16, level=16, userName=cookie16, userJob=도적, authority=길드원, contribution=320, guildRegDate=2022-11-05 15:21:47.0)
Guild(indexNo=17, level=17, userName=cookie17, userJob=마법사, authority=길드원, contribution=340, guildRegDate=2022-11-05 15:21:47.0)
Guild(indexNo=18, level=18, userName=cookie18, userJob=기사, authority=길드원, contribution=360, guildRegDate=2022-11-05 15:21:48.0)
Guild(indexNo=19, level=19, userName=cookie19, userJob=기사, authority=길드원, contribution=380, guildRegDate=2022-11-05 15:21:48.0)
Guild(indexNo=20, level=20, userName=cookie20, userJob=기사, authority=길드원, contribution=400, guildRegDate=2022-11-05 15:21:48.0)
Guild(indexNo=21, level=21, userName=cookie21, userJob=마법사, authority=길드원, contribution=420, guildRegDate=2022-11-05 15:21:48.0)
Guild(indexNo=22, level=22, userName=cookie22, userJob=마법사, authority=길드원, contribution=440, guildRegDate=2022-11-05 15:21:48.0)
Guild(indexNo=23, level=23, userName=cookie23, userJob=마법사, authority=길드원, contribution=460, guildRegDate=2022-11-05 15:21:48.0)
Guild(indexNo=24, level=24, userName=cookie24, userJob=도적, authority=길드원, contribution=480, guildRegDate=2022-11-05 15:21:48.0)
Guild(indexNo=25, level=25, userName=cookie25, userJob=기사, authority=길드원, contribution=500, guildRegDate=2022-11-05 15:21:48.0)
실행 결과를 보면 주목할 점이 두 가지 보인다.
1. 테스트는 한번 실행했지만 SELECT 작업은 두 번 실행되었다.
=> 데이터 조회를 위한 SELECT
=> COUNT(*) 를 위한 SELECT
2. 조회 조건이 기여도(contribution)가 100 이상인 유저를 조회
=> DB에 100이상인 길드원은 45명이나 실제 조회된 것은 10명분이다. 즉, 페이징이 잘 처리된 것을 확인할 수 있다.
이제 본격적으로 Paging 처리에 대해 살펴보자.
1. Pageable 인터페이스와 PageRequest.of( )
Pageable 인터페이스는 페이징에 대한 많은 메소드가 존재하여 PageRequest 클래스를 통해 사용하는 것이 편하다.
모든 쿼리 메소드는 마지막 파라미터를 Pageable 인터페이스를 사용할 수 있다.
public Page<Guild> findByContributionGreaterThan(int contribution, Pageable paging);
당연히 PageRequest에는 페이징 처리에 대해 필요한 것들이 들어있다.
그 중 가장 편리하고 자주 사용하는 것이 PageRequest.of() 이다.
Pageable paging = PageRequest.of(0, 10);
# SpringBoot 2.0 아래의 버전에서는 new PageRequest()로 생성하지만 2.0에 들어서는 PageRequest.of()를 사용한다.
2. Sort
페이징된 데이터를 정렬할 때는 Sort 클래스를 이용한다.
Order By를 통한 처리도 가능하지만 PageRequest와 Sort를 사용하면 Order By와 달리 추가적인 기능을 쓸 수 있다.
아래는 실제 PageRequest.class 에 정의된 of 메소드이다.
// 페이지 번호와 페이지당 로우 수를 지정 ( page+1 번 페이지, 10개 로우 )
public static PageRequest of(int page, int size) {
return of(page, size, Sort.unsorted());
}
// 페이지 번호, 로우 수, 정렬방향
public static PageRequest of(int page, int size, Sort sort) {
return new PageRequest(page, size, sort);
}
// 페이지 번호, 로우 수, 정렬방향, 속성
public static PageRequest of(int page, int size, Direction direction, String... properties) {
return of(page, size, Sort.by(direction, properties));
}
Order By와 Sort의 가장 큰 차이는 세 번째 of 메소드의 [String... properties] 파라미터이다.
Order By를 사용하기 위해서는 쿼리 메소드에 OrderByLevelDesc() 처럼 사용하여 메소드명이 길어지지만
Sort를 통해 정렬하게 되면 속성 파라미터를 이용하여 정렬 방향을 지정할 수 있다.
@Test
public void testFindByUserGreaterThanPageSort() {
Pageable paging = PageRequest.of(1, 10, Sort.Direction.DESC, "level");
Page<Guild> results = guildRepo.findByContributionGreaterThan(100, paging);
results.forEach(guild -> System.out.println(guild));
}
Hibernate: select guild0_.index_no as index_no1_0_, guild0_.authority as authorit2_0_, guild0_.contribution as contribu3_0_, guild0_.guild_reg_date as guild_re4_0_, guild0_.level as level5_0_, guild0_.user_job as user_job6_0_, guild0_.user_name as user_nam7_0_ from tbml_guild_info guild0_ where guild0_.contribution>? order by guild0_.level desc limit ?, ?
Hibernate: select count(guild0_.index_no) as col_0_0_ from tbml_guild_info guild0_ where guild0_.contribution>?
Guild(indexNo=40, level=40, userName=cookie40, userJob=마법사, authority=길드원, contribution=800, guildRegDate=2022-11-05 15:21:48.0)
Guild(indexNo=39, level=39, userName=cookie39, userJob=도적, authority=길드원, contribution=780, guildRegDate=2022-11-05 15:21:48.0)
Guild(indexNo=38, level=38, userName=cookie38, userJob=도적, authority=길드원, contribution=760, guildRegDate=2022-11-05 15:21:48.0)
Guild(indexNo=37, level=37, userName=cookie37, userJob=도적, authority=길드원, contribution=740, guildRegDate=2022-11-05 15:21:48.0)
Guild(indexNo=36, level=36, userName=cookie36, userJob=마법사, authority=길드원, contribution=720, guildRegDate=2022-11-05 15:21:48.0)
Guild(indexNo=35, level=35, userName=cookie35, userJob=기사, authority=길드원, contribution=700, guildRegDate=2022-11-05 15:21:48.0)
Guild(indexNo=34, level=34, userName=cookie34, userJob=기사, authority=길드원, contribution=680, guildRegDate=2022-11-05 15:21:48.0)
Guild(indexNo=33, level=33, userName=cookie33, userJob=기사, authority=길드원, contribution=660, guildRegDate=2022-11-05 15:21:48.0)
Guild(indexNo=32, level=32, userName=cookie32, userJob=도적, authority=길드원, contribution=640, guildRegDate=2022-11-05 15:21:48.0)
Guild(indexNo=31, level=31, userName=cookie31, userJob=기사, authority=길드원, contribution=620, guildRegDate=2022-11-05 15:21:48.0)
예제의 코드와 위의 코드와의 차이점은 PageRequest.of( ... ) 의 파라미터에 Sort 관련 파라미터가 추가된 것이다.
그리고 조회결과에서도 예제와 동일한 쿼리메소드를 사용했음에도 전혀 다른 결과가 나오는 것을 볼 수 있다.
3. Page<T>
보통 JPA를 통해 조회한 결과를 List<T>를 사용하여 관리하지만, Page<T> 타입을 이용하면
SpringMVC와 연동할 때 많은 이점을 제공해 준다. 즉, 웹페이지와 관련된 작업에 유용한 기능을 제공해준다.
@Test
public void testFindByUserGreaterThanPageSort() {
Pageable paging = PageRequest.of(1, 10, Sort.Direction.DESC, "level");
Page<Guild> results = guildRepo.findByContributionGreaterThan(100, paging);
// Page<T> 부과기능 : 내용과 건수를 한번에 조회 가능
System.out.println("PAGE SIZE: " + results.getSize());
System.out.println("TOTAL PAGES: " + results.getTotalPages());
System.out.println("TOTAL COUNT: " + results.getTotalElements());
System.out.println("NEXT: " + results.nextPageable());
List<Guild> list = results.getContent();
results.forEach(guild -> System.out.println(list));
}
Page<T> 객체인 results를 통해 페이징에 대한 정보를 출력하는 것을 확인할 수 있다.
Hibernate: select guild0_.index_no as index_no1_0_, guild0_.authority as authorit2_0_, guild0_.contribution as contribu3_0_, guild0_.guild_reg_date as guild_re4_0_, guild0_.level as level5_0_, guild0_.user_job as user_job6_0_, guild0_.user_name as user_nam7_0_ from tbml_guild_info guild0_ where guild0_.contribution>? order by guild0_.level desc limit ?, ?
Hibernate: select count(guild0_.index_no) as col_0_0_ from tbml_guild_info guild0_ where guild0_.contribution>?
PAGE SIZE: 10
TOTAL PAGES: 5
TOTAL COUNT: 45
NEXT: Page request [number: 2, size 10, sort: level: DESC]
[Guild(indexNo=40, level=40, userName=cookie40, userJob=마법사, authority=길드원, contribution=800, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=39, level=39, userName=cookie39, userJob=도적, authority=길드원, contribution=780, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=38, level=38, userName=cookie38, userJob=도적, authority=길드원, contribution=760, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=37, level=37, userName=cookie37, userJob=도적, authority=길드원, contribution=740, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=36, level=36, userName=cookie36, userJob=마법사, authority=길드원, contribution=720, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=35, level=35, userName=cookie35, userJob=기사, authority=길드원, contribution=700, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=34, level=34, userName=cookie34, userJob=기사, authority=길드원, contribution=680, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=33, level=33, userName=cookie33, userJob=기사, authority=길드원, contribution=660, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=32, level=32, userName=cookie32, userJob=도적, authority=길드원, contribution=640, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=31, level=31, userName=cookie31, userJob=기사, authority=길드원, contribution=620, guildRegDate=2022-11-05 15:21:48.0)]
[Guild(indexNo=40, level=40, userName=cookie40, userJob=마법사, authority=길드원, contribution=800, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=39, level=39, userName=cookie39, userJob=도적, authority=길드원, contribution=780, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=38, level=38, userName=cookie38, userJob=도적, authority=길드원, contribution=760, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=37, level=37, userName=cookie37, userJob=도적, authority=길드원, contribution=740, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=36, level=36, userName=cookie36, userJob=마법사, authority=길드원, contribution=720, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=35, level=35, userName=cookie35, userJob=기사, authority=길드원, contribution=700, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=34, level=34, userName=cookie34, userJob=기사, authority=길드원, contribution=680, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=33, level=33, userName=cookie33, userJob=기사, authority=길드원, contribution=660, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=32, level=32, userName=cookie32, userJob=도적, authority=길드원, contribution=640, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=31, level=31, userName=cookie31, userJob=기사, authority=길드원, contribution=620, guildRegDate=2022-11-05 15:21:48.0)]
[Guild(indexNo=40, level=40, userName=cookie40, userJob=마법사, authority=길드원, contribution=800, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=39, level=39, userName=cookie39, userJob=도적, authority=길드원, contribution=780, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=38, level=38, userName=cookie38, userJob=도적, authority=길드원, contribution=760, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=37, level=37, userName=cookie37, userJob=도적, authority=길드원, contribution=740, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=36, level=36, userName=cookie36, userJob=마법사, authority=길드원, contribution=720, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=35, level=35, userName=cookie35, userJob=기사, authority=길드원, contribution=700, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=34, level=34, userName=cookie34, userJob=기사, authority=길드원, contribution=680, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=33, level=33, userName=cookie33, userJob=기사, authority=길드원, contribution=660, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=32, level=32, userName=cookie32, userJob=도적, authority=길드원, contribution=640, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=31, level=31, userName=cookie31, userJob=기사, authority=길드원, contribution=620, guildRegDate=2022-11-05 15:21:48.0)]
[Guild(indexNo=40, level=40, userName=cookie40, userJob=마법사, authority=길드원, contribution=800, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=39, level=39, userName=cookie39, userJob=도적, authority=길드원, contribution=780, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=38, level=38, userName=cookie38, userJob=도적, authority=길드원, contribution=760, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=37, level=37, userName=cookie37, userJob=도적, authority=길드원, contribution=740, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=36, level=36, userName=cookie36, userJob=마법사, authority=길드원, contribution=720, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=35, level=35, userName=cookie35, userJob=기사, authority=길드원, contribution=700, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=34, level=34, userName=cookie34, userJob=기사, authority=길드원, contribution=680, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=33, level=33, userName=cookie33, userJob=기사, authority=길드원, contribution=660, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=32, level=32, userName=cookie32, userJob=도적, authority=길드원, contribution=640, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=31, level=31, userName=cookie31, userJob=기사, authority=길드원, contribution=620, guildRegDate=2022-11-05 15:21:48.0)]
[Guild(indexNo=40, level=40, userName=cookie40, userJob=마법사, authority=길드원, contribution=800, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=39, level=39, userName=cookie39, userJob=도적, authority=길드원, contribution=780, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=38, level=38, userName=cookie38, userJob=도적, authority=길드원, contribution=760, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=37, level=37, userName=cookie37, userJob=도적, authority=길드원, contribution=740, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=36, level=36, userName=cookie36, userJob=마법사, authority=길드원, contribution=720, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=35, level=35, userName=cookie35, userJob=기사, authority=길드원, contribution=700, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=34, level=34, userName=cookie34, userJob=기사, authority=길드원, contribution=680, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=33, level=33, userName=cookie33, userJob=기사, authority=길드원, contribution=660, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=32, level=32, userName=cookie32, userJob=도적, authority=길드원, contribution=640, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=31, level=31, userName=cookie31, userJob=기사, authority=길드원, contribution=620, guildRegDate=2022-11-05 15:21:48.0)]
[Guild(indexNo=40, level=40, userName=cookie40, userJob=마법사, authority=길드원, contribution=800, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=39, level=39, userName=cookie39, userJob=도적, authority=길드원, contribution=780, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=38, level=38, userName=cookie38, userJob=도적, authority=길드원, contribution=760, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=37, level=37, userName=cookie37, userJob=도적, authority=길드원, contribution=740, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=36, level=36, userName=cookie36, userJob=마법사, authority=길드원, contribution=720, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=35, level=35, userName=cookie35, userJob=기사, authority=길드원, contribution=700, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=34, level=34, userName=cookie34, userJob=기사, authority=길드원, contribution=680, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=33, level=33, userName=cookie33, userJob=기사, authority=길드원, contribution=660, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=32, level=32, userName=cookie32, userJob=도적, authority=길드원, contribution=640, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=31, level=31, userName=cookie31, userJob=기사, authority=길드원, contribution=620, guildRegDate=2022-11-05 15:21:48.0)]
[Guild(indexNo=40, level=40, userName=cookie40, userJob=마법사, authority=길드원, contribution=800, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=39, level=39, userName=cookie39, userJob=도적, authority=길드원, contribution=780, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=38, level=38, userName=cookie38, userJob=도적, authority=길드원, contribution=760, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=37, level=37, userName=cookie37, userJob=도적, authority=길드원, contribution=740, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=36, level=36, userName=cookie36, userJob=마법사, authority=길드원, contribution=720, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=35, level=35, userName=cookie35, userJob=기사, authority=길드원, contribution=700, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=34, level=34, userName=cookie34, userJob=기사, authority=길드원, contribution=680, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=33, level=33, userName=cookie33, userJob=기사, authority=길드원, contribution=660, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=32, level=32, userName=cookie32, userJob=도적, authority=길드원, contribution=640, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=31, level=31, userName=cookie31, userJob=기사, authority=길드원, contribution=620, guildRegDate=2022-11-05 15:21:48.0)]
[Guild(indexNo=40, level=40, userName=cookie40, userJob=마법사, authority=길드원, contribution=800, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=39, level=39, userName=cookie39, userJob=도적, authority=길드원, contribution=780, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=38, level=38, userName=cookie38, userJob=도적, authority=길드원, contribution=760, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=37, level=37, userName=cookie37, userJob=도적, authority=길드원, contribution=740, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=36, level=36, userName=cookie36, userJob=마법사, authority=길드원, contribution=720, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=35, level=35, userName=cookie35, userJob=기사, authority=길드원, contribution=700, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=34, level=34, userName=cookie34, userJob=기사, authority=길드원, contribution=680, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=33, level=33, userName=cookie33, userJob=기사, authority=길드원, contribution=660, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=32, level=32, userName=cookie32, userJob=도적, authority=길드원, contribution=640, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=31, level=31, userName=cookie31, userJob=기사, authority=길드원, contribution=620, guildRegDate=2022-11-05 15:21:48.0)]
[Guild(indexNo=40, level=40, userName=cookie40, userJob=마법사, authority=길드원, contribution=800, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=39, level=39, userName=cookie39, userJob=도적, authority=길드원, contribution=780, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=38, level=38, userName=cookie38, userJob=도적, authority=길드원, contribution=760, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=37, level=37, userName=cookie37, userJob=도적, authority=길드원, contribution=740, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=36, level=36, userName=cookie36, userJob=마법사, authority=길드원, contribution=720, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=35, level=35, userName=cookie35, userJob=기사, authority=길드원, contribution=700, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=34, level=34, userName=cookie34, userJob=기사, authority=길드원, contribution=680, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=33, level=33, userName=cookie33, userJob=기사, authority=길드원, contribution=660, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=32, level=32, userName=cookie32, userJob=도적, authority=길드원, contribution=640, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=31, level=31, userName=cookie31, userJob=기사, authority=길드원, contribution=620, guildRegDate=2022-11-05 15:21:48.0)]
[Guild(indexNo=40, level=40, userName=cookie40, userJob=마법사, authority=길드원, contribution=800, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=39, level=39, userName=cookie39, userJob=도적, authority=길드원, contribution=780, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=38, level=38, userName=cookie38, userJob=도적, authority=길드원, contribution=760, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=37, level=37, userName=cookie37, userJob=도적, authority=길드원, contribution=740, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=36, level=36, userName=cookie36, userJob=마법사, authority=길드원, contribution=720, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=35, level=35, userName=cookie35, userJob=기사, authority=길드원, contribution=700, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=34, level=34, userName=cookie34, userJob=기사, authority=길드원, contribution=680, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=33, level=33, userName=cookie33, userJob=기사, authority=길드원, contribution=660, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=32, level=32, userName=cookie32, userJob=도적, authority=길드원, contribution=640, guildRegDate=2022-11-05 15:21:48.0), Guild(indexNo=31, level=31, userName=cookie31, userJob=기사, authority=길드원, contribution=620, guildRegDate=2022-11-05 15:21:48.0)]
Page에 대한 사이즈와 ROW의 수 등 페이지에 대한 정보를 한번에 확인이 가능하며,
Web에 페이지 정보를 전달하여 더욱 유용하게 사용할 수 있다.
Page<T> 가 제공해주는 유용한 메소드는 다음과 같다.
int getNumber() | 현재 페이지이 정보 |
int getSize() | 한 페이지의 크기 |
int getTotalPages() | 전체 페이지의 수 |
int getNumberOfElements() | 결과 데이터 수 |
boolean hasPreviousPage() | 이전 페이지의 존재 여부 |
boolean hasNextPage() | 다음 페이지의 존재 여부 |
boolean isLastPage() | 마지막 페이지인가 여부 |
Pageable nextPageable() | 다음 페이지 객체 |
Pageable previousPageable() | 이전 페이지 객체 |
List<T> getCount() | 조회된 데이터 |
boolean hasContent() | 결과 존재 여부 |
Sort getSrot() | 검색에 사용된 Sort 정보 |
※ Spring Data JPA는 구멍가게코딩단의 [초급 개발자들을 위한 가볍고 넓은 스프링부트 스타트 스프링 부트2.0] 책을 참고하였습니다.
'SPRING BOOT > SPRING DATA JPA' 카테고리의 다른 글
Spring Data JPA : @Qeury를 이용한 데이터 조회 (0) | 2022.11.19 |
---|---|
Spring Data JPA [SELECT] 쿼리메소드 (0) | 2022.11.05 |
Spring Data JPA 연동하기 + 간단한 Insert (0) | 2022.10.10 |
Spring Data JPA 개요 (0) | 2022.10.10 |