[Spring Boot] 쿼리 메서드와 Pageable의 결합

     

    📚코드로 배우는 스프링 부트 웹 프로젝트를 통해 공부한 내용들을 정리해보았습니다.


     

    74p - 78p 

    쿼리 메서드와 Pageable의 결합

     

    MemoRepository 인터페이스의 변경

    public interface MemoRepository extends JpaRepository<Memo, Long> {
        List<Memo> findByMnoBetweenOrderByMnoDesc(Long from, Long to);
        Page<Memo> findeByMnoBetween(Long from, Long to, Pageable pageable);
    }

     

    정렬 조건Pageable을 통해서 조절할 수 있습니다.

    Pageable 파라미터는 모든 쿼리 메소드에 적용 가능합니다.

    일반적인 경우 쿼리 메서드에 정렬 조건을 생략하고 만드는 경우가 많습니다.

     

     

    MemoRepositoryTests 클래스의 일부

        @Test
        public void testQueryMethodWithPagle(){
            Pageable pageable = PageRequest.of(0,10,Sort.by("Mno").descending());
            Page<Memo> result = memoRepository.findByMnoBetween(10L,50L,pageable);
            result.get().forEach(memo->System.out.println(memo));
    
        }

     

     

    실행결과

     

     

     

    deleteBy로 시작하는 삭제 처리

    쿼리 메소드를 이용해서 deleteBy로 메소드의 이름을 시작하면 특정 조건에 맞는 데이터를 삭제하는 것도 가능합니다.

     

        @Commit
        @Transactional
        @Test
        public void testDeleteQueryMethod(){
            memoRepository.deleteMemoByMnoLessThan(10L);
        }

     

    @Commit @Transactional 어노테이션을 사용하는 이유?

    deleteBy...인 경우 일단은 select문으로 해당 엔티티 객체들을 가져오는 작업과 각 엔티티를 삭제하는 작업이 같이 이루어지때문입니다. 만일, @Transcational이 없다면 에러가 발생합니다.

     

    @Commit최종 결과를 커밋하기 위해서 사용합니다. 이를 적용하지 않으면 테스트 코드의  deleteBy..는 기본적으로 롤백( Rollback) 처리 되어서 결과가 반영되지 않습니다. 

     

    deleteBy는 실제 개발에서는 많이 사용되지 않는데 그 이유는 SQL을 이용하듯 한 번에 삭제가 이루어지는 것이 아니라  다음과 같이 각 엔티티 객체를 하나씩 삭제하기 때문입니다.

     

     

    개발 시에는 @Query를 이용해서 위와 같은 비효율적인 부분을 개선합니다.

     

     

     

    @Query는 다음 포스팅으로 가져오겠습니다.

     

     

     

     

     

    728x90

    댓글