본문 바로가기
JPA/스프링 DATA JPA

Data JPA 03 쿼리 메소드 - 메서드 이름으로 쿼리 생성

by 킹차니 2022. 1. 5.

 

스프링 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를 바탕으로 정리하였습니다.