오봉이와 함께하는 개발 블로그

스프링 데이터 JPA - 메소드 이름으로 쿼리 생성 본문

BE/JPA

스프링 데이터 JPA - 메소드 이름으로 쿼리 생성

오봉봉이 2022. 9. 8. 01:16
728x90

메소드 이름으로 쿼리 생성

메소드 이름을 분석해서 JPQL 쿼리 실행해준다.

이름과 나이를 기준으로 회원을 조회하려면 어떻게 해야 할까?

순수 JPA 리포지토리

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();
}

순수 JPA 테스트 코드

@Test
void findByUsernameAndAgeGreaterThan() {
    Member memA1 = new Member("memA", 10);
    Member memA2 = new Member("memA", 20);
    memberJpaRepository.save(memA1);
    memberJpaRepository.save(memA2)
    List<Member> result = memberJpaRepository.findByUsernameAndAgeGreaterThan("memA", 15)
    assertThat(result.get(0).getUsername()).isEqualTo("memA");
    assertThat(result.get(0).getAge()).isEqualTo(20);
    assertThat(result.size()).isEqualTo(1);
}

스프링 데이터 JPA

public interface MemberRepository extends JpaRepository<Member, Long> {
    // <T(Object Type), ID(T의 PK가 어떤 타입인가?)>
    List<Member> findByUsernameAndAgeGreaterThan(String username, int age);
}

스프링 데이터 JPA 테스트 코드

@Test
void findByUsernameAndAgeGreaterThan() {
    Member memA1 = new Member("memA", 10);
    Member memA2 = new Member("memA", 20);
    memberRepository.save(memA1);
    memberRepository.save(memA2)
    List<Member> result = memberRepository.findByUsernameAndAgeGreaterThan("memA", 15)
    assertThat(result.get(0).getUsername()).isEqualTo("memA");
    assertThat(result.get(0).getAge()).isEqualTo(20);
    assertThat(result.size()).isEqualTo(1);
}

스프링 데이터 JPA는 메소드 이름을 분석해서 JPQL을 생성하고 실행한다!

쿼리 메소드 필터 조건

findByUsernameAndAgeGreaterThanfindBy뒤에 필드명을 입력하는 관례로 작동한다.
findByXXX로 입력하면 자동으로 where절에 XXX를 입력하고 =에 대한 결과를 찾는다.
And는 쿼리문에서 where절 조건and로 들어가고 다음 필드명 Age의 뒤에 GreaterThan이 있어 Age < parameter가 된다.

스프링 데이터 JPA 공식 문서 참고 : (https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation)

스프링 데이터 JPA가 제공하는 쿼리 메소드 기능

이 기능은 엔티티의 필드명이 변경되면 인터페이스에 정의한 메서드 이름도 꼭 함께 변경해야 한다. 그렇지 않으면 애플리케이션을 시작하는 시점에 오류가 발생한다. 이렇게 애플리케이션 로딩 시점에 오류를 인지할 수 있는 것이 스프링 데이터 JPA의 매우 큰 장점이다.

인프런 김영한 지식공유자님 강의 : 실전! 스프링 데이터 JPA
728x90
Comments