특정한 범위의 객체를 검색하거나, like 처리가 필요한 경우, 여러 검색 조건이 필요한 경우를 처리하기 위해 Spring Data JPA가 제공하는 방법
- 쿼리 메서드 : 메서드의 이름 자체가 쿼리 구문으로 처리되는 기능
@Query: SQL과 유사하게 엔티티 클래스의 정보를 이용해서 쿼리를 작성하는 기능- Querydsl 등의 동적 쿼리 처리 기능
쿼리 메서드는 말 그대로 메서드의 이름 자체가 질의문이 되는 기능이다. 주로 findBy나 getBy로 시작하고 이후에 필요한 필드 조건이나 And, Or와 같은 키워드를 이용해서 메서드의 이름 자체로 질의 조건을 만들어 낸다.
쿼리 메서드는 사용하는 키워드에 따라 파라미터의 개수가 결정된다. 쿼리 메서드의 리턴 타입도 상당히 자유롭다. 가장 중요한 내용은 다음과 같다.
// interface
List<Memo> findByMnoBetweenOrderByMnoDesc(Long from, Long to);
// test code
@Test
public void testQueryMethods() {
List<Memo> list = memoRepository.findByMnoBetweenOrderByMnoDesc(70L, 80L);
for (Memo memo : list) {
System.out.println(memo);
}
}
@Query의 경우 메서드 이름과 상관없이 메서드에 추가한 어노테이션을 통해 원하는 처리가 가능해진다. @Query의 value는 JPQL(Java Persistence Query Language)로 작성하는데 흔히 객체지향 쿼리라고 불리는 구문들이다.
@Modifying과 함께 사용)객체지향 쿼리는 테이블 대신에 엔티티 클래스를 이용하고, 테이블의 칼럼 대신에 클래스에 선언된 필드를 이용해서 작성한다. JPQL은 SQL과 상당히 유사하기 때문에 간단한 기능을 제작하는 경우에는 추가적인 학습 없이도 적용이 가능하다.
@Query의 경우 직접 SQL과 유사한 형태로 작성되기 때문에 where 구문과 그에 맞는 파라미터들을 처리할 떄가 많다.
?1, ?2 와 같이 1부터 시작하는 파라미터의 순서를 이용하는 방식:xxx 와 같이 :파라미터 이름을 활용하는 방법#{ } 와 같이 자바 빈 스타일을 이용하는 방식@Query 장점 중의 하나는 쿼리 메서드의 경우에는 엔티티 타입의 데이터만을 추출하지만, @Query를 이용하는 경우에는 현재 필요한 데이터만을 Object[] 형태로 선별적으로 추출할 수 있다는 점이다. JPQL을 이용할 때 경우에 따라서 JOIN이나 GROUP BY 등을 이용하는 경우가 종종 있는데, 이럴 때는 적당한 엔티티 타입이 존재하지 않는 경우가 많기 때문에 이런 상황에서 지정할 수 있다.