오봉이와 함께하는 개발 블로그

스프링 데이터 JPA - JPA NamedQuery 본문

BE/JPA

스프링 데이터 JPA - JPA NamedQuery

오봉봉이 2022. 9. 8. 01:36
728x90

JPA NamedQuery

JPA의 NamedQuery를 호출할 수 있다.

@NamedQuery 어노테이션으로 Named 쿼리 정의

@Entity
@NamedQuery(name="Member.findByUsername",
            query="select m from Member m where m.username = :username")
public class Member {
// ................
}

JPA를 직접 사용해서 Named 쿼리 호출

@Repository
public class MemberJpaRepository {
  // ....................
  public List<Member> findByUsername(String username) {
      return em.createNamedQuery("Member.findByUsername", Member.class)
              .setParameter("username", username)
              .getResultList();
  }
}

위와 같이 구현하기는 귀찮고, JPQL을 직접 작성하는 것과 크게 다르지 않아보인다.

스프링 데이터 JPA로 NamedQuery 사용

public interface MemberRepository extends JpaRepository<Member, Long> {
  // ..............
  @Query(name = "Member.findByUsername")
  List<Member> findByUsername(@Param("username") String username);
}

@Param("username") String username을 통해 JPQL에 파라미터를 넣어줄 수 있다.
스프링 데이터 JPA를 사용해서 NamedQuery를 사용하는 것이 JPA를 직접 사용하는 것 보다 편해보인다.

@Query(name = "Member.findByUsername")를 생략하고 아래와 같이 작성해서 인식을 할 수 있다.

public interface MemberRepository extends JpaRepository<Member, Long> {
  // ..............
  List<Member> findByUsername(@Param("username") String username);
}

JpaRepository<Member, Long>에 있는 Member.을 찍고 메소드 이름(findByUsername)을 추가해서 결과적으로 Member.findByUsername을 찾을 수 있다.
그럼 찾은 Member.findByUsername은 어디서 찾을까?
JpaRepository<Member, Long>에서 Member를 보고 해당 엔티티로 이동해서 정의된 네임드 쿼리를 찾게된다.
만약 네임드 쿼리가 없다면 메소드 이름으로 쿼리를 생성한다.

정리

네임드 쿼리는 장정이 하나 있는데, JPQL을 작성할 때 필드명을 잘못 입력하면 애플리케이션 실행 할 때 오류를 띄우지 않지만, 네임드 쿼리를 사용하면 애플리케이션 실행 할 때 문자열 파싱을 거쳐 잘못된 필드명이 있으면 오류를 띄워준다.

JPQL : select m from Member m where m.usernaasdadsme = :username and m.age > :age // 실행됨
NamedQuery : select m from Member m where m.usernaasdadsme = :username and m.age > :age // 실행 안 됨

스프링 데이터 JPA를 사용하면 실무에서 Named Query를 직접 등록해서 사용하는 일은 드물다. 대신 @Query를 사용해서 리파지토리 메소드에 쿼리를 직접 정의한다.

인프런 김영한 지식공유자님 강의 : 실전! 스프링 데이터 JPA
728x90
Comments