티스토리 뷰
JPA 페이징 처리
JPA는 페이징 처리를 위한 메서드를 제공한다. 이 메서드를 통해 페이지를 위한 쿼리를 자동으로 만들어준다. 아래 예제는 JPQL으로 구현하였다.
페이징 쿼리 메서드
- setFirstResult(int startPosition): 조회 시작 위치(0부터 시작)
- setMaxResults(int maxResult): 조회할 데이터 수
예제
PagingMember.java
@Entity
public class PagingMember {
@Id
@GeneratedValue
private Long id;
private int age;
// getter, setter 생략
}
PagingMain.java
// 엔티티 매니저 생략
System.out.println("회원 저장");
for(int i=1; i<=100; i++) {
PagingMember pagingMember = new PagingMember();
pagingMember.setAge(i);
em.persist(pagingMember);
}
// 1O개씩 보여주는 기준으로 1페이지는 0
List<PagingMember> result1 = em.createQuery("select m from PagingMember m order by m.age desc", PagingMember.class)
.setFirstResult(0)
.setMaxResults(10)
.getResultList();
// 1O개씩 보여주는 기준으로 2페이지는 10
List<PagingMember> result2 = em.createQuery("select m from PagingMember m order by m.age desc", PagingMember.class)
.setFirstResult(10)
.setMaxResults(10)
.getResultList();
System.out.println("1페이지 실행 결과");
for (PagingMember pagingMember : result1) {
System.out.println("result.id= "+pagingMember.getId()+" // result.age= "+pagingMember.getAge());
}
System.out.println("2페이지 실행 결과");
for (PagingMember pagingMember : result2) {
System.out.println("result.id= "+pagingMember.getId()+" // result.age= "+pagingMember.getAge());
}
위의 코드에서 회원 100명을 저장하였다. JPQL 쿼리를 보면 나이가 많은 순서로 정렬하였다.
실행 결과
// INSERT 부분은 생략
Hibernate:
/* select
m
from
PagingMember m
order by
m.age desc */ select
pm1_0.id,
pm1_0.age
from
PagingMember pm1_0
order by
pm1_0.age desc
offset
? rows
fetch
first ? rows only
1페이지 실행 결과
result.id= 100 // result.age= 100
result.id= 99 // result.age= 99
result.id= 98 // result.age= 98
result.id= 97 // result.age= 97
result.id= 96 // result.age= 96
result.id= 95 // result.age= 95
result.id= 94 // result.age= 94
result.id= 93 // result.age= 93
result.id= 92 // result.age= 92
result.id= 91 // result.age= 91
2페이지 실행 결과
result.id= 90 // result.age= 90
result.id= 89 // result.age= 89
result.id= 88 // result.age= 88
result.id= 87 // result.age= 87
result.id= 86 // result.age= 86
result.id= 85 // result.age= 85
result.id= 84 // result.age= 84
result.id= 83 // result.age= 83
result.id= 82 // result.age= 82
result.id= 81 // result.age= 81
실행 결과를 보면 1페이지, 2페이지 정상적으로 추출하였다. setFirstResult 메서드를 통해 페이지(1,2,3...) 별로 정상적으로 불러올 수 있으며 데이터를 10개씩 보여주는 기준으로 1페이지는 파라미터가 0, 2페이지는 파라미터가 10, 3페이지는 파라미터가 20을 넣어주면 된다.
설정된 DB방언을 바꾸면?
앞서 페이지 쿼리는 H2 데이터베이스로 설정한 방언으로 쿼리가 추출되었다. 그렇다면 DB에 따라 페이지 쿼리가 다른데 어떻게 해야 할까? 답은 아래와 같이 설정된 방언을 변경하면 된다.
// ※MYSQL은 MySQLDialect로 변경
// maven 환경
<property name="hibernate.dialect" value="org.hibernate.dialect.OracleDialect"/>
// gradle 환경
// properties 설정
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.OracleDialect
// yml 설정
spring:
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.OracleDialect
DB환경에 따라 위와 같이 변경하면 그에 맞는 쿼리가 생성될 것이다.
정리
JPA는 설정된 DB 방언에 따라 페이징 쿼리를 자동으로 생성해주며, 개발자는 setFirstResult, setFirstResult 메서드의 파라미터만 정확히 전달해주면 그에 맞는 페이징 쿼리를 생성해 준다.
본 포스팅은 “실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발 편/인프런”를 학습한 내용을 정리한 것
'Java > JPA' 카테고리의 다른 글
| <JPA> @Enumerated 사용 시 주의할 점 (0) | 2024.10.31 |
|---|---|
| <JPA> 벌크 연산시 주의할 점 (2) | 2024.10.03 |
| <JPA> 준영속 엔티티를 수정하는 2가지 방법 (0) | 2024.09.30 |
| <JPA> 임베디드 타입이란? (0) | 2024.09.24 |
| <JPA> 즉시 로딩과 지연 로딩이란? (0) | 2024.09.23 |
댓글
