콘텐츠기획자의 IT입문서

Spring Data JPA - 쿼리 메서드 & @Query 본문

Spring

Spring Data JPA - 쿼리 메서드 & @Query

lazy_cat 2021. 9. 6. 14:02

JapaRepository가 제공하지 않는 기능을 사용할때 사용자 정의 쿼리를 사용.

 

사용자 정의 쿼리란?

JPA가 자동생성하는 쿼리가 아니라

사용자가 정의한대로 쿼리가 생성되거나, 데이터베이스에 종속적인 Native Query가 생성되는 것.

 

사용자 정의 쿼리를 사용하는 방법

  • 쿼리 메서드
  • @Query
  • Named Query

쿼리 메서드를 사용할때 불편한 경우가 있으므로
일반적으로 간단한 처리의 경우 쿼리 메서드 이용하고, 대체로 @Query를 이용한다.

 

1. 쿼리 메서드

메서드의 이름 자체가 쿼리의 구문으로 처리되는 기능. 

  • 원하는 기능을 수행할 쿼리가 자동 생성되게 할 수 있음.
  • 하지만 조인이나 복잡한 조건을 처리할 경우 불편할 때가 있음.
  • Spring Data JPA에서 정해놓은 네이밍 컨벤션을 지키면 JPA가 해당 메서드 이름을 분석해서 적절한 JPQL을 구성함.
    * JPQL : JPA가 지원하는 쿼리 방법 중 하나. 엔티티 객체를 대상으로 쿼리를 질의 (SQL키워드와 유사함)
    * SQL : 데이터베이스 테이블을 대상으로 쿼리를 질의

    - select 작업 : List 타입이나 배열을 이용할 수 있다.
    - Pageable 파라미터를 결합하여 사용 가능. (파라미터에 pageable 타입을 넣는 경우, 무조건 Page<E>타입)
    - deleteBy~ : 특정 조건에 맞는 데이터를 삭제할 수 있음.
      이 경우 test code에는 @Transactional @Commit 사용되는데, JPA의 객체 변경감지는 transacton이 commit 될 때, 작동하기 때문.

 

2. @Query

실행할 메서드 위에 정적 쿼리를 작성하여 사용.

public interface MemoRepository extends JpaRepository<Memo, Long>{
	@Query("쿼리문")
	List<Memo> methodName();	
}
  • 메서드 이름과 상관없이 어노테이션을 통해 원하는 처리가 가능하다.
  • 필요한 데이터만 선별적으로 추출하는 기능 있음.
  • 데이터베이스에 맞는 순수한 SQL(Native SQL) 사용 기능 있음.
  • insert, update, delete와 같은 select가 아닌 DML 등을 처리하는 기능 있음. (이때 @Modifying과 함께 사용해야 함)

파라미터 바인딩

methodName() 에 들어갈 파라미터를 쿼리문에 넣는 것을 말한다.
* 파라미터 : 외부로부터 투입되는 데이터.

기본은 위치기반이지만 위치기반(=?1), 이름기반(=:name) 바인딩 모두 지원한다.

가독성 & 유지보수의 편리를 위해 이름기반으로 하는 것이 좋음!

  1. 위치 기반 : select m from Member m where m.username = ?1
  2. 이름 기반 : select m from Member m where m.username = :name

이름 기반으로 파라미터 바인딩을 하고 파라미터에 @Param("") 어노테이션으로 메서드에 들어오는 파라미터가 어떤 이름으로 지정될 지 정할 수 있다.

@Transactional
@Modifying
@Query("update Memo m set m.memoText = :memoText where m.mno = :mno ")
int updateMemoText(@Param("mno") Long mno, @Param("memoText") String memoText );

 

3. Named Query

쿼리에 이름을 부여하는 방법.
컴파일 할 때 타입 체크, 가독성 등에 문제가 발생하므로 대체로 @Query 사용한다.

 

 

 

Comments