Spring Data JPA
QueryDSL
stophyeon
2024. 2. 28. 12:18
728x90
QueryDSL이란
JPA를 사용하다보면 간단한 쿼리문은 쿼리메서드를 사용하지만, 동적쿼리와 복잡한 쿼리문을 JPA에서 사용하기 위해서 쿼리 메서드를 사용하는 것은 한계가 있습니다. 이 때 JPQL과 QueryDSL을 사용해서 쿼리문을 생성합니다.
동적 쿼리문은 사용자의 요청,프로그램의 상황에 따라 쿼리문이 변경되는 쿼리문입니다.
사용자의 입력에 따라 Query문의 where절이 변경되는 것입니다.
QueryDSL은 메서드 형식으로 Query문을 생성하는 방식입니다.
QueryDSL을 사용하기 위해서는 의존성을 추가해준뒤 아래 사진과 같이 JPAQueryFactory를 Bean등록을 해주는 것이 좋습니다. Bean으로 등록을 하지 않는다면 사용할 Class 내부마다 개발자가 직접 생성해줘야 하기 때문입니다.
QueryDSL 사용법
Bean으로 등록했다면 QueryDSL을 사용하는 2가지 방법중 선택해서 사용하면 됩니다.
QuerydslRepositorySupport
QueryDSLRepositorySupport를 상속받은 클래스는 QueryDSL을 사용할 수 있습니다.
단점으로는 매번 Support 클래스를 상속받아야하고, super를 통해서 Support 클래스에 entity를 등록해줘야 합니다.
또한, JPARepository의 기능을 사용하는 인터페이스를 따로 구현해야하는 문제가 있습니다.
Spring Data Jpa Custom Repository
제가 주로 사용하는 방법입니다.
실제로 사용할 Repository에 JPARepository와 QueryDSL을 사용하는 Repository를 상속하는 것입니다.
이 때 다중 상속을 하기 위해서 QueryDSL을 사용하는 Repository는 메서드를 선언하는 인터페이스와 메서드를 QueryDSL로 정의하는 클래스부로 나눠서 사욯합니다.
이 방법의 장점으로는 Repository 1개만 주입받아 QueryDSL과 QueryMethod를 사용할 수 있다는 것입니다.
하지만 인터페이스를 구현한 클래스가 아닌 인터페이스를 상속받은것으로 정의된 메서드를 사용할 수 없습니다.
이러한 문제를 해결하기 위해서 QueryDSL을 선언한 인터페이스 명에 Impl(implements)를 붙인 이름으로
클래스를 만든다면 인터페이스를 상속해도 Impl 클래스에서 정의한 메서드를 사용할 수 있습니다.