Spring Data JPA 쿼리 메소드 기능 NamedQuery
JPA NamedQuery를 활용하는 방법 Member 클래스에서 유저 이름에 따라 데이터를 조회하는 NamedQuery를 생성해봅시다.
Member.kt 1 2 3 4 5 6 7 8 9 10 import javax.persistence.*@Entity @NamedQuery( name = "Member.findByUsername" , query = "select m from Member m where m.username = :username" ) data class Member ( ... )
이제 MemberRepository
에서 이 NamedQuery를 호출하는 방법에 대해 알아보겠습니다.
MemberRepository.kt 1 2 3 4 5 6 7 8 9 10 11 12 import javax.persistence.*import kotlin.collections.Listclass MemberRepository { fun findByUsername (em: EntityManager , username: String ) : List<Member> { return em.createNamedQuery("Member.findByUsername" , Member::class .java ) .setParameter("username" , username) .resultList } }
스프링 데이터 JPA에서도 NamedQuery를 활용할 수 있습니다. 아래 예제는 @Query
어노테이션을 사용하여 NamedQuery를 호출하는 방법을 보여줍니다.
MemberRepository.kt 1 2 3 4 5 6 7 8 9 10 import org.springframework.data .jpa.repository.JpaRepositoryimport org.springframework.data .jpa.repository.Queryimport org.springframework.data .repository.query.Paraminterface MemberRepository : JpaRepository <Member, Long > { @Query(name = "Member.findByUsername" ) fun findByUsername (@Param("username" ) username: String ) : List<Member> }
또한, @Query
어노테이션을 생략하고, 메서드 이름만을 이용해 Named 쿼리를 호출하는 것도 가능합니다. 스프링 데이터 JPA는 “도메인 클래스 + .(점) + 메서드 이름”의 규칙을 사용하여 Named 쿼리를 찾아서 실행합니다. 만약 해당 Named 쿼리가 없을 경우, 메서드 이름을 바탕으로 쿼리를 생성합니다.
MemberRepository.kt 1 2 3 4 5 6 7 8 import org.springframework.data .jpa.repository.JpaRepositoryimport org.springframework.data .repository.query.Paraminterface MemberRepository : JpaRepository <Member, Long > { fun findByUsername (@Param("username" ) username: String ) : List<Member> }
이런 전략을 변경하는 것도 가능하나, 일반적으로는 권장하지 않습니다. 자세한 내용은 이 링크 에서 확인하실 수 있습니다.
스프링 데이터 JPA를 사용하면, 일반적으로는 Named Query를 직접 등록하여 사용하는 경우는 드뭅니다. 대신, 개발자들은 주로 @Query
어노테이션을 이용하여 리파지토리 메소드에 쿼리를 직접 정의합니다. 이에 대한 자세한 내용은 다음 포스트에서 다루도록 하겠습니다.
소스코드
참조