오봉이와 함께하는 개발 블로그
스프링 데이터 JPA - JPA NamedQuery 본문
728x90
JPA NamedQuery
JPA의 NamedQuery를 호출할 수 있다.
@NamedQuery 어노테이션으로 Named 쿼리 정의
@Entity
@NamedQuery(name="Member.findByUsername",
query="select m from Member m where m.username = :username")
public class Member {
// ................
}
JPA를 직접 사용해서 Named 쿼리 호출
@Repository
public class MemberJpaRepository {
// ....................
public List<Member> findByUsername(String username) {
return em.createNamedQuery("Member.findByUsername", Member.class)
.setParameter("username", username)
.getResultList();
}
}
위와 같이 구현하기는 귀찮고, JPQL을 직접 작성하는 것과 크게 다르지 않아보인다.
스프링 데이터 JPA로 NamedQuery 사용
public interface MemberRepository extends JpaRepository<Member, Long> {
// ..............
@Query(name = "Member.findByUsername")
List<Member> findByUsername(@Param("username") String username);
}
@Param("username") String username
을 통해 JPQL에 파라미터를 넣어줄 수 있다.
스프링 데이터 JPA를 사용해서 NamedQuery
를 사용하는 것이 JPA를 직접 사용하는 것 보다 편해보인다.
@Query(name = "Member.findByUsername")
를 생략하고 아래와 같이 작성해서 인식을 할 수 있다.
public interface MemberRepository extends JpaRepository<Member, Long> {
// ..............
List<Member> findByUsername(@Param("username") String username);
}
JpaRepository<Member, Long>
에 있는 Member
에 .
을 찍고 메소드 이름(findByUsername
)을 추가해서 결과적으로 Member.findByUsername
을 찾을 수 있다.
그럼 찾은 Member.findByUsername
은 어디서 찾을까?JpaRepository<Member, Long>
에서 Member
를 보고 해당 엔티티로 이동해서 정의된 네임드 쿼리를 찾게된다.
만약 네임드 쿼리가 없다면 메소드 이름으로 쿼리를 생성한다.
정리
- 스프링 데이터 JPA는 선언한 "도메인 클래스 + .(점) + 메서드 이름"으로 Named 쿼리를 찾아서 실행
- 만약 실행할 Named 쿼리가 없으면 메서드 이름으로 쿼리 생성 전략을 사용한다.
- 필요하면 전략을 변경할 수 있지만 권장하지 않는다.
네임드 쿼리는 장정이 하나 있는데, JPQL을 작성할 때 필드명을 잘못 입력하면 애플리케이션 실행 할 때 오류를 띄우지 않지만, 네임드 쿼리를 사용하면 애플리케이션 실행 할 때 문자열 파싱을 거쳐 잘못된 필드명이 있으면 오류를 띄워준다.
JPQL : select m from Member m where m.usernaasdadsme = :username and m.age > :age // 실행됨
NamedQuery : select m from Member m where m.usernaasdadsme = :username and m.age > :age // 실행 안 됨
스프링 데이터 JPA를 사용하면 실무에서 Named Query를 직접 등록해서 사용하는 일은 드물다. 대신
@Query
를 사용해서 리파지토리 메소드에 쿼리를 직접 정의한다.
인프런 김영한 지식공유자님 강의 : 실전! 스프링 데이터 JPA
728x90
'BE > JPA' 카테고리의 다른 글
스프링 데이터 JPA - 파라미터 바인딩 (0) | 2022.09.08 |
---|---|
스프링 데이터 JPA - @Query(리포지토리 메소드에 쿼리 정의하기, 값, DTO 조회하기) (0) | 2022.09.08 |
스프링 데이터 JPA - 메소드 이름으로 쿼리 생성 (0) | 2022.09.08 |
스프링 데이터 JPA - 공통 인터페이스 설정, 적용, 분석 (0) | 2022.09.07 |
스프링 데이터 JPA - 예제 도메인 모델과 동작확인 (0) | 2022.09.07 |
Comments