스프링 Data JPA는 아주 놀라운 기능을 제공하는데, 바로 쿼리 메서드 기능이다.
예시로 ' username과 특정 age이상의 멤버를 찾는 메서드 '가 있어야 한다면 어떨까?
data jpa말고 순수 JPA만을 사용해서 만든다면 아래와 같이 만들어야 할 것이다.
@Repository
public class MemberJPArepository {
@PersistenceContext
private EntityManager em;
...
public List<Member> findByUsernameAndAgeGreaterThan(String username, int age) {
return em.createQuery("select m from Member m where m.username =:username and m.age > :age", Member.class)
.setParameter("username", username)
.setParameter("age", age)
.getResultList();
}
...
}
이를 한번 테스트 해보면
@Test
void findByUsernameAndAgeGreaterThan(){
Member member1 = new Member("member1", 10, null);
Member member2 = new Member("member2", 13, null);
memberJPArepository.save(member1);
memberJPArepository.save(member2);
Member findMember = memberJPArepository.findByUsernameAndAgeGreaterThan("member2", 10).get(0);
assertThat(findMember).isEqualTo(member2);
assertThat(findMember.getAge()).isEqualTo(13);
assertThat(findMember.getUsername()).isEqualTo("member2");
}
아래와 같은 쿼리가 나가고 (insert문 제외), 테스트에 성공한다.
//실행된 쿼리
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=?
and member0_.age>?
잘 수행된 것을 볼 수 있다.
하지만 이는 매우 귀찮다... 하여 data JPA를 사용하면 아래와 같이 메서드 이름만을 정의해도 알아서 쿼리를 잘 날려준다.
import org.springframework.data.jpa.repository.JpaRepository;
import study.datajpa.entity.Member;
import java.util.List;
public interface MemberRepository extends JpaRepository<Member, Long> {
...
List<Member> findByUsernameAndAgeGreaterThan(String username, int age);
...
}
이도 역시 테스트해보자.
@Test
void findByUsernameAndAgeGreaterThan(){
Member member1 = new Member("member1", 10, null);
Member member2 = new Member("member2", 13, null);
memberRepository.save(member1);
memberRepository.save(member2);
Member findMember = memberRepository.findByUsernameAndAgeGreaterThan("member2", 10).get(0);
assertThat(findMember).isEqualTo(member2);
assertThat(findMember.getAge()).isEqualTo(13);
assertThat(findMember.getUsername()).isEqualTo("member2");
}
순수 JPA와 똑같은 쿼리가 나가고, 테스트도 성공한다.
//실행된 쿼리
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=?
and member0_.age>?
이러한 쿼리 메서드는 몇가지 규칙이 있고, 정말 다양한 기능을 제공한다. 자세한 내용은 spring.io가 제공하는 data jpa문서를 참조하자.
간단하게 보면
• AND는 SQL의 where 조건문 뒤의 and에 해당한다.
• 조회를 위해서는 find...By ,read...By ,query...By get...By 와 같은 형식이다. ( "..."에는 어떤 단어를 넣어도 상관없다.)
• COUNT: count...By - 반환타입 long
• EXISTS: exists...By - 반환타입 boolean
• 삭제: delete...By, remove...By - 반환타입 long
• DISTINCT: findDistinct, findMemberDistinctBy
• LIMIT: findFirst3, findFirst, findTop, findTop3
김영한님의 인프런 강의와 PDF를 바탕으로 정리하였습니다.
'JPA > 스프링 DATA JPA' 카테고리의 다른 글
Data JPA 06 쿼리 메서드 - 반환타입, 페이징 (0) | 2022.01.06 |
---|---|
Data JPA 05 쿼리 메서드 - Query, 리포지토리 메서드에 쿼리 정의하기 (0) | 2022.01.05 |
Data JPA 04 쿼리 메서드 - NamedQuery (0) | 2022.01.05 |
Data JPA 02 - 예제 도메인 확인하기, 공통 인터페이스 (0) | 2022.01.04 |
Data JPA 01 - 스프링 데이터 jpa 맛보기 (0) | 2022.01.02 |