반응형
Spring Data JPA 게시글은 대부분 인프런의 김영한님의 강의인 '실전! 스프링 데이터 JPA' 기반으로 내용을 정리했습니다.
메서드 이름으로 쿼리 생성
쿼리 메서드 기능 3가지
- 메서드 이름으로 쿼리 생성
- 메서드 이름으로 JPA NamedQuery 호출
- @Query 애노테이션을 사용해서 레파지토리 인터페이스에 쿼리 직접 정의
메서드 이름으로 쿼리 생성
- 메서드 이름을 분석해서 JPQL 쿼리 실행
- ex) 이름과 나이가 같은 회원을 조회하려면?
- 순수 JPA 리포지토리
public List<Member> findByUsernameAndAgeGreaterThen(String username, int age) {
return em.createQuery("select m from Member m where m where m.username = :username and m.age > :age")
.setParameter("username", username)
.setParameter("age", age)
.getResultList();
}
- 순수 JPA 테스트 코드
@Test
public void findByUsernameAndAgeGreaterThen() {
Member m1 = new Member("AAA", 10);
Member m2 = new Member("AAA", 20);
memberJpaRepository.save(m1);
memberJpaRepository.save(m2);
List<Member> result = memberJpaRepository.findByUsernameAndAgeGreaterThen("AAA", 15);
assertThat(result.get(0).getUsername()).isEqualTo("AAA");
assertThat(result.get(0).getAge()).isEqualTo(20);
assertThat(result.size()).isEqualTo(1);
}
- 스프링 데이터 JPA
List<Member> findByUsernameAndAgeGreaterThan(String username, int age);
- 스프링 데이터 JPA 테스트 코드
@Test
public void findByUsernameAndAgeGreaterThen() {
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("AAA");
assertThat(result.get(0).getAge()).isEqualTo(20);
assertThat(result.size()).isEqualTo(1);
}
결과를 보면 순수 JPA 코드와 스프링 데이터 JPA 코드가 같은 걸 알 수 있다. JPA 인터페이스 안에 함수 원형을 정의만했는데 어떻게 제목만 보고 자동으로 쿼리를 작성해서 날렸을까? 바로 제목을 보고 스프링 데이터 JPA가 쿼리를 만들어주기 때문이다. 그렇기 때문에 메서드 이름에 관례를 따라주어야하고, 만약 오타 등으로 관례에 벗어날 시 오류가 발생한다.
메서드 이름 필터 조건
메서드 이름에 기입할 관례 및 조건은 아래 공식 사이트 매뉴얼에서 확인할 수 있다.
스프링 데이터 JPA가 제공하는 쿼리 메서드 기능
- 조회 : find...By, read...By, get..By
- ex) findHelloBy처럼 ...에 식별하기 위한 내용(설명)이 들어가도 된다.
- COUNT : count...By 반환타입 'long'
- EXISTS : exists...By 반환타입 'boolean'
- 삭제 : delete...By, remove...By 반환타입 'long'
- DISINCT : findDistinct, findMemberDisinctBy
- LIMIT : findFirst3, findFirst, findTop, findTop3
! 이 기능은 엔티티의 필드명이 변경되면 인터페이스에 정의한 메서드 이름도 꼭 함께 변경해야 한다. 그렇지 않으면 애플리케이션을 시작하는 시점에 오류가 발생한다. 이렇게 애플리케이션 로딩 시점에 오류를 인지할 수 있는 것이 스프링 데이터 JPA의 매우 큰 장점이다.(오류를 쉽게 찾고, 고칠 수 있기 때문)
반응형