본문 바로가기
JAVA/JPA

[JPA] Named 쿼리

by 개미가되고싶은사람 2024. 12. 3.

Named 쿼리

Named 쿼리는 사전에 정의해서 사용하는 정적 쿼리로, @NamedQuery 어노테이션이나 XML 파일에 정의하여 사용합니다. 이 쿼리는 로딩 시점에 초기화되며, 이후 재사용이 가능하고, 로딩 시점에 쿼리를 사전에 검사하여 오류를 미리 확인할 수 있습니다.

 

예를 들어, 이름을 제공받아 사용자 정보를 조회하는 쿼리를 정의할 수 있습니다.

1. @NamedQuery

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

 

2. XML 파일

<entity-mappings xmlns="http://xmlns.jcp.org/xml/ns/persistence/orm"
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence/orm
                 http://xmlns.jcp.org/xml/ns/persistence/orm_2_1.xsd"
                 version="2.1">
    <named-query name="Member.findByUsername">
        <query>select m from Member m where m.username = :username</query>
    </named-query>
</entity-mappings>

 

이렇게 사전에 정의된 Named 쿼리는 EntityManager와 @Query를 통해 사용할 수 있으며, XML로 설정된 Named 쿼리가 우선권을 가집니다.

 

Named 쿼리 적용 방법

// EntityManager를 통해 사용
List<Member> resultList = em.createNamedQuery("Member.findByUsername", Member.class)
        .setParameter("username", "회원1")
        .getResultList();

// Spring Data JPA @Query를 통해 사용
@Query(name = "Member.findByUsername")
List<User> findByUsername(@Param("username") String username);

 

 

정리

장점

  • 재사용성: Named 쿼리는 여러 곳에서 재사용할 수 있습니다.
  • 성능 향상: 쿼리가 미리 컴파일되므로 실행 시 성능이 향상될 수 있습니다.
  • 안전성: 컴파일 시점에 오류를 발견할 수 있어 런타임 시 발생하는 오류를 줄일 수 있습니다.

단점

  • 유연성: Named 쿼리는 미리 정의된 쿼리이므로, 동적으로 쿼리를 변경하기 어렵습니다.
  • 디버깅 어려움: 쿼리의 이름만으로는 쿼리의 내용을 파악하기 어려워 디버깅하는데 어려울 수 있습니다.

 

 

참고

https://velog.io/@pp8817/JPQL-Named-query

 

✏️ [JPQL] Named query

동적 쿼리는 em.createQuery(”select ..”)와 같이 JPQL을 문자로 완성해서 직접 넘기는 것을 동적 쿼리라 한다.

velog.io