개발공부/spring boot

spring boot - JPQL과 Querydsl의 개념과 차이점 파헤치기🕵🏻

기억지기 개발자 2023. 7. 12. 13:50

JPQL과 Querydsl의 차이점은 무엇인가?

💚JPQL (Java Persistence Query Language)

  • JPQL은 JPA에서 제공하는 객체 지향 쿼리 언어이다.
  • 문자열 기반의 쿼리를 작성하며, 엔티티와 속성에 대한 문자열 경로를 사용하여 쿼리를 작성
  • JPQL은 JPA의 표준 인터페이스에 의해 정의되었기 때문에 JPQL 쿼리는 어떤 JPA 구현체를 사용하더라도 동일하게 작동. 즉, JPQL 쿼리를 작성한 후 Hibernate, EclipseLink, OpenJPA 등의 JPA 구현체를 사용하여 실행하면 결과는 동일하게 나온다.
  • JPQL 쿼리를 특정 JPA 구현체에 종속되지 않고 이식성 있게 작성할 수 있다는 장점이 있다.
  • JPQL은 애플리케이션의 엔티티 클래스와 관련하여 작동하며, 쿼리 실행 전에 문법 검사가 수행된다.

💚Querydsl

  • 코드 생성 도구를 사용하여 컴파일 시점에 쿼리 타입 클래스를 생성한다. 이 클래스를 사용하여 쿼리를 작성
  • Querydsl은 JPA, SQL, 몽고DB 등 다양한 데이터베이스 및 데이터 소스와 함께 작동할 수 있다.
  • 타입 안정성을 제공하므로 컴파일 시점에서 오류를 잡을 수 있고, IDE의 자동완성 및 타입 검사 기능을 활용할 수 있다.
  • JPQL보다 더 풍부한 쿼리 작성 기능을 제공하며, 복잡한 조인, 서브쿼리, 동적 조건 등을 쉽게 처리할  수 있다.

JPQL은 문자열 기반의 쿼리 작성 방식이기 때문에 문법 오류가 런타임 시점에서 발견될 수 있다. 
반면에 Querydsl은 타입 안정성을 제공하고 IDE에서 컴파일 시점에 오류를 확인할 수 있으므로 더 안전하고 유지보수가 용이하다. 또한 Querydsl은 복잡한 쿼리 작성을 지원하고 동적으로 쿼리를 구성하는 데 용이하다.

Querydsl에서 쿼리 타입 클래스를 별도로 생성하는 이유는 무엇일까???

  1. 타입 안정성 : 쿼리 타입 클래스를 사용하여 컴파일 시점에 타입 검사를 수행할 수 있다.  이는 오타나 잘못된 속성 참조로 인한 오류를 컴파일 단계에서 확인할 수 있는 장점을 제공한다. 쿼리 타입 클래스를 사용하면 IDE의 자동완성 기능을 활용하여 쿼리 작성 시 올바른 속성과 메서드를 쉽게 찾을 수 있다.
  2. 엔티티와의 분리 : 쿼리 타입 클래스를 별도로 생성하면 엔티티 클래스와의 의존성을 분리할 수 있다. 
    엔티티 클래스는 주로 영속성과 관련된 역할을 담당하고, 쿼리 타입 클래스는 쿼리 작성과 관련된 역할을 담당한다. 
    이를 통해 도메인 모델과 쿼리 모델을 분리하여 더 유연하고 확장 가능한 코드를 작성할 수 있다.
  3. 성능 최적화 : 쿼리 타입 클래스는 필요한 속성만을 선택적으로 가져오기 때문에 필요한 데이터만 로드하여 성능을 최적화할 수  있다. 엔티티 클래스를 사용할 경우 모든 속성을 가져오게 되어 불필요한 데이터 로딩과 메모리 사용이 발생할 수 있다. 

컴파일 시점과 런타임 시점에서 하는 것의 차이가 무엇일까??

💚컴파일 시점(Compile Time)

  • 소스 코드를 기계어나 실행 가능한 바이너리 코드로 변환하는 과정
  • 컴파일러는 소스 코드를 분석하고 문법 오류를 검출하여, 중간 코드 또는 바이트 코드로 변환
  • 이 과정은 소스 코드를 실행하기 전에 발생
  • 컴파일 시점에 문제가 있는 경우, 컴파일 오류가 발생하고 소스 코드를 실행할 수 없다. 

💚런타임 시점(Runtime Time)

  • 컴파일된 코드 또는 바이트 코드가 실행되는 시점 (컴파일 시점 그 뒤)
  • 프로그램이 실제로 실행되고 동작하는 시점
  • 런타임 환경에서는 코드가 처리되고 메모리에 로드되며, 데이터와 상호 작용한다.
  • 런타임 시점에서는 프로그램의 동작, 데이터의 변경, 예외 처리 등이 발생.

컴파일 시점의 검사를 통해 오류를 사전에 확인하고, 런타임 시점에서 발생할 수 있는 오류를 최소화하고 안정성을 향상한다. 

동적/정적으로 쿼리를 작성하는 것의 의미가 뭐고 차이는 무엇일까???

💚동적으로 쿼리를 작성(Dynamic Query)

  • 프로그램 런타임 중에 조건에 따라 쿼리의 구성 요소를 변경하거나 추가할 수 있다.
  • 주로 조건절, 정렬, 필더링 등 쿼리의 일부를 동적으로 결정하는 경우에 사용
  • 동적으로 쿼리를 작성하는 것은 실행 시점에 쿼리의 일부 또는 전체를 동적으로 생성하는 방식

💚정적으로 쿼리를 작성(Static Query)

  • 정적으로 쿼리를 작성하는 것은 미리 작성된 쿼리를 소스 코드에 포함시키는 방식
  • 쿼리는 컴파일 시점에 소스 코드에 포함되어 실행 시점에는 변경되지 않는다.

 


동적으로 쿼리를 작성하는 경우에는 프로그램 런타임 중에 쿼리를 유연하게 구성할 수 있으며, 
다양한 상황에 대처하기 쉽다.
반면에 정적으로 쿼리를 작성하는 경우에는 쿼리의 구조가 고정되어 있으며, 재사용성과 컴파일 타임 오류 검사 등의 장점을 가진다. 

(무조건 동적 쿼리가 좋은 줄 알았는데 각각의 장점이 있다는 점을 알게 되었다.)