개발/부트캠프

본캠프 : 페이징 조회 Pageable

EJ EJ 2025. 3. 3. 12:47

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