Spring Data Jpa 를 사용하게 되면서 전에 쓰지 않았던 paging 기능에 대해서 이야기 해보려 한다.
Domain 을 조회하는 Repository interface를 만들때에 JpaRepository 를 상속해서 사용하는 경우가 많다.
이 JpaRepository 를 살펴보면 내부에 이렇게 구현이 되어있다.
public interface JpaRepository<T, ID> extends PagingAndSortingRepository<T, ID>, QueryByExampleExecutor {
.....
}
그리고 다시 PagingAndSortingRepository 를 살펴보면 다음과 같다.
public interface PagingAndSortingRepository<T, ID> extends CrudRepository<T, ID> {
Iterable findAll(Sort var1);
Page findAll(Pageable var1);
}
위에서 볼수 있듯이 Page를 리턴해주는 메소드가 이미 포함되어있다.
그럼 간단히 검색 조건 없이 모든 Data를 검색하는 코드를 작성해보자
AccountRestController.java
@GetMapping
public Page<AccountResDto> getPageableAccountList(Pageable pageable){
return accountService.findAll(pageable);
}
AccountServiceImpl.java
@Override
public Page<AccountResDto> findAll(Pageable pageable) {
Page<Account> accounts = accountRepository.findAll(pageable);
return accounts.map(AccountResDto::new);
}
http://localhost:9000/api/v1/accounts 로 요청을 하면 다음과 같이 응답을 받을수 있다.
{ "content": [ { "loginId": "admin", "username": "admin", "email": "admin@spring.com" }, { "loginId": "auser01", "username": "user", "email": "user01@spring.com" }, { "loginId": "guest", "username": "guest", "email": "guest@spring.com" }, { "loginId": "buser02", "username": "user", "email": "user02@spring.com" }, { "loginId": "cuser03", "username": "user", "email": "user03@spring.com" }, { "loginId": "duser04", "username": "user", "email": "user04@spring.com" }, { "loginId": "euser05", "username": "user", "email": "user05@spring.com" }, { "loginId": "fuser06", "username": "user", "email": "user06@spring.com" }, { "loginId": "guser07", "username": "user", "email": "user07@spring.com" }, { "loginId": "huser08", "username": "user", "email": "user08@spring.com" }, { "loginId": "iuser09", "username": "user", "email": "user09@spring.com" }, { "loginId": "juser10", "username": "user", "email": "user10@spring.com" } ], "pageable": { "sort": { "sorted": false, "unsorted": true, "empty": true }, "offset": 0, "pageSize": 20, "pageNumber": 0, "paged": true, "unpaged": false }, "last": true, "totalPages": 1, "totalElements": 12, "number": 0, "size": 20, "sort": { "sorted": false, "unsorted": true, "empty": true }, "first": true, "numberOfElements": 12, "empty": false } |
리턴 결과를 잘 보면 totalPages 는 1, data 개수는 12, size 는 20 으로 되어있다.
그리고 정렬된 결과를 얻고 싶으면 다음과 같이 파라메터를 추가해주면 된다.
http://localhost:9000/api/v1/accounts?sort=loginId,DESC
이렇게 하면 loginId 로 정렬된 형태의 결과를 받을수 있다. (그런데 주의할점은 컴마(,) 이후에 공백이 포함되어 있으면 에러가 난다 -_-)
그리고 size 도 지정할수 있는데 위 결과는 지정을 하지 않아서 기본 default 로 20 으로 설정된 경우이다.
마찬가지로 파라메터에 size 값을 지정해주면 지정한 값으로 size 가 정해지며 그에 따른 totalPages 값도 달라지게 된다.
위 코드가 포함된 소스는 아래 주소에서 볼수 있다. (단, 계속 수정을 하기 때문에 소스가 완전히 일치하지 않을수 있다. )
https://github.com/blusky10/study_spring
'Development > Java' 카테고리의 다른 글
Spring Boot Test Case 작성에 대한 생각 - Service Test (0) | 2021.02.17 |
---|---|
Spring Boot Test Case 작성에 대한 생각 - Repository Test (0) | 2021.02.17 |
[SpringBoot] @RequestBody 에 들어가는 Object 는 No-Argument Constructor 가 존재해야 한다. (0) | 2019.10.21 |
[Spring Boot] There is no PasswordEncoder mapped for the id "null" (0) | 2019.09.09 |
Spring Boot Controller Test 하다가 마주친 IllegalArgumentException (0) | 2019.03.07 |