jujuwon
시크릿주주
jujuwon
전체 방문자
오늘
어제
  • 분류 전체보기 (106)
    • 🔠 프로그래밍언어 (35)
      • ☕️ Java (19)
      • 🐠 Python (15)
      • 🍠 Kotlin (1)
    • 🔙 Backend (16)
      • 🌿 Springboot (12)
      • 🐳 Docker (1)
      • ☁️ AWS (3)
    • 💼 CS (12)
      • 📶 Network (12)
    • 🕹 알고리즘 (14)
      • 📑 스터디 (2)
      • 💁🏻‍♂️ 백준 (9)
      • 👨🏼‍🔬 프로그래머스 (3)
    • 📚 Book (8)
      • 🔎 오브젝트 (4)
      • 🧪 TDD (2)
      • 📜 논문 (2)
    • 🔐 보안 (7)
      • 👾 Pwnable (7)
    • 📝 회고 (4)
    • 🧩 etc. (10)
      • ⚠️ issue (2)
      • 💡 꿀팁 (7)
      • ✏️ 끄적 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 글

hELLO · Designed By 정상우.
jujuwon
🔙 Backend/🌿 Springboot

JPA :: 페이징과 정렬

JPA :: 페이징과 정렬
🔙 Backend/🌿 Springboot

JPA :: 페이징과 정렬

2022. 8. 16. 13:50
반응형
  • 기존 JPA 페이징과 정렬
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) {
  return em.createQuery("select count(m) from Member m where m.age = :age", Long.class)
    .setParameter("age", age)
    .getSingleResult();
}

 

Spring Data JPA 페이징과 정렬


페이징과 정렬 파라미터

  • org.springframework.data.domain.Sort : 정렬 기능
  • org.springframework.data.domain.Pageable : 페이징 기능 (내부에 Sort 포함)

특별한 반환타입

  • org.springframework.data.domain.Page : 추가 count 쿼리 결과를 포함하는 페이징
  • org.springframework.data.domain.Slice : 추가 count 쿼리 없이 다음 페이지만 확인 가능
  • (내부적으로 limit + 1조회)
  • List (자바 컬렉션): 추가 count 쿼리 없이 결과만 반환

페이징 정렬 예제

  • 검색 조건 : 나이가 10살
  • 정렬 조건 : 이름으로 내림차순
  • 페이징 조건 : 첫 번째 페이지, 페이지당 보여줄 데이터는 3건
public interface MemberRepository extends Repository<Member, Long> {
   Page<Member> findByAge(int age, Pageable pageable);
}
// Pageble 은 인터페이스 !
// 구현체로 PageRequest 객체 사용.

//페이징 조건과 정렬 조건 설정
@Test
public void page() throws Exception {
    //given
  memberRepository.save(new Member("member1", 10));
  memberRepository.save(new Member("member2", 10));
  memberRepository.save(new Member("member3", 10));
  memberRepository.save(new Member("member4", 10));
  memberRepository.save(new Member("member5", 10));
    //when
  PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC, "username"));
  Page<Member> page = memberRepository.findByAge(10, pageRequest);
    //then
    List<Member> content = page.getContent(); //조회된 데이터
    assertThat(content.size()).isEqualTo(3); //조회된 데이터 수
    assertThat(page.getTotalElements()).isEqualTo(5); //전체 데이터 수
    assertThat(page.getNumber()).isEqualTo(0); //페이지 번호
    assertThat(page.getTotalPages()).isEqualTo(2); //전체 페이지 번호
    assertThat(page.isFirst()).isTrue(); //첫번째 항목인가?
    assertThat(page.hasNext()).isTrue(); //다음 페이지가 있는가?
}

Slice 의 경우 모바일과 같은 View 에서 + 더보기 를 해서 가져올 때 많이 사용한다.

 

Page 를 사용할 때 성능의 이슈

  • Total Count 를 가져오는 부분에서 많이 발생 !
  • 아래 예시에서 content 를 가져올 때와 count 를 할 때 모두 join 을 하기 때문에 성능이 안 나온다.
@Query(value = "select m from Member m left join m.team")
Page<Member> findByAge(int age, Pageable pageable);

 

 

⬇️ 카운트 쿼리

 

 

countQuery 사용

@Query(
    value = "select m from Member m left join m.team",
    countQuery = "select count(m.username) from Member m")
Page<Member> findByAge(int age, Pageable pageable);

 

기능이 복잡해지거나 성능이 안 나올 때는 countQuery 를 분리해서 사용하자.

 

728x90
반응형
저작자표시 (새창열림)
  •  
  • Spring Data JPA 페이징과 정렬
  • 페이징과 정렬 파라미터
  • 특별한 반환타입
  • 페이징 정렬 예제
  •  
  • Page 를 사용할 때 성능의 이슈
  • countQuery 사용
'🔙 Backend/🌿 Springboot' 카테고리의 다른 글
  • JUnit :: ParameterizedTest 로 경계값 테스트하기
  • JPA :: 벌크성 수정 쿼리
  • JPA :: Query Method 기능
  • Spring Boot :: Spring Data 패키지 구조
jujuwon
jujuwon

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.