Spring Data JPA - NamedQuery


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.List

class 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.JpaRepository
import org.springframework.data.jpa.repository.Query
import org.springframework.data.repository.query.Param

interface 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.JpaRepository
import org.springframework.data.repository.query.Param

interface MemberRepository : JpaRepository<Member, Long> {

fun findByUsername(@Param("username") username: String): List<Member>

}

이런 전략을 변경하는 것도 가능하나, 일반적으로는 권장하지 않습니다. 자세한 내용은 이 링크에서 확인하실 수 있습니다.

스프링 데이터 JPA를 사용하면, 일반적으로는 Named Query를 직접 등록하여 사용하는 경우는 드뭅니다. 대신, 개발자들은 주로 @Query 어노테이션을 이용하여 리파지토리 메소드에 쿼리를 직접 정의합니다. 이에 대한 자세한 내용은 다음 포스트에서 다루도록 하겠습니다.

소스코드

참조