본문 바로가기
JPA/스프링 DATA JPA

Data JPA 04 쿼리 메서드 - NamedQuery

by 킹차니 2022. 1. 5.

JPA NamedQuery

 

NamedQuery를 사용하면 엔티티에 쿼리를 정의해두고, 리퍼지토리에서 해당 쿼리를 호출하도록 할 수 있다.

username으로 Member를 조회하는 예시를 보자. (NamedQuery에 주목되도록 다른 코드들은 대부분 제거하였다.)

@NamedQuery(name="Member.findByUsername", query="select m from Member m where m.username= :username")
@Entity
public class Member {
	...
    @Id @GeneratedValue
    private Long id;
    private String username;
    private int age;
    private Team team;
	...
}
@NamedQuery(name="Member.findByUsername", 
                            query="select m from Member m where m.username= :username")

 

@NamedQuery를 보면 name에는 해당 쿼리의 이름(리퍼지토리에서 호출시 필요. 본인이 원하는대로 지정 가능하지만 형식상 '엔티티이름.메서드이름'을 한다.)

query에는 원하는 쿼리를 넣으면 된다.

 

Member 엔티티에서 정의한 NamedQuery를 순수 jpa에서 사용하기 위해서는 아래와 같다.

import org.springframework.stereotype.Repository;
import study.datajpa.entity.Member;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import java.util.List;
import java.util.Optional;

@Repository
public class MemberJPArepository {

    @PersistenceContext
    private EntityManager em;


	//Member엔티티의 NamedQuery 호출
    public List<Member> findByUsername(String username){
        return em.createNamedQuery("Member.findByUsername", Member.class)//createNamedQuery
                .setParameter("username", username)
                .getResultList();
    }
    
    ....
}

em.createNamedQuery 메서드의 인자에 Member엔티티에서 지정한 쿼리 이름을 넣고, 두번째 인자에는 해당 엔티티 타입을 넣어주면 된다.

 

data jpa 리퍼지토리에서 사용하기 위해서는 아래와 같이 해준다.

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import study.datajpa.entity.Member;

import java.util.List;

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

@Query의 name에는 Member 엔티티에 지정한 쿼리 이름을 넣어준다.

findByUsername이라는 메서드 이름은 필수로 맞춰주어야 하는 것은 아니지만 맞춰주는것이 좋다. 이유는 아래의 2번 때문이다.

1. 스프링 데이터 JPA는 선언한 "도메인 클래스 + .(점) + 메서드 이름"으로 Named 쿼리를 찾아서 실행.
2. 만약 실행할 Named 쿼리가 없으면 메서드 이름으로 쿼리 생성 전략을 사용한다.

 

하지만 딱 봐도 NamedQuery는 많이 사용할 것 같은 방법은 아니다. 일단 엔티티에 쿼리가 있는 것부터가... 영 아니다 싶다. 실제로 실무에서도 사용하는 방법은 아니라고 한다. 

 

더 강력하고 실무에서 사용되는 '리포지토리 메서드에 쿼리 정의하기'를 다음 포스트에서 배워보자.

 

 

 

 

 

 

 

 

 

김영한님의 인프런 강의와 PDF를 바탕으로 정리하였습니다.