[Spring] Pageable을 이용한 Pagination 구현

Yujeong·2024년 3월 31일
0
post-thumbnail

아이템 목록을 효과적으로 관리하기 위해 페이지네이션(Pagination)을 사용한다. 이를 통해 한 번에 몇 개씩 아이템을 로드하여 사용자에게 제공한다. 페이지네이션은 페이지 크기를 설정하여 사용자가 아이템을 효과적으로 탐색할 수 있게 한다.

페이지네이션 관련 인터페이스와 클래스

1. Pageable Interface

  • 페이지 요청에 대한 다양한 기본 메서드를 정의한다.
    getPageNumber(), getPageSize(), getSort() 등
  • AbstractPageRequest, PageRequest, QPageRequest의 구현체를 가지고 있다.

2. AbstractPageRequest Class

  • Pageable과 Serializable 인터페이스의 추상 구현체이다.
  • 페이지 번호, 페이지 크기와 정렬 조건을 저장하고 관리한다.
  • 페이지 요청을 처리하는 데 필요한 공통적인 동작을 구현하고, 구체적인 페이지 요청 구현체에서 상속하여 사용된다.

3. PageRequest Class

  • AbstractPageRequest를 상속하는 구현체이다.
  • 페이지 요청을 생성하는 데 사용된다.
  • 페이지 번호, 페이지 크기와 정렬 조건을 설정하여 특정 페이지를 요청할 수 있다.
  • Spring Data JPA에서 사용되는 페이지 요청 클래스이다.

4. PageableHandlerMethodArgumentResolver

  • page 번호는 0부터 시작한다.
  • size 기본값은 20으로, 한 페이지당 20개를 반환한다.

페이지네이션 구현

Controller: GET 요청으로 페이지 번호를 받아서 Service에 요청한다.
DTO: 객체를 DTO로 변환하는 메서드를 제공하여 페이지네이션된 아이템 목록을 생성한다.
Service: 페이지 번호를 받아서 해당 페이지의 아이템 목록을 Repository에 요청하고 결과인 DTO 객체를 Controller로 반환한다. 1페이지에 아이템은 10개씩 보여준다.
Repository: 페이지네이션을 위해 데이터베이스에서 필요한 페이지의 아이템 목록을 조회하고 Service로 반환한다.

1. Repository

@Repository
public interface ItemRepository extends JpaRepository<Item, Long> {
    Page<Item> findAll(Pageable pageable);
}

2. DTO

@Getter
@Builder
@AllArgsConstructor
public class ItemResponseDTO {
    private Long itemId;
    private String name;
    private Integer price;
    private String itemImage;
    private String description;
    private Category category;

    public static Page<ItemResponseDTO> toDTOPage(Page<Item> items) {
        return items.map(item -> ItemResponseDTO.builder()
                .itemId(item.getItemId())
                .name(item.getName())
                .price(item.getPrice())
                .itemImage(item.getItemImage())
                .description(item.getDescription())
                .category(item.getCategory())
                .build());
    }
}

3. Service

@Service
@RequiredArgsConstructor
public class ItemService {
    private final ItemRepository itemRepository;
    public Page<Item> getList(int page) {
        Pageable pageable = PageRequest.of(page, 10, Sort.DEFAULT_DIRECTION, "itemId");
        return itemRepository.findAll(pageable);
    }
}

4. Controller

@RequiredArgsConstructor
@RestController
@RequestMapping("/items")
public class ItemController {
    private final ItemService itemService;
    @GetMapping
    public Page<ItemResponseDTO> listItems(@RequestParam(value = "page", defaultValue = "0") int page) {
        Page<Item> items = itemService.getList(page);
        return ItemResponseDTO.toDTOPage(items);
    }
}

참고
Interface Pageable
Class AbstractPageRequest
Class PageRequest
HandlerMethodArgumentResolvers for Pageable and Sort

profile
공부 기록

0개의 댓글