@Query
JPQL(Java Persistence Query Language) 객체지향 쿼리를 입력하여 처리
쿼리 내에 데이터베이스의 테이블 대신 엔티티 클래스와 멤버 변수를 이용해서 작성.
where구문과 그에 맞는 파라미터들을 처리할 경우
?1, ?2 와 같이 1부터 시작하는 파라미터의 순서를 이용하는 방식
:(파라미터 이름)을 활용하는 방식
#{ }로 자바 빈 스타일을 이용하는 방식
이 있다.
:(파라미터 이름)을 사용할 때 여러 개의 파라미터를 전달하여 복잡해질 수 있다고 생각이 될 경우
:#을 이용하여 객체를 사용할 수 있다.
@Query를 이용하는데 리턴 타입을 Page<엔티티 타입>으로 처리할 경우 별도의 countQuery라는 속성을 적용해 주고 Pageable타입의 파라미터를 전달해주면 된다.
기존의 쿼리 메서드의 경우 리턴타입에 엔티티 타입만 사용할 수 있었으나 @Query를 사용할 경우 Object []의 형태로 원하는 데이터만 선별하여 추출할 수 있다는 점이다. JPQL을 사용할 때 JOIN이나 GROUP BY를 이용하여 적당한 엔티티 타입이 존재하지 않을 경우 Obect [] 타입을 리턴 타입으로 지정할 수 있다.
@Query를 사용할 떄 NativeSQL을 이용하여 데이터베이스 고유의 SQL 구문을 그대로 활용할 수도 있다. JPA의 dialect를 이용하여 데이터베이스에 독립적으로 구현이 가능하다는 장점을 잃어버리기는 하지만 복잡한 JOIN 구문 등을 처리하기 위해서 어쩔 수 없는 선택을 하는 경우에 사용한다. 이 경우에는 @Query에 nativeQuery = true 속성 값을 추가하면 value값에 일반 SQL을 그대로 사용할 수 있다.
Querydsl
Querydsl은 JPQL 사용 중 동적인 쿼리를 처리하기 위하여 사용한다. 이때 기존의 엔티티 클래스를 그대로 사용하는 것이 아닌 Q도메인을 이용하여야 한다.
이는 Querydsl 라이브러리를 이용해서 엔티티 클래스를 Q도메인 클래스로 변환하는 방식으로 만들어지기 때문에 추가적인 설정을 해주어야 한다.
Querydsl 설정 순서
build.gradle에 설정 추가 -> gradle 갱신 -> compileQuerydsl 실행 -> Q도메인 클래스 확인
Q도메인은 자동으로 생성되는 것이고 개발자가 직접 건드리지 않는다는 것을 명심하자.
이후 Repository인터페이스에 QuerydslPredicateExecutor라는 인터페이스를 추가로 상속해준다.
Querydsl의 사용법
BooleanBuilder 생성 -> Predicate 타입의 함수 생성 -> BooleanBuilder에 작성된 Predicate를 추가하고 실행