스프링

[Spring] @Query 어노테이션에 대해 알아보자

zumsim 2023. 1. 9. 23:45
728x90
반응형

 

@Query 어노테이션


Spring Data JPA가 제공하는 쿼리 메소드는 간단한 검색 기능의 경우는 편리하게 사용 할 수 있지만 조인이나 복잡한 조건을 처리해야 하는 경우엔 불편할 때가 많다.

@Query의 경우 메서드의 이름과 상관없이 메서드에 추가한 어노테이션을 통해 처리가 가능하다.

@Query의 value는 JPQL(Java Persistence Query Language)로 작성하는데 흔히 '객체지향 쿼리'라 불리는 구문들이다.

 

@Query로 할 수 있는 작업들
- 필요한 데이터만 선별적으로 추출하는 기능이 가능
- 데이터베이스에 맞는 순수한 SQL을 사용하는 기능
- insert, update, delete와 같은 select가 아닌 DML을 처리하는 기능(@Modifying과 함께 사용)

 

간단한 예제를 통해 살펴보자.

@Query("select m from Memo m order by m.mno desc")
List<Memo> getListDesc();
cs

테이블명이 아니라 엔티티 클래스와 멤버 변수를 이용해 작성하여 사용 할 수 있다.

 

@Query의 파라미터 바인딩
@Query의 경우 직접 SQL과 유사한 상태로 작성되므로 where 구문과 그에 맞는 파라미터들을 아래와 같은 방식을 사용하여 처리할 때가 많다.
- '?1, ?2' 와 1부터 시작하는 파라미터의 순서를 이용하는 방식
- ':xxx' 와 같이 ':파라미터 이름' 을 활용하는 방식
- ':#{}' 과 같이 자바 빈 스타일을 이용하는 방식

 

예제

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

 

 

@Query와 페이징 처리
쿼리 메서드와 마찬가지로 @Query의 경우도 Pageable 타입의 파라미터를 적용하여 작성할 수 있다.
리턴 타입을 Page<엔티티 타입>으로 지정하는 경우 count를 처리하는 쿼리를 적용할 수 있다.
별도의 countQuery라는 속성을 적용해 주고 Pageable 타입의 파라미터를 전달하면 된다.

 

예제

@Query(value="select m from Memo m where m.mno > :mno",
        countQuery="select count(m) from Memo m where m.mno > :mno")
Page<Memo> getListWithQuery(Long mno, Pageable pageable);
cs

 

Object[] 리턴
@Query는 쿼리 메소드와는 다르게 필요한 데이터만을 Object[]의 형태로 추출 할 수 있다.
적당한 엔티티 타입이 존재하지 않는 경우에서 유용하게 Object[]를 리턴 타입으로 지정할 수 있다.

 

예제

@Query(value="select m.mno, m.memoText, CURRENT_DATE from Memo m where m.mno > :mno",
        countQuery = "select count(m) from Memo m where m.mno > :mno")
Page<Object[]> getListWithQueryObject(Long mno, Pageable pageable);
cs

 

 

Native SQL 처리
@Query의 강력한 기능은 데이터베이스 고유의 SQL 구문을 '그대로' 활용이 가능하다는 것이다.
JPA 자체가 독립적으로 구현이 가능하다는 장점을 잃긴하지만 경우에 따라서 사용한다.
@Query의 nativeQuery 속성값을 true로 지정하고 사용하면 된다.

 

예제

@Query(value="select * from tbl_memo where mno > 0", nativeQuery = true)
List<Object[]> getNativeResult();
cs
728x90
반응형