Spring/Spring 문법

Pageable 과 PagedModel

열심히 해 2024. 12. 9. 17:33

Pageable

: Spring Data JPA 에서 제공하는 인터페이스로 페이징 및 정렬 정보를 전달하는데 사용됩니다. Pageable 객체는 @RequestParam을 자동으로 매핑해줍니다.

 

 

주요 특징

  • 페이지 번호(page): 0부터 시작하는 현재 페이지 번호
  • 페이지 크기(size): 한 페이지에 포함될 항목의 수
  • 정렬 기준(sort): 특정 컬럼을 기준으로 오름차순 또는 내림차순으로 정렬

 

일반적으로 @PagaableDefault 또는 클라이언트에서 전달된 page, size, sort 파라미터를 통해 Pageable 객체가 생성됩니다.

 

@GetMapping("/trades")
public ResponseEntity<PagedModel<TradeResDto>> getTrades(
    @PageableDefault(size = 10, sort = "createdAt", direction = Sort.Direction.DESC) Pageable pageable
) {
    return new ResponseEntity<>(immediateTradeService.findTrades(pageable), HttpStatus.OK);
}

 

 

예를 들어 클라이언트가 ``GET /trades?page=1&size=10&sort=createdAt,desc`` 의 요청을 보낸다면

 

``page=1 : 두 번째 페이지,

size = 10 : 한 페이지에 10개,

sort = createdAt: DESC : 생성 시각 기준 내림 차순``

 

의 기준을 가지고 페이징처리된 데이터 조회를 요청하는 것입니다.

 

 


 

PagedModel

 

: PageModel은 Spring HATEOAS에서 제공하는 페이징 처리된 데이터를 포함하는 클래스입니다. 

 

@Transactional(readOnly = true)
public PagedModel<FindTradeResDto> findTrades(Pageable pageable) {
    Page<Trade> trades = tradeRepository.findAll(pageable);
    return new PagedModel<>(trades.map(FindTradeResDto::from));
}

 

 

 

위 예시에 대한 응답이 아래와 같을 수 있습니다.

// API 응답

{
  "content": [
    { "id": 1, "name1": "Trade1" },
    { "id": 2, "name2": "Trade2" },
    { "id": 3, "name3": "Trade3" },
    // ...
    { "id": 10, "name10": "Trade10" }
  ],
  "page": {
    "size": 10,
    "totalElements": 25,
    "totalPages": 3,
    "number": 1
  },
  "_links": {
    "self": { "href": "/trades?page=1&size=10" },
    "next": { "href": "/trades?page=2&size=10" },
    "prev": { "href": "/trades?page=0&size=10" }
  }
}

 

  • content : 페이징된 실제 데이터 목록
  • page : 페이지 메타데이터 - 페이지 크기, 총 항목 수, 전체 페이지, 현재 페이지 번호
  • _links : 링크 - 현재 페이지, 다음 페이지, 이전 페이지