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

2022. 7. 29. 21:12·공부/JPA
반응형

출처 : 인프런 실전! 스프링 데이터 JPA

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가 쿼리를 만들어주기 때문이다. 그렇기 때문에 메서드 이름에 관례를 따라주어야하고, 만약 오타 등으로 관례에 벗어날 시 오류가 발생한다.

 

 

메서드 이름 필터 조건

메서드 이름에 기입할 관례 및 조건은 아래 공식 사이트 매뉴얼에서 확인할 수 있다.

 

Spring Data JPA - Reference Documentation

Example 109. Using @Transactional at query methods @Transactional(readOnly = true) interface UserRepository extends JpaRepository { List findByLastname(String lastname); @Modifying @Transactional @Query("delete from User u where u.active = false") void del

docs.spring.io

이런 설명들이 나와있다.

 

 

스프링 데이터 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의 매우 큰 장점이다.(오류를 쉽게 찾고, 고칠 수 있기 때문)
반응형
저작자표시 비영리 변경금지 (새창열림)
'공부/JPA' 카테고리의 다른 글
  • Spring Data JPA - @Query, 리포지토리 메서드에 쿼리 정의하기
  • Spring Data JPA - JPA NamedQuery
  • Spring Data JPA - 공통 인터페이스
  • Spring Data JPA - 순수 JPA 기반 리포지토리 만들기
데부한
데부한
어차피 할 거면 긍정적으로 하고 싶은 개발자
    반응형
  • 데부한
    동동이개발바닥
    데부한
  • 전체
    오늘
    어제
    • 분류 전체보기 (307)
      • 방통대 컴퓨터과학과 (27)
        • 잡담 (9)
        • 3학년1학기 (17)
      • 프로젝트 및 컨퍼런스 회고 (1)
        • 프로젝트 (4)
        • 한이음 프로젝트 (0)
        • 회고 (3)
      • 공부 (165)
        • Spring (37)
        • JPA (71)
        • 인프런 워밍업 클럽_BE (10)
        • Java (6)
        • React.js (27)
        • 넥사크로 (11)
        • 기타 (3)
      • 알고리즘 (85)
        • 알고리즘 유형 (10)
        • 알고리즘 풀이 (57)
        • SQL 풀이 (18)
      • 에러 해결 (13)
      • 잡담 (7)
        • 국비교육 (2)
        • 구매후기 (5)
        • 진짜 잡담 (0)
  • 블로그 메뉴

    • Github
    • Linkedin
    • 홈
    • 방명록
    • 글쓰기
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    springboot
    인프런
    SQL
    oracle
    Java
    방통대
    egov
    토비의스프링부트
    프로그래머스
    전자정부프레임워크
    Spring
    SpringBoot를 이용한 RESTful Web Service 개발
    자바스크립트
    코딩테스트
    QueryDSL
    IT
    RESTful
    JPA
    MSA
    백준
    스프링부트
    넥사크로
    react
    개발자
    프론트엔드
    알고리즘
    토이프로젝트
    기출문제
    운영체제
    에러해결
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
데부한
Spring Data JPA - 메서드 이름으로 쿼리 생성
상단으로

티스토리툴바