페이징과 정렬
검색 조건
age = 10
정렬 조건
이름으로 내림차순
페이징 조건
첫 번째 페이지
페이지 당 보여줄 데이터는 3건
순수 JPA
@Repository
public class MemberJpaRepository {
public List<Member> findByPage(int age, int offset, int limit) {
return em.createQuery("select m from Member m where m.age = :age order by m.username desc")
.setParameter("age", age)
// 어디서 부터 가져올 것인지
.setFirstResult(offset)
// 몇 개를 가져올 것인지
.setMaxResults(limit)
.getResultList();
}
public long totalCount(int age) {
// 단순 count니까 sort 조건은 빠진다.
return em.createQuery("select count(m) from Member m where m.age = :age", Long.class)
.setParameter("age", age)
.getSingleResult();
}
}@SpringBootTest
@Transactional
@Rollback(value = false)
class MemberJpaRepositoryTest {
@Autowired
MemberJpaRepository memberJpaRepository;
@Test
void paging() {
memberJpaRepository.save(new Member("member1", 10));
memberJpaRepository.save(new Member("member2", 10));
memberJpaRepository.save(new Member("member3", 10));
memberJpaRepository.save(new Member("member4", 10));
memberJpaRepository.save(new Member("member5", 10));
int age = 10;
int offset = 0;
int limit = 3;
List<Member> members = memberJpaRepository.findByPage(age, offset, limit);
long totalCount = memberJpaRepository.totalCount(age);
assertThat(members.size()).isEqualTo(3);
assertThat(totalCount).isEqualTo(5);
}
}DB가 달라져도 JPA가 그 DB에 맞는 방언으로 쿼리를 날린다.
스프링 데이터 JPA
파라미터
org.springframework.data.domain.Sort
정렬
org.springframework.data.domain.Pageable
페이징
내부에 sort가 포함되어 있다.
반환 타입
org.springframework.data.domain.Page
페이징과 total count 쿼리가 같이 나간다.
org.springframework.data.domain.Slice
total count 없이 해당 페이지만 가져온다.
내부적으로 limit + 1만큼 조회한다.
List
total count 쿼리 없이 결과만 반환한다.
예제
Page
count를 구하는 별도의 메서드 없이 자동으로 날린다.
PageRequest
Pageable 인터페이스를 구현한 객체
Slice
count를 가져오지 않는다.
컨텐츠만 limit + 1만큼 가져온다.
더보기 방식으로 개발할 때 사용한다.
List
Count 최적화
count 쿼리는 매번 총 개수를 세야 해서 부하가 생긴다.
join으로 가져오는 데이터라면 count 쿼리에 불필요한 join이 나간다.
countQuery를 사용하면 count 쿼리가 심플하게 나간다.
페이지를 유지하면서 엔티티를 DTO로 변환
map
엔티티 그대로 컨트롤러에서 넘기면 안되므로 DTO로 변환한다.
Last updated
Was this helpful?