애정코딩 💻

WEB/JPA 2021.02.03 댓글 0 Joana

JAP Pageable 사용하기

Page까지 왔다는건... 기본적인 CRUD를 알고 계신 상태로 이해하고 작성하겠습니다!

 

할일 : 간단한 리스트 데이터에 Page, Sort 구현하여 API를 구현한다.

 

Service

Entity자체를 반환하는건 절때로 하지 않기 때문에 Response dto를 만들어서 반환하기로 합니다.

Repository에서 받아온 Page UserEntity를 Response에 맵핑해줘야 하기 때문에 반환할때 생성자에 stream을 사용하여 

각각 맵핑 해줍니다! 여기서 finAny().orElse("") 는 user의 이미지가 필수는 아니기 때문에 NPE이 발생할 수 있기 때문에 null일 경우 String 타입의 null을 반환하게 했습니다. 이부분은 좀더 찾아서 업데이트 하도록 하겠습니다!

 

public Page<UserInfoResponse> findAllAuction(Pageable pageable) {
    Page<UserEntity> userEntityPage = userRepository.findAll(pageable);
    return userEntityPage.map(
        user ->
            new UserInfoResponse(
                user.getName(),
                user.getAge(),
                auction.getProfileList().getProfileEntityList().stream()
                    .map(e -> e.getImagePath())
                    .findAny()
                    .orElse("null")));
  }

Controller

Pageble을 파라미터로 받는데 Client Test 에서 처럼 QueryParams에 옵션을 주는 방식으로 파라미터를 전달할 수 있습니다.

  @GetMapping("/user/list")
  public Page<UserInfoResponse> findAllUser(Pageable pageable){
    return userFindService.findAllUser(pageable);
  }

 

Client Test

Postman /GET/ http://localhost:8080/user/list?page=0&size=5&sort=name,DESC

 

 

반환 하는 Json

pageble을 보시면 clinet에게 totalPages가 몇개가 있는지 보여줄 수 있고 sort가 되어있는지 확인도 가능하다. 

이런식으로 구현하면 client에서도 좀더 원활하게 개발할 수 있을거 같네요!

{
    "content": [
        {
            "name": "aejeong",
      		"age": "10",
            "imagePath": "null"
        },
        {
            "name": "jisu",
      		"age": "13",
            "imagePath": "imagePath"
        }
    ],
    "pageable": {
        "sort": {
            "sorted": true,
            "unsorted": false,
            "empty": false
        },
        "offset": 0,
        "pageNumber": 0,
        "pageSize": 5,
        "paged": true,
        "unpaged": false
    },
    "last": true,
    "totalPages": 1,
    "totalElements": 2,
    "size": 5,
    "sort": {
        "sorted": true,
        "unsorted": false,
        "empty": false
    },
    "number": 0,
    "first": true,
    "numberOfElements": 2,
    "empty": false
}
반응형