스프링

[Spring] 쿼리 메서드(Query Methods)에 대해 알아보자

zumsim 2023. 1. 9. 22:05
728x90
반응형
쿼리 메서드?

말 그대로 '메서드의 이름 자체가 쿼리문'이 되는 기능이다.
쿼리 메서드는 주로 'findBy 나 getBy..'로 시작하고 이 후 And, Or와 같은 키워드를 이용한다.
사용하는 키워드에 따라서 파라미터의 개수가 결정된다.

예를 들어, Spring Data JPA 문서를 보면

findByStartDateBetween은 ...where x.startDate between ?1 and ?2 

라고 설명되어 있듯 해당 키워드는 2개의 변수가 필요하다는걸 알 수 있다.

리턴 타입도 select를 하는 작업은 List나 배열을 이용 할 수 있고,

파라미터에 Pageable이 들어간는 경우엔 무조건 Page<E>로 이용해야 한다.

테스트 코드를 통해 알아보자.

 

Repository 인터페이스에 추가

 

public interface MemoRepository extends JpaRepository<Memo, Long> {
    List<Memo> findByMnoBetweenOrderByMnoDesc(Long from, Long to);
}
cs

 

등록한 메소드 이용

 

public void testQueryMethods() {
    List<Memo> list = 
memoRepository.findByMnoBetweenOrderByMnoDesc(70L, 80L);
 
    for(Memo memo : list) {
        System.out.println(memo);
    }
}
cs

 

 

테스트 결과

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Hibernate: 
    select
        memo0_.mno as mno1_0_,
        memo0_.memo_text as memo_tex2_0_ 
    from
        tbl_memo memo0_ 
    where
        memo0_.mno between ? and ? 
    order by
        memo0_.mno desc
Memo(mno=80, memoText=Sample...80)
Memo(mno=79, memoText=Sample...79)
Memo(mno=78, memoText=Sample...78)
Memo(mno=77, memoText=Sample...77)
Memo(mno=76, memoText=Sample...76)
Memo(mno=75, memoText=Sample...75)
Memo(mno=74, memoText=Sample...74)
Memo(mno=73, memoText=Sample...73)
Memo(mno=72, memoText=Sample...72)
Memo(mno=71, memoText=Sample...71)
Memo(mno=70, memoText=Sample...70)
 
cs

 

 

 

쿼리 메서드와 Pageable

 

앞서 말했든 쿼리 메서드는 Pageable 파라미터를 같이 결합해서 사용 할 수 있어서 정렬에 관한 부분은 더 간략하게 사용 할 수 있다. 테스트 코드를 통해 알아보자.

 

Repository 인터페이스에 추가

 

1
2
3
public interface MemoRepository extends JpaRepository<Memo, Long> {    
List<Memo> findByMnoBetweenOrderByMnoDesc(Long from, Long to);
 
Page<Memo> findByMnoBetween(Long from, Long to, Pageable pageable);
}
cs

 

등록한 메서드 이용

 

1
2
3
4
5
6
7
public void testQueryMethodWithhPagable() {
    Pageable pageable = PageRequest.of(010, Sort.by("mno").descending());
 
    Page<Memo> result = memoRepository.findByMnoBetween(10L, 50L, pageable);
 
    result.get().forEach(memo -> System.out.println(memo));
}
cs

 

테스트 결과

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
Hibernate: 
    select
        memo0_.mno as mno1_0_,
        memo0_.memo_text as memo_tex2_0_ 
    from
        tbl_memo memo0_ 
    where
        memo0_.mno between ? and ? 
    order by
        memo0_.mno desc limit ?
Hibernate: 
    select
        count(memo0_.mno) as col_0_0_ 
    from
        tbl_memo memo0_ 
    where
        memo0_.mno between ? and ?
Memo(mno=50, memoText=Sample...50)
Memo(mno=49, memoText=Sample...49)
Memo(mno=48, memoText=Sample...48)
Memo(mno=47, memoText=Sample...47)
Memo(mno=46, memoText=Sample...46)
Memo(mno=45, memoText=Sample...45)
Memo(mno=44, memoText=Sample...44)
Memo(mno=43, memoText=Sample...43)
Memo(mno=42, memoText=Sample...42)
Memo(mno=41, memoText=Sample...41)
cs

 

 

deleteBy

 

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

deleteBy는 실제 개발에는 많이 사용되지는 않는데 그 이유는 SQL을 이용하듯 한 번에 삭제가 되는 것이 아니라

하나 하나씩 삭제하기 때문에 개발시에는 @Query 어노테이션을 많이 사용한다.

우선 테스트 코드를 통해 알아보자.

 

Repository 인터페이스에 추가

 

1
2
3
public interface MemoRepository extends JpaRepository<Memo, Long> {
    void deleteMemoByMnoLessThan(Long num);
}
cs

 

등록한 메서드 이용

 

1
2
3
4
5
 @Commit
 @Transactional
 public void testDeleteQueryMethods() {
     memoRepository.deleteMemoByMnoLessThan(10L);
 }
cs

 

테스트 결과

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Hibernate: 
    delete 
    from
        tbl_memo 
    where
        mno=?
Hibernate: 
    delete 
    from
        tbl_memo 
    where
        mno=?
Hibernate: 
    delete 
    from
        tbl_memo 
    where
        mno=?
cs

 

위와 같이 결과를 보면 하나하나 삭제되는 것을 확인할 수 있다.

 

오늘은 쿼리 메서드에 대해 알아보았고 다음엔 @Query 어노테이션을 작성해보도록 하겠다.

728x90
반응형