반응형
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다.
JPA NamedQuery
쿼리 메서드 기능 3가지
메서드 이름으로 쿼리 생성- 메서드 이름으로 JPA NamedQuery 호출
- @Query 애노테이션을 사용해서 레파지토리 인터페이스에 쿼리 직접 정의
JPA NamedQuery
- @NamedQuery 애노테이션으로 Named 쿼리 정의
- 실무에서 거의 사용할 일이 없다.
- JPA를 직접 사용해서 Named 쿼리 호출
관련 포스팅
예제
- Member.class에 @NamedQuery 추가
@Entity
@Getter @Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString(of = {"id", "username", "age"})
@NamedQuery(
name="Member.findByUsername",
query="select m from Member m where m.username = :username"
)
public class Member {
- MemberJpaRepository.class
public List<Member> findByUsernames(String username) {
return em.createNamedQuery("Member.findByUsername", Member.class)
.setParameter("username", "회원1")
.getResultList();
}
- MemberJapRepositoryTest.class
@Test
public void testNamedQuery() {
Member m1 = new Member("AAA", 10);
Member m2 = new Member("BBB", 20);
memberJpaRepository.save(m1);
memberJpaRepository.save(m2);
List<Member> result = memberJpaRepository.findByUsernames("AAA");
Member findMember = result.get(0);
assertThat(findMember).isEqualTo(m1);
}
// 출력 로그
select
member0_.member_id as member_i1_0_,
member0_.age as age2_0_,
member0_.team_id as team_id4_0_,
member0_.username as username3_0_
from
member member0_
where
member0_.username=?
위의 코드가 꽤 많이 작성된다. 한마디로 귀찮은 과정이 많다! 그래서 스프링 데이터 JPA에서는 NamedQuery를 쉽게 사용할 수 있는 방법을 제공한다.
- MemberRepository.interface
@Query(name = "Member.findByUsername") // 생략 가능
List<Member> findByUsername(@Param("username") String username);
- MemberRepositoryTest.class
@Test
public void testNamedQuery() {
Member m1 = new Member("AAA", 10);
Member m2 = new Member("BBB", 20);
memberRepository.save(m1);
memberRepository.save(m2);
List<Member> result = memberRepository.findByUsername("AAA");
Member findMember = result.get(0);
assertThat(findMember).isEqualTo(m1);
}
스프링 데이터 JPA에서는 MemberRepository에 적어주었던 @Query 애노테이션을 생략할 수 있다. 이유는 JpaRepository의 제네릭 중 앞의 엔티티 타입이 들어가 있기 때문에 일단 그 타입에 들어가서 해당 메서드가 있나 찾아본다. 그래서 있으면 생성하고, 없으면 메서드 이름으로 쿼리를 생성한다. 이 우선순위는 변경이 가능하지만 되도록 변경하지 않는 것이 좋다. 어차피 우선순위를 변경할 이유가 별로 없기도 하다..
! 이 기능은 컴파일 오류를 발생시켜 개발자가 오류를 잡는 것이 편하긴 하지만 실무에서 잘 사용하지 않는다.
반응형