본문 바로가기
Spring/Data JPA

[Data JPA] 쿼리 메소드 (메소드명만으로 구현이 가능?!)

by 김긍수 2021. 4. 14.

만약, JpaRepository 공통의 기능이 아닌 도메인에 특화된 기능을 만드려면 어떻게 해야할까? 

이건 우리가 구현해야할까? 아니다! 구현하지 않아도 동작한다. => 쿼리메소드 이용하면 가능

 

  • 쿼리메소드 기능 3가지
    • 메소드 이름으로 쿼리를 생성한다.
    • 메소드 이름으로 JPA NamedQuery를 호출한다.
    • @Query 어노테이션을 사용해서 레포지토리 인터페이스에 쿼리를 직접 정의할 수 있다.

 

1. 메소드 이름으로 쿼리를 생성한다.

<<순수JPA>>

원래는 이렇게 쿼리를 짜야한다. 

//회원명과 나이 비교 후 조회
public List<Member> findByUsernameAndAgeGreaterThen(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();
  }

 

<<스프링 데이터 JPA>>

정해진 메소드명을 따르면 JPA가 알아서 구현체를 만들어준다!!!!!!!!

 

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

 

정해진 메소드명 문법에 대해 알고 싶다면?

docs.spring.io/spring-data/jpa/docs/2.4.7/reference/html/#reference

위 주소에서 Query Creation 부분에서 확인할 수 있다.

 

  • 조회 : find...By, read...By, query...By, get...By
    • findHellodBy(); // By뒤에 아무것도 안붙이면 전체 조회가 된다.
  • COUNT : count...By [long]
  • EXISTS : exists...By [boolean]
  • 삭제 : delete...By, remove...By [long]
  • DISTINCT : findDistinct, findMemberDistinctBy : 쿼리에 distinct 넣어짐. 중복제거
  • LIMIT : findFirst3, findFirst, findTop, findTop3, findTop3HelloBy : 개수 지정, limit

- 필드명을 따르므로, 엔티티의 필드명이 변경되면 메소드명도 수정해야한다. 


한가지 문제는 여러 테이블을 조인하려면 메소드명이 너무 길어질 수 있다는 점이다.

그래서 보통 2개정도는 메소드방식을 이용하지만 더 많으면 커스텀 등 다른 방법을 사용할 수 있다.

ex ) JPA NamedQuery, 어노테이션 등

댓글