스프링 데이터 JPA - 쿼리 메서드 기능
- 메서드 이름으로 쿼리 생성
- NamedQuery
- @Query - 리파지토리 메서드에 쿼리 정의
- 파라미터 바인딩
- 반환타입
- 페이징과 정렬
- 벌크성 수정 쿼리
- @EntityGraph
스프링 데이터 JPA가 제공하는 마법같은 기능
쿼리 메서드 기능 3가지
- 메서드 이름으로 쿼리 생성
- 메서드 이름으로 JPA NamedQuery 호출
@Query어노테이션을 사용해서 리파지토리 인터페이스에 쿼리 직접 정의
메서드 이름으로 쿼리 생성
메서드 이름을 분석해서 JPQL 쿼리 실행 ??!
이름과 나이가 같은 회원을 조회 하려면?
순수 JPA 리포지토리 에선..
1
2
3
4
5
6
public List<Member> findByUsernameAndAgeGreaterThan(String username, int age) {
return em.createQuery("select m from Member m where m.username = :username and m.age > :age", Member.class)
.setParameter("username", username)
.setParameter("age", age)
.getResultList();
}
스프링 데이터 JPA
1
List<Member> findByUsernameAndAgeGreaterThan(String username, int age);
… 이거 한줄이면 된다.. 심지어 인텔리제이에서 자동완성도 해준다..

테스트 코드도 다음과 같이 잘 통과 한다.
내가 원하는 where문이 잘 나간다.
네이밍 관례로 메서드를 만든다는 점이 신기 하면서 재밌는 거 같다. ㅎㅎ;
메서드 네이밍을 잘못하면 오류가 난다.
다음과 같이 이름을 틀리면 오류가 저렇게 나온다.
- 스프링 데이터 JPA는 메서드 이름을 분석해서 JPQL을 생성하고 실행
쿼리 메서드 필터 조건 스프링 데이터 JPA 공식 문서 참고 : (스프링 데이터 JPA 공식문서)
스프링 데이터 JPA가 제공하는 쿼리 메서드 기능
- 조회 : find..By, read…By, query…By, get…By
- ex) findHelloBy처럼 …에 식별하기 위한 내용이 들어가기도 한다. 없으면 전체 조회
- COUNT : count..By 반환타입
long - EXISTE: exists..By 반환타입
boolean - 삭제 : delete … By, remove … By 반환타입
long - DISTINCT : findDistinct, findMemberDistinctBy
- LIMIT : findFirst3, findFirst, findTop, findTop3
참고 : 이 기능은 엔티티의 필드명이 변경되면 인터페이스에 정의한 메서드 이름도 꼭 함께 변경해야 한다. 그렇지 않으면 애플리케이션을 시작하는 시점에 오류가 발생한다. 이렇게 애플리케이션 로딩 시점에 오류를 인지할 수 있는 것이 스프링 데이터 JPA의 매우 큰 장점이다.
댓글남기기