QueryDSL, JPQL 너네 뭔데..?

임지훈·2024년 11월 11일
2


QueryDSL, JPQL 너네가 뭔데 날 이렇게 힘들게 하니..
내가 이 두가지를 찾게된 이유는 너무 복잡한 쿼리를 순수 JPA로는 SELECT 할 수 없었기 때문이다.
너네 없었으면 나 플젝 완성 못했어ㅠㅠ
지금부터 이 두가지가 뭔지 알아보자

우선 QueryDSL과 JPQL은 Java에서 데이터베이스 쿼리를 작성하기 위한 두 가지 대표적인 방법이다. Spring Data JPA와 함께 자주 사용되며, 코드에서 직접 쿼리를 작성하여 데이터베이스와 상호작용할 수 있도록 해준다. 이 글에서는 각 방법의 개념과 차이점, 그리고 적절한 사용 상황에 대해 알려주겠다.

QueryDSL

QueryDSL은 Java에서 타입 안정성을 갖춘 SQL 쿼리를 작성할 수 있도록 도와주는 라이브러리이다. 일반적으로 JPA와 함께 사용되며, 도메인 모델 기반으로 쿼리를 생성할 수 있어 코드 작성 시 문법 오류를 방지할 수 있다.

QueryDSL에는 크게 3가지 특징이 있다.
1. 타입 안전성: QueryDSL은 컴파일 시점에 타입을 검사하여 SQL의 컬럼 타입과 코드에서 사용하는 타입 간의 불일치를 방지다.
2. 메서드 체이닝 방식: QueryDSL은 메서드 체이닝 방식을 사용하여 객체지향적으로 쿼리를 작성할 수 있다.
3. 코드 자동 완성: IntelliJ와 같은 IDE에서는 QueryDSL을 통해 작성된 코드를 자동 완성해주어, 개발 생산성을 높여준다.

JPQL

JPQL(Java Persistence Query Language)은 JPA에서 사용하는 객체 지향적 쿼리 언어이다. SQL과 유사하게 동작하지만, 데이터베이스의 테이블이 아닌 엔티티 객체를 대상으로 쿼리를 작성한다. 따라서 JPQL은 JPA의 엔티티 매핑과 깊이 연관되어 있으며, SQL보다 추상화된 구조로, 데이터베이스의 종류에 구애받지 않고 사용할 수 있다.

JPQL에도 크게 3가지 특징이 있다.
1. 객체 지향 쿼리: JPQL은 SQL과 다르게 엔티티 객체를 기준으로 쿼리를 작성한다. 예를 들어, SELECT u FROM User u와 같은 형식으로 엔티티를 직접 조작할 수 있다.
2. SQL 문법과 유사: JPQL은 SQL 문법과 유사하여 기존 SQL에 익숙한 개발자들이 학습하기에 상대적으로 용이하다.
3. 단순한 쿼리 작성: 간단한 조건 조회나 기본적인 CRUD 작업을 위한 쿼리를 작성하기 쉽다.

이렇게 개념을 간단하게 알아봤는데 내가 작성했는데도 무슨 소린지 이해하기 힘드니까, 쉽게 알아볼 수 있게 차이점을 확인해보자.

QueryDSL vs JPQL

표로 만들어서 보여주고 싶은데 숙련도 이슈로 표를 만들줄 모름.. 찾아버렸네ㅎㅎ

구분QueryDSLJPQL
타입 안정성타입 안전성을 제공하여 컴파일 시점에 오류를 방지문자열 기반 쿼리로 컴파일 시점에 오류를 알 수 없음
코드 가독성메서드 체이닝 방식으로 가독성 높음SQL 유사 문법으로 상대적으로 단순함
자동 완성 지원IDE에서 자동 완성 기능 활용 가능문자열 기반이라 자동 완성 지원 어려움
동적 쿼리 작성동적 쿼리를 유연하게 작성 가능복잡한 동적 쿼리 작성이 상대적으로 어려움
학습 곡선새로운 DSL 학습 필요SQL 유사 문법으로 비교적 학습 쉬움

이렇게 두 가지의 차이점을 간단하게 정리해봤는데, 내가 생각하기에는 마지막 두 가지가 제일 중요한 것 같다.
나도 처음에는 그나마 쉬운 JPQL을 사용해서 동적 쿼리를 작성했는데, 생각보다 쿼리가 너무 복잡해서 다시 QueryDSL로 갈아타는 일을 두번하는 불상사를 겪었다.

차이점까지 알아봤으니 마지막으로 어떤 상황에 QueryDSL을 사용해야하고 어떤 상황에 JPQL을 사용해야하는지 알아보자.

결론부터 말하자면 정해져있는건 없다. 그냥 펼쳐진 상황에 원하는 방법을 사용하면 되지만, 그래도 이왕 작성한 김에 더욱 적합한 상황을 알려주겠다.

QueryDSL을 사용하는 경우

  1. 복잡한 동적 쿼리 필요 시: QueryDSL은 동적 쿼리 작성이 용이하며, 조건에 따라 유연하게 쿼리를 구성할 수 있다. 예를 들어, 조건에 따라 WHERE 절을 추가하거나 조인 조건을 동적으로 변경해야 하는 경우 유리하다.
  2. 타입 안정성이 필요한 경우: QueryDSL은 컴파일 시점에 오류를 감지할 수 있어 안정성이 요구되는 프로젝트에서 적합하다. 특히 대규모 프로젝트에서 타입 안전성은 코드 품질 유지에 큰 도움이 된다.
  3. IDE 자동 완성 및 리팩토링 지원: QueryDSL은 IDE의 자동 완성과 리팩토링 기능을 통해 생산성을 높일 수 있어, 장기적인 유지보수가 중요한 프로젝트에 유리하다.

JPQL을 사용하는 경우

  1. 단순한 CRUD 쿼리: JPQL은 기본적인 CRUD 작업에 간편하게 사용할 수 있어, 단순한 쿼리 작성에 적합하다.
  2. 단순한 CRUD 쿼리: JPQL은 기본적인 CRUD 작업에 간편하게 사용할 수 있어, 단순한 쿼리 작성에 적합하다.
  3. SQL 문법에 익숙한 개발자: SQL 문법을 알고 있는 개발자라면 JPQL을 배우는 데 큰 어려움이 없기 때문에 간단한 조건 조회 및 기본적인 엔티티 관리 쿼리에 유리하다.

QueryDSL과 JPQL은 각기 장단점이 있으며, 프로젝트의 요구사항과 쿼리 복잡성에 따라 선택하여 사용하는 것이 좋다. 동적 쿼리와 타입 안정성을 중시한다면 QueryDSL이, 상대적으로 간단하고 SQL에 가까운 쿼리를 선호한다면 JPQL이 적합하다.

나의 첫 포스팅은 여기까지~
블로그를 처음 작성하는거다보니 글을 두서없이 작성한 점 이해바랍니다.
다음에는 더 좋은 내용 더 좋은 글로 돌아오겠습니다. 그럼 이만 빠잉~ 😉

profile
뭐라도 써보는게 아무것도 안하는 것보다 낫겠지ㅎㅎ

0개의 댓글