[Spring Data JPA] - Query method 기능 ①

홍정완·2022년 7월 10일
0

JPA

목록 보기
16/38
post-thumbnail

쿼리 메서드 기능 3가지


✅ 메서드 이름으로 쿼리 생성

✅ 메서드 이름으로 JPA NamedQuery 호출

@Query 어노테이션을 사용해서 Repository 인터페이스에 쿼리 직접 정의


오늘은 메서드 이름으로 쿼리 생성NamedQuery에 대해 정리해 보자.




메서드 이름으로 쿼리 생성


  • 메서드 이름을 분석해서 JPQL 쿼리 실행

    • 이름과 나이를 기준으로 회원을 조회하려면?



순수 JPA로 개발할 경우


// 순수 JPA Repository

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



Spring Data JPA로 개발할 경우


// Spring Data JPA

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

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



Query method 필터 조건


Spring Data JPA 공식 문서




Spring Data JPA가 제공하는 Query method 기능


  • 조회 : find…By, read…By, query…By get…By,
    • 참고 링크
    • ex) findHelloBy 처럼 ...에 식별하기 위한 내용(설명)이 들어가도 된다.

  • COUNT : count…By 반환 타입 long

  • EXISTS : exists…By 반환 타입 boolean

  • 삭제 : delete…By, remove…By 반환 타입 long

  • DISTINCT : findDistinct, findMemberDistinctBy




  • 메서드 이름으로 쿼리를 생성하는 기능은 엔티티의 필드명이 변경되면,

    • 인터페이스에 정의한 메서드 이름도 꼭 함께 변경해야 한다.

그렇지 않으면 애플리케이션을 시작하는 시점에 오류가 발생


  • 애플리케이션 로딩 시점오류 인지 👉 스프링 데이터 JPA의 매우 큰 장점



NamedQuery


  • JPA의 NamedQuery를 호출할 수 있음



순수 JPA로 개발할 경우


// @NamedQuery 어노테이션으로 NamedQuery 정의

@Entity
@NamedQuery(
 	name="Member.findByUsername",
 	query="select m from Member m where m.username = :username")
public class Member {
	...
}

// JPA를 직접 사용해서 NamedQuery 호출

public class MemberRepository {

	 public List<Member> findByUsername(String username) {
		 ...
		 List<Member> resultList =
			 em.createNamedQuery("Member.findByUsername", Member.class)
 				.setParameter("username", username)
 				.getResultList();
 	}
} 



Spring Data JPA로 개발할 경우


// 스프링 데이터 JPA로 NamedQuery 사용

public interface MemberRepository extends JpaRepository<Member, Long> { 

	@Query(name = "Member.findByUsername")
	List<Member> findByUsername(@Param("username") String username);
}

  • @Query를 생략하고 메서드 이름만으로 Named 쿼리를 호출할 수 있다.

// Spring Data JPA NamedQuery 호출

public interface MemberRepository extends JpaRepository<Member, Long> { 

	 List<Member> findByUsername(@Param("username") String username);
}

  • 스프링 데이터 JPA는 선언한 "도메인 클래스 + .(점) + 메서드 이름"으로 Named 쿼리를 찾아서 실행

  • 만약 실행할 Named 쿼리가 없으면 메서드 이름으로 쿼리 생성 전략을 사용

  • 필요하면 전략을 변경할 수 있지만 권장하지 않는다.



✅ 스프링 데이터 JPA를 사용하면 실무에서 Named Query를 직접 등록해서 사용하는 일은 드물다.

대신 @Query를 사용해서 Repository 메서드에 쿼리를 직접 정의한다.

profile
습관이 전부다.

0개의 댓글