SPRING

[Spring Boot + JPA] LV.8

도원좀비 2025. 3. 28. 15:37

1️⃣ 요구사항 정리

데이터베이스

  • offset / limit : SELECT 쿼리에 적용해서 데이터를 제한 범위에 맞게 조회할 수 있습니다.

페이징

  • Pageable : Spring Data JPA에서 제공되는 페이징 관련 인터페이스 입니다.
  • PageRequest : Spring Data JPA에서 제공되는 페이지 요청 관련 클래스입니다.
  • 일정을 Spring Data JPA의 Pageable과 Page 인터페이스를 활용하여 페이지네이션을 구현
  • 페이지 번호와 페이지 크기를 쿼리 파라미터로 전달하여 요청하는 항목을 나타냅니다.
  • 할일 제목, 할일 내용, 댓글 개수, 일정 작성일, 일정 수정일, 일정 작성 유저명 필드를 조회합니다.
  • 디폴트 페이지 크기는 10으로 적용합니다.
  • 일정의 수정일을 기준으로 내림차순 정렬합니다

 

2️⃣ 주요 코드(페이징)

더보기

(ScheduleController.java)

   @RestController
@RequiredArgsConstructor
@RequestMapping("/schedules")
public class ScheduleController {

    private final ScheduleService scheduleService;

   
   @GetMapping("/paged")
    public ResponseEntity<Page<SchedulePageResponseDto>> findAllSchedulePaged(
            @RequestParam(defaultValue = "0") int page,
            @RequestParam(defaultValue = "10") int size
    ) {
        Page<SchedulePageResponseDto> allSchedulePaged = scheduleService.findAllSchedulePaged(page, size);
        return new ResponseEntity<>(allSchedulePaged, HttpStatus.OK);
    }
}

(ScheduleService.java)

@Service
@RequiredArgsConstructor
public class ScheduleServiceImpl implements ScheduleService {
   
   @Override
    public Page<SchedulePageResponseDto> findAllSchedulePaged(int page, int size) {
        Pageable pageable = PageRequest.of(page, size, Sort.by(Sort.Direction.DESC, "updatedDate"));

        return scheduleRepository.findPagedSchedules(pageable);
    }
 }

(ScheduleRepository.java)

public interface ScheduleRepository extends JpaRepository<Schedule, Long> {

    default Schedule findByIdOrElseThrow(Long scheduleId) {
        return findById(scheduleId).orElseThrow(() -> new CustomException(ExceptionCode.SCHEDULE_NOT_FOUND));
    }


    @Query("""
    SELECT new com.example.schedulerjpa.dto.response.SchedulePageResponseDto(
        s.title,
        s.contents,
        a.name,
        COUNT(c),
        s.createdDate,
        s.updatedDate
    )
    FROM Schedule s
    JOIN s.author a
    LEFT JOIN Comment c ON c.schedule = s
    GROUP BY s
""")
    Page<SchedulePageResponseDto> findPagedSchedules(Pageable pageable);
}

📌 GitHub 저장소: https://github.com/sukh115/schedulerJpa/lv8

 

'SPRING' 카테고리의 다른 글

[SPRING] 동적 쿼리  (1) 2025.03.30
[SPRING BOOT + JPA] 일정 관리 앱 회고  (2) 2025.03.28
[Spring Boot + JPA] LV.7  (1) 2025.03.28
[Spring Boot + JPA] LV.5+ Lv.6  (1) 2025.03.28
[Spring Boot + JPA] LV.3 + LV.4  (1) 2025.03.28