JPA를 이용해서 Paging API를 처리해보자.
JpaRepository는 PagingAndSortingRepository를 상속받고 있으므로 CurdRepository보다 하위 클래스인 JpaRepository를 상속받아 구현하자.
public interface WorkGroupRepository extends JpaRepository<WorkGroup, Long> {
Page<WorkGroup> findByWorkGroupNmContaining(String workGroupNm, Pageable pageable);
}
예제
@RestController
@RequestMapping("/workgroup")
@RequiredArgsConstructor
public class WorkGroupController {
@GetMapping
public Page<WorkGroupResponse> getAll(@RequestParam(required = false) final String search, final Pageable pageable) {
return workGroupService.getByWorkGroupNm(search, pageable)
.map(WorkGroupResponse::new);
}
}
@Service
@RequiredArgsConstructor
public class WorkGroupService {
public Page<WorkGroup> getByWorkGroupNm (final String search, final Pageable pageable) {
if (search == null) {
return workGroupRepository.findAll(pageable);
}
return workGroupRepository.findByWorkGroupNmContaining(search, pageable);
}
}
컨트롤러에서 Pageable 인터페이스를 받고, 서비스에서도 repository에 Pageable을 넘기면 된다.
결과
{
"content": [
{
"workGroupSeq": 1,
"workGroupNm": "작업1",
"createdDate": "2020-09-18T15:01:52.358",
"lastModifiedDate": "2020-09-18T15:01:52.358"
},
{
"workGroupSeq": 2,
"workGroupNm": "작업2",
"createdDate": "2020-09-18T15:01:56.691",
"lastModifiedDate": "2020-09-18T15:01:56.691"
}
],
"pageable": {
"sort": {
"sorted": false,
"unsorted": true,
"empty": true
},
"offset": 0,
"pageNumber": 0,
"pageSize": 20,
"unpaged": false,
"paged": true
},
"totalElements": 2,
"last": true,
"totalPages": 1,
"size": 20,
"number": 0,
"sort": {
"sorted": false,
"unsorted": true,
"empty": true
},
"numberOfElements": 2,
"first": true,
"empty": false
}
Pageable 인터페이스는 많은 정보를 제공해준다. 이름만 봐도 각각의 객체가 무슨 역할을 하는지 명확하다. sort는 페이징 처리시 정렬에 대한 데이터이다.
아래는 실제 JPA가 작성한 SQL이다.
select
generatedAlias0
from
WorkGroup as generatedAlias0 */ select
workgroup0_.WORKGROUP_SEQ as workgrou1_2_,
workgroup0_.CREATED_DT as created_2_2_,
workgroup0_.LAST_MODIFIED_DT as last_mod3_2_,
workgroup0_.WORKGROUP_NM as workgrou4_2_
from
WORKGROUP_BASE workgroup0_ limit ?
페이징 정보를 포함하여 요청을 시도해보자 Pageable 객체 생성시 기본값은 다음과 같다.
- page: 요청할 페이지 번호
- size: 한 페이지 당 조회 할 갯수(default: 20)
- sort: 기본적으로 오름차순
/workgroup?size=2&page=1&sort=workGroupSeq,desc
page는 0부터 시작한다 1페이지로 요청
page당 표시할 데이터는(size) 2개
sort는 workGroupSeq기준으로 내림차순하였다.
{
"content": [
{
"workGroupSeq": 3,
"workGroupNm": "작업3",
"createdDate": "2020-09-18T15:29:09.242",
"lastModifiedDate": "2020-09-18T15:29:09.242"
},
{
"workGroupSeq": 2,
"workGroupNm": "작업2",
"createdDate": "2020-09-18T15:01:56.691",
"lastModifiedDate": "2020-09-18T15:01:56.691"
}
],
"pageable": {
"sort": {
"sorted": true,
"unsorted": false,
"empty": false
},
"offset": 2,
"pageNumber": 1,
"pageSize": 2,
"unpaged": false,
"paged": true
},
"totalElements": 5,
"last": false,
"totalPages": 3,
"size": 2,
"number": 1,
"sort": {
"sorted": true,
"unsorted": false,
"empty": false
},
"numberOfElements": 2,
"first": false,
"empty": false
}
결과는 정확하게 옵션을 처리하여 나왔다.
데이터는 총 5개(totalElements)였고, pageSize는 2개(총페이지 수) 였으니
1페이지: (5,4) 2페이지: (3, 2) 3페이지: (1) 순으로 데이터가 정렬되어 조회될것이다.
위와 같이 pageable로 아주 간편하게 페이징처리를 해보았다.
'Spring' 카테고리의 다른 글
Spring Security OAuth2 - Authorization endpoint (0) | 2020.10.07 |
---|---|
Spring Jpa - Query DSL + Gradle 6 설정 (3) | 2020.09.21 |
Spring Data Jpa Auditing (0) | 2020.07.29 |
ApplicationContext와 Singleton (0) | 2020.07.29 |
Spring Security + Rest (0) | 2020.02.19 |