1. Pageable 설정 전(기본 멤버 전체 조회)
-Controller
// 멤버 전체 조회
@GetMapping("/members")
public ResponseEntity<List<MemberFindResponseDto>> findAll() {
return ResponseEntity.ok(memberService.findAll());
}
-Service
// 멤버 전체 조회
@Transactional(readOnly = true)
public List<MemberFindResponseDto> findAll() {
List<Member> members = memberRepository.findAll();
List<MemberFindResponseDto> dtos = new ArrayList<>();
for (Member member : members) {
dtos.add(new MemberFindResponseDto(member.getName(), member.getEmail()));
}
return dtos;
}
2. Pageable 설정 후
-Controller
컨트롤러에서 page와 size 파라미터를 받아 페이징을 적용합니다.
클라이언트에서 1부터 전달된 페이지 번호를 0 기반으로 조정합니다.
// 멤버 전체 조회(페이징)
@GetMapping("/members")
public ResponseEntity<Page<MemberFindResponseDto>> findAll(
@RequestParam(defaultValue = "1") int page,
@RequestParam(defaultValue = "10") int size
) {
int adjustedPage = Math.max(0, page - 1);
Pageable pageable = PageRequest.of(adjustedPage, size, Sort.by("updatedAt").descending());
return ResponseEntity.ok(memberService.findAll(pageable));
}
*Math.max(a, b)는 두 숫자 중 더 큰 값을 반환하는 Java의 내장 메서드로, page - 1 값이 음수가 되지 않도록 Math.max(0, page - 1)를 사용합니다.
*수정일(updatedAt)을 기준으로 내림차순 정렬합니다. -> 최신순으로 정렬합니다.
-Service
pageable을 사용하여 Page<Member>를 조회하고, 이를 DTO로 변환합니다.
// 멤버 전체 조회(페이징)
@Transactional(readOnly = true)
public Page<MemberFindResponseDto> findAll(Pageable pageable) {
Page<Member> members = memberRepository.findAll(pageable);
return members.map(member -> new MemberFindResponseDto(member.getName(), member.getEmail()));
}
-Repository(변경 없음) : Spring Data JPA의 JpaRepository는 기본적으로 findAll(Pageable pageable) 메서드를 제공합니다.
[ 확인 ]

| 키 | 의미 |
| pageNumber | 현재 페이지 번호 (0부터 시작) |
| pageSize | 한 페이지당 데이터 개수 (요청한 크기) |
| sort | 정렬 정보를 포함 |
| empty | 정렬 조건이 없는 경우 true (현재는 false) |
| sorted | 정렬이 적용된 경우 true (현재는 true) |
| unsorted | 정렬이 적용되지 않은 경우 true (현재는 false) |
| offset | 데이터베이스에서 조회 시작 위치 (pageNumber * pageSize) |
| paged | 페이징이 적용되었는지 여부 (true면 페이징 적용) |
| unpaged | 페이징이 적용되지 않았는지 여부 (false면 페이징 적용됨) |
| totalPages | 전체 페이지 개수 |
| totalElements | 전체 데이터 개수 |
| last | 마지막 페이지 여부 |
| size | 페이지 크기 (pageSize와 동일) |
| number | 현재 페이지 번호 (pageNumber와 동일) |
| numberOfElements | 현재 페이지의 데이터 개수 |
| first | 첫 번째 페이지 여부 |
| empty | 현재 페이지가 비어 있는지 여부 |
✅ 현재 페이지(0번)에는 10개의 데이터가 있고, 총 2페이지 존재
✅ 정렬이 적용되었고, 페이징이 정상적으로 작동 중
'개발 > 부트캠프' 카테고리의 다른 글
| 본캠프 : GlobalExceptionHandler 사용 (0) | 2025.03.05 |
|---|---|
| 본캠프 : Git rebase (0) | 2025.03.04 |
| 본캠프 : BaseEntity 사용 (0) | 2025.03.02 |
| 본캠프 : 심화 개인 과제_N+1 문제 (0) | 2025.02.27 |
| 본캠프 : 테스트 코드 (0) | 2025.02.26 |