48DAYS) [Spring MVC] JDBC 기반 데이터 액세스 계층 - Spring Data JDBC를 이용한 데이터 액세스 실습

nacSeo (낙서)·2022년 12월 26일
0

◉ 학습목표

1. Spring Data JDBC 기반 데이터 액세스 계층에서 페이지네이션(Pagination) 기능을 적용할 수 있다.
  1. 페이지네이션 (Pagination) 정의

⦿ 학습내용

☞ 페이지네이션 (Pagination)

✔︎ 데이터 베이스에 있는 모든 데이터를 요청하는 것이 아니라, 한 페이지에 일정한 개수만큼 나누어 요청하는 것

◉ 느낀 점

☞ Spring Data JDBC 기반 데이터 액세스 계층 실습 내용으로 페이지네이션 기능을 적용하는 것이었다. Spring에서 지원하는 페이지네이션 API를 이용해 구현해내는 것이 키 포인트 🌟

  • Controller 클래스
@GetMapping
public ResponseEntity getMembers(@Positive @RequestParam int page,
                                     @Positive @RequestParam int size) {
        Page<Member> pageMembers = memberService.findMembers(page-1, size);
        List<Member> members = pageMembers.getContent();
        List<MemberResponseDto> data = mapper.membersToMemberResponseDtos(members);

        return new ResponseEntity<>(
                new PageResponseDto<>(data, pageMembers), HttpStatus.OK);
    }
- 클라이언트 측으로부터 page정보와 size정보를 받음
- 부가 정보이므로 @RequestParam 애너테이션을 이용해 쿼리 파라미터로 받음
- Spring에서는 page번호가 0부터 시작, 반면 클라이언트 측에서는 편리성을 위해 1부터 사용하도록 함
- 따라서 Controller 측은 page-1를 사용
  • Repository 인터페이스
public interface MemberRepository extends PagingAndSortingRepository<Member, Long> {
    Optional<Member> findByEmail(String email);
}
- 페이지네이션 기능을 제공하는 PagingAndSortingRepository의 findAll(Pageable) 이용
  • Service 클래스
public Page<Member> findMembers(int page, int size) {
        return memberRepository.findAll(PageRequest.of(page, size, Sort.by("memberId").descending()));
    }
- 페이지네이션 된 정보 리턴
- Pageable 인터페이스의 구현 클래스인 PageRequest를 이용
- Sort를 이용해 memberId를 내림차순으로 정렬 (최신순)
  • PageInfo 클래스
@AllArgsConstructor
@Getter
public class PageInfo {
    private int page;
    private int size;
    private long totalElements;
    private int totalPages;
}
- 페이지 정보 제공
  • PageResponseDto 클래스
@Getter
public class PageResponseDto<T> {
    private List<T> data;
    private PageInfo pageInfo;

    public PageResponseDto(List<T> data, Page page) {
        this.data = data;
        this.pageInfo = new PageInfo(page.getNumber()+1, page.getSize(),
                page.getTotalElements(), page.getTotalPages());
    }
}
- 별도의 Response용 DTO 클래스

◉ 내일의 키워드

・ JPA (Java Persistence API)
・ 엔티티 매핑
profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글