JPA 를 사용하면서 반복적으로 작성하던 CRUD 쿼리문에서 벗어날 수 있었다. 특정 테이블에 대해 CRUD 로직은 기본적으로 제공하는 기능이기 때문에 간단한 어플리케이션에서는 문제가 해결될 수 있으나 기능을 확장하려 한다면 부족할 수밖에 없다. 기본적으로 제공하는 CRUD 이외에 개발자가 원하는 쿼리문을 별도로 작성할 수 있는데 그것이 바로 JPQL 이다. 하지만 JPQL 은 쿼리문을 문자열로 입력한다는 특징이 있다. 문자열로 작성한다면 오타가 발생할 수도 있고 SQL 문법상의 오류가 발생한다는 단점이 있다. 문자열로 작성했기 때문에 스프링 어플리케이션은 이제 잘못작성했는지 컴파일 시점에는 알 수가 없다. 실제로 로직이 수행되어야 잘못되었다는 것을 알 수 있다.

JPQL 의 단점을 해결하기 위해 QueryDSL 을 사용할 수 있다. QueryDSL 은 JPA 에서 제공하는 기능 이외에 다른 기능에 대한 쿼리문을 작성해야 할 때 쿼리문을 동적으로 생성해준다. SQL 문법에서 사용하는 키워드와 유사한 메서드들을 이용하여 쿼리문을 동적으로 작성한다.

쿼리문을 문자열이 아닌 코드로 작성하다보니 위에 언급한 단점이 해결되었다. 쿼리문을 개발자가 직접 작성하는 것이 아니다보니 오타가 발생할 가능성도 줄어들고, 컴파일 시점에 확인 가능하기 때문에 SQL 문법이 발생할 가능성도 낮아진다.

https://ict-nroo.tistory.com/117

https://tecoble.techcourse.co.kr/post/2021-08-08-basic-querydsl/