✅ 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를 활용해보자!
'Springboot' 카테고리의 다른 글
🚀 RESTful API CI/CD 및 배포 (AWS, Docker) 가이드 (1) | 2025.03.18 |
---|---|
🚀 Spring Boot 예외 처리 및 Global Exception Handling (0) | 2025.03.13 |
🚀 RESTful API 설계 가이드 (Spring Data JPA + Swagger) (0) | 2025.02.27 |
🚀 Spring Boot의 개발자들의 주요 관심사 (0) | 2025.02.19 |
🚀 스프링부트에서 사용자 권한(Role-Based Access Control, RBAC) 적용 방법 (0) | 2025.02.13 |