JPA/Spring Data JPA

[SpringDataJPA] @Query

IT록흐 2023. 7. 11. 20:23
반응형

[SpringDataJPA] 메소드 이름으로 쿼리생성하기

https://lordofkangs.tistory.com/430 [JPA] SpringDataJPA란? Spring Data란? Spring Data란, Spring 프레임워크가 제공하는 추상화된 데이터 접근 기술이다. 데이터베이스나 ORM프레임워크의 종류에 따라 데이터접근방

lordofkangs.tistory.com

 
 
지난 포스팅에서 메소드 이름으로 쿼리를 생성해보았다. 
 
메소드 이름만으로 모든 쿼리를 커버할 수 없다. 복잡하고 자세한 쿼리를 생성하려면 직접 JPQL을 작성해야 한다. 그러나 스프링데이터JPA는 개발자가 직접 리포지토리 구현체를 작성하지 않고 SpringDataJPA가 구현체를 프록시 객체로 생성하여 제공한다. 그러므로 개발자는 스프링데이터JPA가 적절한 구현체 로직을 생성할 수 있도록 원하는 JPQL 쿼리를 넘겨야 한다. 
 
이를 위해,  SpringDataJPA는 @Query 어노테이션을 제공한다. 

public interface MemberRepository extends JpaRepository<Member,Long> {

    @Query("SELECT m FROM Member m WHERE m.username = :username and m.age = :age")
    List<Member> findUser(@Param("username") String usrename, @Param("age") int age);

}

 
@Query 어노테이션에 JPQL을 넣는다. 파라미터도 @Param 어노테이션으로 넣을 수 있다. 
 
@Query의 가장 큰 장점은 컴파일 과정에서 JPQL의 오류를 발견한다는 점이다. @Query는 이름없는 @NamedQuery라고 할 수 있다. @NamedQuery,@Query는 프로그램이 로딩하는 시점에서 JPQL 파싱이 이루어진다. 메소드 호출 시점이 아닌 프로그램 로딩시점에서 JPQL 파싱이 이루어지기 때문에, JPQL 오류를 컴파일 시점에서 잡아낼 수 있다. 
 

public interface MemberRepository extends JpaRepository<Member,Long> {
    // 컬렉션 파라미터 바인딩 ( IN절 )
    @Query("SELECT m FROM Member m WHERE m.username IN :names ")
    List<Member> findByNames(@Param("names") Collection<String> names);
}

 
 
추가로 만약, JPQL에 IN절을 사용하여 쿼리를 생성하는 경우 Collection형식으로 파라미터를 받으면 된다. 
 
이렇듯, @Query는 복잡한 정적쿼리를 사용할 경우 유용하게 사용할 수 있다. 만약 복잡한 동적쿼리를 사용해야 한다면 QueryDSL을 사용해야 한다. 이는 나중에 자세히 다루어 보겠다. 
 
 


 
 

참고자료

실전! 스프링 데이터 JPA - 인프런 | 강의

스프링 데이터 JPA는 기존의 한계를 넘어 마치 마법처럼 리포지토리에 구현 클래스 없이 인터페이스만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 모두 제공합니다.

www.inflearn.com

 

반응형