JPQL(Java Persistence Query Language), QueryDSL, 그리고 쿼리 메소드는 모두 데이터베이스로부터 데이터를 조회하는 방법이지만, 각각의 특성과 사용 방법에는 차이점이 있습니다.
Spring Data JPA에서 제공하는 기능으로, 메소드 이름만으로 JPQL을 생성하고 실행하는 방법입니다.
즉 사용하려는 Repository에 JpaRepostory만 상속해주면 구현까지 자동으로 해줍니다.
형태 : find + ("객체") + By + "변수"

데이터베이스의 테이블을 대상으로 하는 sql과 달리, JPQL은 자바 클래스와 그 속성(필드)를 대상으로 쿼리를 작성한다.
즉, 데이터베이스에 직접 접근하는 것이 아니라 엔티티 객체를 대상으로 쿼리를 작성한다.
엔티티 객체를 대상으로 쿼리를 작성한다?
말이 너무 어려운 것 같아 찾아보았다!
jpql vs sql?

검색어 기능을 위해 구현되었던 코드들이다.
1) 첫 번째 쿼리문은 roadAddress 필드에 주어진 키워드가 포함된 ChildCenter 엔티티를 검색할 수 있다.
2) 두 번째 쿼리문은 centerName 필드에 주어진 키워드가 포함된 ChildCenter 엔티티를 검색하는 쿼리이다.
Spring Data JPA에서 기본적으로 제공하는 제한적 메소드들로는 복잡한 쿼리를 생성하기가 쉽지 않은데요.
하지만, 대안으로 JPQL이나 Native Query를 선택하게 되면 타입 안정성을 손실하게 되어 쿼리에 문제가 있어도 추적이 어렵게 됩니다.
Querydsl JPA는 타입 안정성을 보장하며 복잡한 쿼리를 다룰 수 있도록 돕는 프레임워크입니다
실제 프로젝트를 작성하게 되면 db 탐색에 있어서 간단한 조건들을 요구하진 않는다.
많은 join을 거치는 경우도 있을 것이고, 많은 필터도 사용해야 할 때가 있다.
그런데 이런 경우 jpql을 사용한다면? 아주 큰 문제점이 있다.
필터는 "선택적"이다.
필터의 선택지는 여러개이고, 조건에 포함되지 않는 필터는 고려대상이 아니기에 db 조회 시 쿼리에 포함될 필요가 없다.
but.. 쿼리를 직접 작성하게 된다면 해당 필터가 포함되는 경우/포함되지 않는 경우 2가지로 작성해야 한다.
위와 같은 작업을 하게 되면 N개 필터에 대해 2^N개 쿼리가 생성되게 된다.
이렇게 "동적 쿼리" 를 구성해야 하는 경우 가장 효과적인 것이 queryDsl 이다.
동적 쿼리?
실행 시점 조건에 따라 쿼리의 내용이 동적으로 변경할 수 있는 쿼리이다.


Q클래스?
링크 고고
(없음ㅋ)
@Query 어노테이션은 명시적인 JPQL을 작성할 수 있게 해주지만, 쿼리가 복잡해지면 가독성이나 유지보수 측면에서 한계가 있을 수 있다. 이런 경우에 QueryDSL을 사용하면 좀 더 강력하고 유연한 쿼리를 작성할 수 있다.
https://velog.io/@jung-min-ju/queryDsl
참고