[SpringBoot]- 페이징/정렬처리하기(JpaRepository)(2)

ACAI BERRY DEVELOVER·2023년 6월 17일
0
post-thumbnail

1. 페이징처리

Spring Data JPA에서 페이지 처리는 반드시 '0'부터 시작한다는 점을 기억하자.

테스트 코드를 작성해본다.

 @Test
    public void testPageDefault(){
        //페이지처리는 0부터 시작된다.
        Pageable pageable = PageRequest.of(0, 10);
        Page<Memo> result = memoRepository.findAll(pageable);
        log.info(result);

    }

위 테스트 코드에선 1페이지에서 10개의 데이터를 가져오기 위해서 파라미터로 0,10을 전달하고 있다.

  • page T은 해당목록을 가지고오며, 실제 페이지 처리에 필요한 전체 데이터 수를 가져오는 쿼리도 처리한다.
  • 데이터가 충분하지 않다면 데이터 개수를 가져오는 쿼리를 실행하지 않는다.
	Hibernate: 
select
    m1_0.mno,
    m1_0.memo_text 
from
    tbl_memo m1_0 limit ?,
    ?
    
	Hibernate: 
select
    count(m1_0.mno) 
from
    tbl_memo m1_0
    
  • 테스트 결과를 보면 첫번째 쿼리에서는 MySQL에서 페이징 처리에 사용하는 limit 구문이 사용되는 것을 볼 수 있고, 두번째 쿼리에서는 count()를 이용해서 전체 개수를 처리하는 것을 볼 수 있다.
  • findAll()에 Pageable 타입의 파라미터를 전달하면 페이징 처리에 관련된 쿼리들을 실행하고, 이 결과들을 이용해서 리턴 타입으로 지정된 Page<엔티티타입> 객체로 저장한다.
  • page<엔티티타입>은 쿼리 결과를 사용하기 위한 여러 메서드를 지원한다.
 @Test
    public void testPageDefault2(){
        Pageable pageable = PageRequest.of(0, 10);
        Page<Memo> result = memoRepository.findAll(pageable);

//        log.info( " - - - - - - - - - - - - - - - - - - - - ");
//        log.info( " 총 페이지 개수 : " + result.getTotalPages());
//        log.info( " 전체 개수 : " + result.getTotalElements());
//        log.info( " 현재 페이지 번호 : " + result.getNumber());
//        log.info( " 페이지당 데이터 개수 : " + result.getSize());
//        log.info(" 다음 페이지 여부 : " +  result.hasNext());
//        log.info(" 시작 페이지 여부 : " + result.isFirst());

        for(Memo memo : result.getContent()){
            log.info(memo);

        }
    }
  • 실제 데이터를 처리하는 것은 getContent()를 이용해서 List<엔티티 타입>으로 처리하거나 Stream<엔티티 타입>을 반환하는 get()을 이용할 수 있다.

2. 정렬 조건 추가하기

  • PageRequest에는 정렬과 관련된 org.springframework.data.domain.Sort 타입을 파라미터로 전달할 수 있다.
  • Sort는 한 개 혹은 여러 개의 필드값을 이용해 순차적 정렬이나 역순 정렬이 지정가능하다.
 //정렬 조건 추가하기
    @Test
    public void testSort(){
        //역순정렬
        Sort sort1 = Sort.by("mno").descending();
        Sort sort2 = Sort.by("memoText").ascending();
        Sort sortAll = sort1.and(sort2);
        Pageable pageable = PageRequest.of(0, 10, sortAll);
        Page<Memo> result = memoRepository.findAll(pageable);
        result.get().forEach(memo -> {

            log.info(memo);
        });
    }
Hibernate: 
    select
        m1_0.mno,
        m1_0.memo_text 
    from
        tbl_memo m1_0 
    order by						//order by 절이 추가됨 
        m1_0.mno desc,
        m1_0.memo_text limit ?,
        ?
Hibernate: 
    select
        count(m1_0.mno) 
    from
        tbl_memo m1_0
  • 정렬조건은 Sort 객체의 and()를 이용해서 여러 개의 정렬 조건을 다르게 지정가능하다.
  • 위의 예시처럼 Memo 클래스의 memoText는 asc로 하고, mno는 desc로 지정가능하다.
  • 근데 결과는 왜 memo_text는 오름순으로 쿼리가 안나가지..?
profile
쓸때 대충 쓰지 말고! 공부하면서 써!

0개의 댓글