Spring

Spring Jpa - Paging api 처리하기

일태우 2020. 9. 18. 15:37

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