Post

[Spring Data JPA] 쿼리 메소드

📌 들어가며

이번 글에서는 Spring Data JPA의 쿼리 메소드를 정리한다.

쿼리 메소드란? 레포지토리 메소드의 이름을 정해진 형식으로 짓기만 하면 그 기능을 하는 것. 순수 JPA와 비교하면 그 편리함이 극명하다.


1. 순수 JPA — 직접 쿼리 작성

1
2
3
4
5
6
7
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();
}

메소드 이름을 짓고, JPQL을 직접 작성하고, 파라미터를 바인딩해야 한다.


2. Spring Data JPA — 이름만

1
2
3
public interface MemberRepository extends JpaRepository<Member, Long> {
    List<Member> findByUsernameAndAgeGreaterThan(String username, int age);
}

💡 구현이 전혀 없다! 메소드 이름을 규칙에 맞게 지으면, 스프링이 이름을 분석해 자동으로 쿼리를 만들어 실행한다.

1
2
3
findBy  Username  And  Age  GreaterThan
  │        │       │    │        │
select   where   AND  age   age > ?
방식쿼리 작성
순수 JPAJPQL 직접 작성 + 파라미터 바인딩
쿼리 메소드메소드 이름만 (자동 생성)

3. 테스트 (동일하게 동작)

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

    // "AAA"이면서 age > 15인 것 → m2만
    List<Member> result = memberRepository.findByUsernameAndAgeGreaterThan("AAA", 15);

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

순수 JPA로 구현한 것과 완전히 동일하게 동작한다.


📝 정리

1
2
3
4
쿼리 메소드
├─ 순수 JPA   메소드 + JPQL 직접 작성
├─ 쿼리 메소드  메소드 이름만 → 쿼리 자동 생성
└─ 규칙       findBy + 필드 + 조건(And/GreaterThan 등)
키워드의미
findByselect
AndAND 조건
GreaterThan>

쿼리 메소드는 “메소드 이름이 곧 쿼리”라는 발상이다. 간단한 조회는 JPQL을 한 줄도 안 쓰고 이름만으로 해결되니, 반복적인 조회 코드가 크게 줄어든다.

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

Comments powered by Disqus.