Post

[Spring Data JPA] 쿼리 메소드

쿼리메소드?


→ 쿼리 메소드란 spring data jpa에서 지원하는 레포지토리의 기능 중 하나로 레포지토리 안에 있는 메소드의 정해진 형식의 이름으로써 그 기능을 하게 된다. 여기에선 이해를 돕기 위해 기본 JPA를 사용했을 때와 data jpa의 쿼리메소드 기능을 사용했을 때의 차이를 보여준다.

기본 JPA


MemberJpaRepository.java

1
2
3
4
5
6
public List<Member> findByUsernameAndAgeGreaterThan(String username, int age){
        return em.createQuery("select m from Member m where m.username= :username and m.age > :age")
                .setParameter("username", username)
                .setParameter("age",age)
                .getResultList();
    }

MemberJpaRepositoryTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
    public void findByUsernameAndAgeGreaterThan(){
        Member m1 = new Member("AAA", 10);
        Member m2 = new Member("AAA", 20);

        memberJpaRepository.save(m1);
        memberJpaRepository.save(m2);

        List<Member> result = memberJpaRepository.findByUsernameAndAgeGreaterThan("AAA", 15);

        assertThat(result.get(0).getUsername()).isEqualTo(m2.getUsername());
        assertThat(result.get(0).getAge()).isEqualTo(m2.getAge());
        assertThat(result.size()).isEqualTo(1);
    }

→ 기본 JPA를 사용했을 때는 findByUsernameAndAgeGreaterThan이름의 메소드를 만들고 엔티티 매니저를 사용하여 원하는 로직을 구현했다. 물론 테스트코드에서 잘 돌아간다.

Spring Data JPA


MemberRepository.java

1
2
3
4
public interface MemberRepository extends JpaRepository<Member, Long> {

    List<Member> findByUsernameAndAgeGreaterThan(String username, int age);
}

MemberRepositoryTest.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Test
    public void findByUsernameAndAgeGreaterThan(){
        Member m1 = new Member("AAA", 10);
        Member m2 = new Member("AAA", 20);

        memberRepository.save(m1);
        memberRepository.save(m2);

        List<Member> result = memberRepository.findByUsernameAndAgeGreaterThan("AAA", 15);

        assertThat(result.get(0).getUsername()).isEqualTo(m2.getUsername());
        assertThat(result.get(0).getAge()).isEqualTo(m2.getAge());
        assertThat(result.size()).isEqualTo(1);
    }

→ spring data jpa에서는 실제 구현하지 않더라도 레포지토리 인터페이스에서 정해진 형식에 따라서 이름을 지은 메소드가 실제로 그 기능을 한다는 것이다.

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.