Named 쿼리

결론 : 애노테이션, xml 설정 파일 등으로 Named 쿼리를 사용할 수 있지만 강사님 개인적인 견해로는 @NamedQuery를 클래스 앞에 붙이면 코드가 지저분(?)해지기 때문에 결국 실무에서는 스프링 데이터 JPA를 함께 사용하는 것이 좋다고 한다.

  • 미리 정의해서 이름을 부여해두고 사용하는 JPQL

  • 정적쿼리

  • 어노테이션

  • XML에 정의

  • 애플리케이션 로딩 시점에 초기화 후 재사용 JPQL이 파싱해서 SQL로 사용.(파싱 비용이 발생하는데 로딩시점에 한번하고 캐싱하기 때문에 재사용 가능!)

  • 애플리케이션 로딩 시점에 쿼리를 검증⭐️⭐️⭐️⭐️⭐️ =>애플리케이션 로딩 시점에서 애노테이션 기반의 쿼리를 로딩하는데 이 때 오타나 잘못된 것이 있으면 컴파일 오류가 발생하기 때문에 확인하고 즉시 수정이 가능하다! "세상에서 제일 좋은 오류는 컴파일 오류" 라는 것을 기억! 물론 이또한 런타임시점에서 로딩할 때 발생하는 오류이긴하지만 컴파일 오류와 최악(사용자가 사용할 때 발생하는 오류) 중간 정도에 해당.

사용 방법

EntityManager.createQueryEntityManager.createNameQuery("쿼리이름",Member.class)

  1. 애노테이션

  2. XML에 정의

Named 쿼리 환경에 따른 설정 특별히 이런 일은 잘 없지만, 어떤 솔루션을 개발했을 때 특정 상황에 따라 다르게 처리해야할 때. 매핑 파일을 따로 배포하면 된다.

  • XML이 항상 우선권을 가진다.

  • 애플리케이션 운영 환경에 따라 다른 XML을 배포할 수 있다.

스프링 데이터 JPA를 사용하면 @Query로 사용할 수 있다. 스프링 데이터 JPA는 JPA를 추상화해서 좀 더 편하게 사용하기 위함인데 여기서 @Query("...")를 Named Query로 등록한다! 그래서 애플리케이션 로딩 시점에 파싱 되고, 오류 발생시 바로 컴파일 오류로 잡아준다. "이름없는 Named Query"라고 한다.

스프링 데이터 JPA @Query 예시 : 인터페이스에서 바로 쓸 수 있다!

public interface UserRepository extends JpaRepository<User, Long> {
    @Query("select u from User u where u.emailAddress = ?1")
    User findByEmailAddress(String emailAddress);
}

Last updated