한두 개 정도의 조건을 이용해서 상품 데이터를 조회한다면 쿼리 메소드를 사용하면 되지만 조건이 많아진다면 쿼리 메소드의 이름이 매우 길어지게 된다. 그럴 경우 오히려 그 메소드가 어떻게 동작하는지 파악하기 쉽지 않다. 따라서 복잡한 쿼리를 다루기 위해 @Query를 사용한다.
Spring Data JPA에서 제공하는 @Query 어노테이션을 이용하면 SQL과 유사한 JPQL이라는 객체지향 쿼리 언어를 통해 복잡한 쿼리도 처리가 가능하다. JPQL은 엔티티 객체를 대상으로 쿼리를 수행한다.
만약 기존의 데이터베이스에서 사용하던 쿼리를 그대로 사용해야 할 때는 @Query의 nativeQuery 속성을 사용하면 된다. 하지만 특정 데이터베이스에 종속되는 쿼리문을 사용하는 것이기 때문에 데이터베이스에 대해 독립적이라는 장점을 잃어버리게 된다.
@Query 어노테이션을 이용한 방법에서의 단점 : @Query 어노테이션 안에서 JPQL문법으로 문자열을 입력하기 때문에 잘못 입력하면 컴파일 시점에 에러를 발견할 수 없음 -> 이를 보완하기 위해 Querydsl 사용
Querydsl 장점