goal
Spring Data JPA를 이용한 페이징 처리를 이해한다.
페이징처리와 정렬 -> "findAll()를 사용한다."
findAll() 메소드는 <u>JpaRepository 인터페이스의 상위인 PagingAndSortRepository의 메소드로, 파라미터로 전달되는 Pageable이라는 타입의 객체에 의해서 실행되는 쿼리를 결정하게된다.
이 글을 읽고 잘 이해가 되지 않아 곱씹고 곱씹고 또 곱씹어보았다. 지금 이해하고 있는 상단부의 개념은, 아래와 같다.
- Pageable Type으로 객체를 생성할 때 어떤 조건하(어느 페이지부터, 페이지당 몇 개의 개수로, 어떤 정렬을 통해 방법을 정해주는 로직, 즉 페이지 처리에 필요한 정보를 전달)에 출력해줄 것인지 결정한다
- 이후, Page 인터페이스 타입을 사용하여 사용자 지정 Entity를(generic에 들어가는 부분) 결정하고
- JpaRepository 인터페이스를 상속받은 인터페이스를 사용자 조건하에(어떠한 데이터들을 뽑아 낼 것인지에 대한 로직) 어떻게 출력할 것인지 결정한다.
페이징과 관련한 필요 소스코드는 아래와 같다.
- Memo.java
package org.zerock.ex2.entity;
import lombok.*;
// 프로젝트 생성시 Dependencies Spring Data JPA
import javax.persistence.*;
// ORM을 통한 데이터베이스 생성
@Entity
@Table(name = "tbl_memo")
@Data // @Getter, @Setter, @ToString, @NoArgsConstructor, @AllArgsConstructor
@Builder // 객체를 생성할 수 있도록 돕는 annotation
@AllArgsConstructor
@NoArgsConstructor
public class Memo {
@Id // mno를 pk로 설정
@GeneratedValue(strategy = GenerationType.IDENTITY) // 일정 순서에 따라서 값이 증가하도록 설정
private long mno;
@Column(name = "memoText", length = 200, nullable = false )
private String memoText;
}
- MemoRepository.java
package org.zerock.ex2.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.zerock.ex2.entity.Memo;
// 여기서는 상속의 JpaRepository를 이해해야함
public interface MemoRepository extends JpaRepository<Memo, Long> {
}
- MemberRepositoryTests.java (메인코드)
package org.zerock.ex2.repository;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.zerock.ex2.entity.Memo;
import org.springframework.data.domain.Pageable;
@SpringBootTest
public class MemberRepositoryTests {
@Autowired
MemoRepository memoRepository;
@Test
public void testPageDefault(){
Pageable pageable = PageRequest.of(0,10);
Page<Memo> result = memoRepository.findAll(pageable);
System.out.println(result);
}
}
메인소스를 제외한 MemoRepository.java와 Memo.java 소스코드에 대한 설명
MemoRepository.java의 경우, JpaRepository 인터페이스를 상속 받은 인터페이스이다.
- JpaRepository 인터페이스의 개념을 잘 모르는 경우거나 까먹은 경우라면 공부하고 오자.
Memo.java의 경우, Spring data JPA의 대표 프레임워크인 Hibernate를 이용해 데이터베이스 테이블과 해당 클래스의 객체가 매핑하기 위해 만든 소스코드이다.
- Spring data JPA의 개념을 잘 모르는 경우 공부하고 오자.
MemberRepositoryTests.java 소스코드 설명
- Pageable pageable = PageRequest.of(0,10);
- Pagable Type을 이용해 첫 번째 페이지(parameter: 0에 해당)부터 페이지당 10개의 데이터(parameter: 10에 해당)를 뽑아 내기위해 방법 정의
※ Pageable의 객체생성을 PageRequest.of로 하는 이유
- Pageable은 인터페이스이므로 구현체를 통해 객체 생성을 해야하는데 Pageable의 객체 생성을 돕는 친구가 PageRequest 클래스이다. 근데, PageRequest의 생성자는 특이하게 protected로 되어있기 때문에 of()메소드를 이용해 생성자를 초기화해준다.
- Page result = memoRepository.findAll(pageable);
- 페이징 처리와 정렬은 findAll() 메소드를 사용하며, findAll()은 JpaRepository 인터페이스의 상위인 PagingAndSortRepository의 메소드이다. 파라미터로 전달되는 Pageable의 타입 객체에 의해서 실행되는 쿼리를 결정하게 된다.
포스팅하면서 설명이 많이 부족함을 느낍니다.
읽어보시는 분이 계신다면 참고할만한 레퍼런스가 있을지 댓글 주시면 너무 감사하겠습니다.
'Spring > Spring' 카테고리의 다른 글
Spring + SIA 그룹스터디(3장) :) mybatis3 기본 CRUD를 이해한다. (0) | 2022.05.22 |
---|---|
Spring :) Java만을 이용한 JDBC (데이터베이스 연결) (0) | 2022.04.26 |
Spring + jpa 실습 :) Entity 생성 + JpaRepository 생성(및 개념) + CRUD 사용법 이해하기 (0) | 2022.04.05 |
Spring :) RestController, RequestMapping, GetMapping, RequestParam (0) | 2022.03.11 |
Spring :) 20220311 Spring 공부 시작 (0) | 2022.03.11 |