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
'JAVA > JPA' 카테고리의 다른 글
[JPA] JPA 성능 최적화 #1 - fetch join (0) | 2024.12.10 |
---|---|
[JPA] 순환참조 문제해결 - 양방향 매핑 문제점 (0) | 2024.12.09 |
[JPA] 벌크(Bulk) 연산 (1) | 2024.12.02 |
[JPA] JPQL 페치조인(fetch join)의 한계 및 해결방법 (0) | 2024.12.02 |
[JPA] JPQL 페치조인(fetch join) (1) | 2024.11.28 |