Springboot

🚀 RESTful API 페이징 및 정렬 (Spring Boot Pageable) 가이드

수아파파's 2025. 3. 10. 09:15
반응형

1️⃣ 서론 - 페이징 및 정렬이 필요한 이유
2️⃣ Spring Boot에서 Pageable 사용법
3️⃣ 페이징 API 구현 (Spring Data JPA)
4️⃣ 정렬 적용 및 동적 정렬 API 구현
5️⃣ 페이징과 정렬을 활용한 RESTful API 최적화


1️⃣ 서론 - 페이징 및 정렬이 필요한 이유

🔹 RESTful API에서 페이징이 필요한 이유

  • 대량의 데이터를 한 번에 반환하면 성능 문제가 발생
  • 사용자가 원하는 데이터만 효율적으로 제공할 수 있도록 제어 가능
  • 프론트엔드(React, Vue.js)에서 API 요청 시 서버 부담 감소

🔹 RESTful API에서 정렬이 필요한 이유

  • 최신 게시글, 인기 상품, 사용자 정렬 등 원하는 순서대로 데이터 제공 가능
  • DB의 ORDER BY 절을 활용하여 최적화된 쿼리 실행 가능
  • 사용자가 원하는 정렬 조건을 요청 시 동적으로 설정 가능

Spring Boot에서는 Pageable을 활용하여 페이징 및 정렬을 쉽게 적용 가능!


2️⃣ Spring Boot에서 Pageable 사용법

🔹 Pageable 인터페이스 소개

Spring Data JPA는 페이징과 정렬을 쉽게 적용할 수 있도록 Pageable 인터페이스 제공

📌 Pageable 주요 속성

  • page: 요청할 페이지 번호 (0부터 시작)
  • size: 한 페이지당 가져올 데이터 개수
  • sort: 정렬 기준 (ex. sort=createdAt,desc)

📌 요청 예시 (게시글 리스트 2페이지, 5개씩 정렬)

GET /api/posts?page=1&size=5&sort=createdAt,desc
  • page=1 → 2번째 페이지 (0부터 시작)
  • size=5 → 한 페이지에 5개씩
  • sort=createdAt,desc → 최신순 정렬

이제 Spring Boot에서 실제 페이징 API를 구현해보자!


3️⃣ 페이징 API 구현 (Spring Data JPA)

🔹 1. Entity 설계 (Post Entity)

📌 Post.java

package com.example.demo.model;

import jakarta.persistence.*;
import lombok.*;

import java.time.LocalDateTime;

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Post {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String title;
    private String content;
    private LocalDateTime createdAt = LocalDateTime.now();
}

🔹 2. Repository 설계 (PagingAndSortingRepository 사용)

📌 PostRepository.java

package com.example.demo.repository;

import com.example.demo.model.Post;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;

public interface PostRepository extends JpaRepository<Post, Long> {
    Page<Post> findAll(Pageable pageable);  // 페이징 지원
}

✅ Page<Post>를 반환하여 자동으로 페이징 처리 가능


🔹 3. Service 설계

📌 PostService.java

package com.example.demo.service;

import com.example.demo.model.Post;
import com.example.demo.repository.PostRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;

@Service
public class PostService {
    private final PostRepository postRepository;

    public PostService(PostRepository postRepository) {
        this.postRepository = postRepository;
    }

    public Page<Post> getPosts(Pageable pageable) {
        return postRepository.findAll(pageable);
    }
}

Page<Post>를 반환하여 자동 페이징 적용!


🔹 4. Controller 설계 (페이징 API 구현)

📌 PostController.java

package com.example.demo.controller;

import com.example.demo.model.Post;
import com.example.demo.service.PostService;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/api/posts")
public class PostController {
    private final PostService postService;

    public PostController(PostService postService) {
        this.postService = postService;
    }

    @GetMapping
    public Page<Post> getPosts(Pageable pageable) {
        return postService.getPosts(pageable);
    }
}

페이징 및 정렬이 적용된 RESTful API 완성!

📌 API 요청 예시

GET /api/posts?page=0&size=10&sort=createdAt,desc

4️⃣ 정렬 적용 및 동적 정렬 API 구현

🔹 1. 기본 정렬 (최신순, 오름차순, 내림차순 정렬)

📌 Controller에서 기본 정렬 적용

@GetMapping("/sorted")
public Page<Post> getSortedPosts(
    @RequestParam(defaultValue = "createdAt") String sortBy,
    @RequestParam(defaultValue = "desc") String order,
    Pageable pageable
) {
    Sort sort = order.equalsIgnoreCase("desc") ? Sort.by(sortBy).descending() : Sort.by(sortBy).ascending();
    pageable = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), sort);
    return postService.getPosts(pageable);
}

이제 사용자가 원하는 정렬 기준을 요청할 수 있음!

📌 요청 예시 (최신순 정렬)

GET /api/posts/sorted?sortBy=createdAt&order=desc

 

📌 요청 예시 (제목순 오름차순 정렬)

GET /api/posts/sorted?sortBy=title&order=asc

5️⃣ 페이징과 정렬을 활용한 RESTful API 최적화

🔹 페이징 API 성능 최적화

@Query를 활용하여 필요한 데이터만 SELECT
LIMIT을 활용하여 페이지 크기 제한 (size 값 검증)
데이터가 많아질 경우 INDEX 설정 고려


🎯 마무리: RESTful API 페이징 및 정렬 적용 완료!

🔥 Spring Boot에서 Pageable을 활용하여 RESTful API에 페이징 및 정렬 적용 완료!
페이징(Pageable)을 사용하면 API 성능 최적화 & 유연한 데이터 제공 가능
정렬(Sort)을 적용하여 다양한 기준으로 데이터 반환 가능
🚀 이제 실전 프로젝트에서 RESTful API를 활용해보자!

반응형