쿼리 메소드를 사용하면 한두개 정도의 조건을 이용해 상품을 조회할 때
간편하지만 조건이 많아지면 복잡해지기 때문에 이름을 보고 어떻게 동작하는지
해석하는게 더 힘들 수 있다.
복잡한 쿼리를 다루기에 적합한 것은 Spring Data JPA에서 제공하는
@Query 어노테이션을이용하면 SQL과 유사한 JPQL이라는 객체지향 쿼리 언어를 통해
복잡한 쿼리도 처리가 가능하다.
SQL과 문법 자체가 유사하기 때문에 기존에 SQL을 사용했다면 더 접근이 쉬울 것이다.
SQL의 경우 데이터 베이스의 테이블을 대상으로 쿼리를 수행하고 JPQL은 엔티티 객체를
대상으로 쿼리를 수행한다. 테이블이 아닌 객체를 대상을 검색하는 객체지향 쿼리다.
SQL : DB 테이블 대상 쿼리
JPQL : 엔티티 객체를 대상으로 쿼리
JPQL은 SQL 을 추상화 해서 사용하기 떄문에 특정 데이터베이스 SQL에 의존하지 않는다.
즉 JPQL로 작성을 했다면 데이터베이스가 변경되어도 애플리케이션은 영향을 받지 않는다.
1) 예제
1) @Query("select i from Item i where i.itemDetail like %:itemDetail% order by i.price desc ")
2) List findByItemDetail(@Param("itemDetail") String itemDetail);
1) @Query 어노테이션 안에 JPQL로 작성한 쿼리문을 넣어준다. from 뒤에는 엔티티 클래스(Item)로 작성한 Item을 지정해주었고, Item으로부터 데이터를 select 하겠다는 의미이다.
2) 파라미터 @Param 어노테이션을 이용하여 파라미터로 넘어온 값을 JPQL에 들어갈 변수로 지정해줄 수 있다. 현재는 itemDetail 변수를 "like % %" 사이에 ":itemDetail"로 값이 들어가도록 작성한 것
@Param 어노테이션을 이용하여 변수를 JPQL에 전달하는 대신 파라미터의 순서를 이용해 전달해 줄 수 있다. 그럴 때 ':itemDetail' 대신 첫 번째 파라미터를 전달하겠다는 '?1' 이라는 표현을 사용하면 된다. 허나 파라미터의 순서가 달라지면 해당 쿼리문이 제대로 동작하지 않을 수 있기 때문에 좀더 명시적인 방법인 @Param 어노테이션을 이용하는 방법을 추천한다.