diff --git a/spring-data-jpa/src/main/java/com/example/springdatajpa/repository/MemberRepository.java b/spring-data-jpa/src/main/java/com/example/springdatajpa/repository/MemberRepository.java index e58f3c18..bcc861b9 100644 --- a/spring-data-jpa/src/main/java/com/example/springdatajpa/repository/MemberRepository.java +++ b/spring-data-jpa/src/main/java/com/example/springdatajpa/repository/MemberRepository.java @@ -2,6 +2,9 @@ package com.example.springdatajpa.repository; import com.example.springdatajpa.dto.MemberDto; import com.example.springdatajpa.entity.Member; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; @@ -32,4 +35,10 @@ public interface MemberRepository extends JpaRepository { List findListByUsername(String username); // 컬렉션 Member findMemberByUsername(String username); // 단건 Optional findOptionalByUsername(String username); // Optional + + @Query(value = "select m from Member m left join m.team t", + countQuery = "select count(m) from Member m") + Page findPageByAge(int age, Pageable pageable); + + Slice findSliceByAge(int age, Pageable pageable); } diff --git a/spring-data-jpa/src/test/java/com/example/springdatajpa/repository/MemberRepositoryTest.java b/spring-data-jpa/src/test/java/com/example/springdatajpa/repository/MemberRepositoryTest.java index 401ae429..3cc8afe1 100644 --- a/spring-data-jpa/src/test/java/com/example/springdatajpa/repository/MemberRepositoryTest.java +++ b/spring-data-jpa/src/test/java/com/example/springdatajpa/repository/MemberRepositoryTest.java @@ -7,6 +7,10 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.dao.IncorrectResultSizeDataAccessException; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Slice; +import org.springframework.data.domain.Sort; import org.springframework.test.annotation.Rollback; import org.springframework.transaction.annotation.Transactional; @@ -178,5 +182,39 @@ public class MemberRepositoryTest { assertThrows(IncorrectResultSizeDataAccessException.class, () -> memberRepository.findOptionalByUsername("ddd")); // 반환 타입은 단건 인데 여러 건이 조회 되었을 경우 예외 발생 } + + @Test + void paging() { + // 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)); + + int age = 10; + PageRequest pageRequest = PageRequest.of(0, 3, Sort.by(Sort.Direction.DESC, "username")); + // when + Page page = memberRepository.findPageByAge(age, pageRequest); + Page toMap = page.map(member -> new MemberDto(member.getId(), member.getUsername(), null)); + + // then + List members = page.getContent(); + + assertEquals(3, members.size()); + assertEquals(5, page.getTotalElements()); + assertEquals(0, page.getNumber()); + assertEquals(2, page.getTotalPages()); + assertTrue(page.isFirst()); + assertTrue(page.hasNext()); + + Slice slice = memberRepository.findSliceByAge(age, pageRequest); + List content = page.getContent(); + + assertEquals(3, content.size()); + assertEquals(0, slice.getNumber()); + assertTrue(slice.isFirst()); + assertTrue(slice.hasNext()); + } }