✅ 메서드 이름으로 쿼리 생성
✅ 메서드 이름으로 JPA NamedQuery 호출
✅ @Query
어노테이션을 사용해서 Repository 인터페이스에 쿼리 직접 정의
오늘은 메서드 이름으로 쿼리 생성
과 NamedQuery
에 대해 정리해 보자.
메서드 이름을 분석해서 JPQL 쿼리 실행
// 순수 JPA Repository
public List<Member> findByUsernameAndAgeGreaterThan(String username, int age) {
return em.createQuery("select m from Member m where m.username = :username and m.age > :age")
.setParameter("username", username)
.setParameter("age", age)
.getResultList();
}
// Spring Data JPA
public interface MemberRepository extends JpaRepository<Member, Long> {
List<Member> findByUsernameAndAgeGreaterThan(String username, int age);
}
long
boolean
long
메서드 이름으로 쿼리를 생성하는 기능은 엔티티의 필드명이 변경되면,
그렇지 않으면 애플리케이션을 시작하는 시점에 오류가 발생
애플리케이션 로딩 시점
에 오류 인지
👉 스프링 데이터 JPA의 매우 큰 장점
// @NamedQuery 어노테이션으로 NamedQuery 정의
@Entity
@NamedQuery(
name="Member.findByUsername",
query="select m from Member m where m.username = :username")
public class Member {
...
}
// JPA를 직접 사용해서 NamedQuery 호출
public class MemberRepository {
public List<Member> findByUsername(String username) {
...
List<Member> resultList =
em.createNamedQuery("Member.findByUsername", Member.class)
.setParameter("username", username)
.getResultList();
}
}
// 스프링 데이터 JPA로 NamedQuery 사용
public interface MemberRepository extends JpaRepository<Member, Long> {
@Query(name = "Member.findByUsername")
List<Member> findByUsername(@Param("username") String username);
}
@Query
를 생략하고 메서드 이름만으로 Named 쿼리를 호출할 수 있다.// Spring Data JPA NamedQuery 호출
public interface MemberRepository extends JpaRepository<Member, Long> {
List<Member> findByUsername(@Param("username") String username);
}
스프링 데이터 JPA는 선언한 "도메인 클래스 + .(점) + 메서드 이름"으로 Named 쿼리를 찾아서 실행
만약 실행할 Named 쿼리가 없으면 메서드 이름으로 쿼리 생성 전략을 사용
필요하면 전략을 변경할 수 있지만 권장하지 않는다.
✅ 스프링 데이터 JPA를 사용하면 실무에서 Named Query를 직접 등록해서 사용하는 일은 드물다.
대신 @Query
를 사용해서 Repository 메서드에 쿼리를 직접 정의한다.