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에서 쿼리 타입 클래스를 별도로 생성하는 이유는 무엇일까???
- 타입 안정성 : 쿼리 타입 클래스를 사용하여 컴파일 시점에 타입 검사를 수행할 수 있다. 이는 오타나 잘못된 속성 참조로 인한 오류를 컴파일 단계에서 확인할 수 있는 장점을 제공한다. 쿼리 타입 클래스를 사용하면 IDE의 자동완성 기능을 활용하여 쿼리 작성 시 올바른 속성과 메서드를 쉽게 찾을 수 있다.
- 엔티티와의 분리 : 쿼리 타입 클래스를 별도로 생성하면 엔티티 클래스와의 의존성을 분리할 수 있다.
엔티티 클래스는 주로 영속성과 관련된 역할을 담당하고, 쿼리 타입 클래스는 쿼리 작성과 관련된 역할을 담당한다.
이를 통해 도메인 모델과 쿼리 모델을 분리하여 더 유연하고 확장 가능한 코드를 작성할 수 있다. - 성능 최적화 : 쿼리 타입 클래스는 필요한 속성만을 선택적으로 가져오기 때문에 필요한 데이터만 로드하여 성능을 최적화할 수 있다. 엔티티 클래스를 사용할 경우 모든 속성을 가져오게 되어 불필요한 데이터 로딩과 메모리 사용이 발생할 수 있다.
컴파일 시점과 런타임 시점에서 하는 것의 차이가 무엇일까??
💚컴파일 시점(Compile Time)
- 소스 코드를 기계어나 실행 가능한 바이너리 코드로 변환하는 과정
- 컴파일러는 소스 코드를 분석하고 문법 오류를 검출하여, 중간 코드 또는 바이트 코드로 변환
- 이 과정은 소스 코드를 실행하기 전에 발생
- 컴파일 시점에 문제가 있는 경우, 컴파일 오류가 발생하고 소스 코드를 실행할 수 없다.
💚런타임 시점(Runtime Time)
- 컴파일된 코드 또는 바이트 코드가 실행되는 시점 (컴파일 시점 그 뒤)
- 프로그램이 실제로 실행되고 동작하는 시점
- 런타임 환경에서는 코드가 처리되고 메모리에 로드되며, 데이터와 상호 작용한다.
- 런타임 시점에서는 프로그램의 동작, 데이터의 변경, 예외 처리 등이 발생.
컴파일 시점의 검사를 통해 오류를 사전에 확인하고, 런타임 시점에서 발생할 수 있는 오류를 최소화하고 안정성을 향상한다.
동적/정적으로 쿼리를 작성하는 것의 의미가 뭐고 차이는 무엇일까???
💚동적으로 쿼리를 작성(Dynamic Query)
- 프로그램 런타임 중에 조건에 따라 쿼리의 구성 요소를 변경하거나 추가할 수 있다.
- 주로 조건절, 정렬, 필더링 등 쿼리의 일부를 동적으로 결정하는 경우에 사용
- 동적으로 쿼리를 작성하는 것은 실행 시점에 쿼리의 일부 또는 전체를 동적으로 생성하는 방식
💚정적으로 쿼리를 작성(Static Query)
- 정적으로 쿼리를 작성하는 것은 미리 작성된 쿼리를 소스 코드에 포함시키는 방식
- 쿼리는 컴파일 시점에 소스 코드에 포함되어 실행 시점에는 변경되지 않는다.
동적으로 쿼리를 작성하는 경우에는 프로그램 런타임 중에 쿼리를 유연하게 구성할 수 있으며,
다양한 상황에 대처하기 쉽다.
반면에 정적으로 쿼리를 작성하는 경우에는 쿼리의 구조가 고정되어 있으며, 재사용성과 컴파일 타임 오류 검사 등의 장점을 가진다.
(무조건 동적 쿼리가 좋은 줄 알았는데 각각의 장점이 있다는 점을 알게 되었다.)
'개발공부 > spring boot' 카테고리의 다른 글
Test code - MockMvc란? (0) | 2024.05.23 |
---|---|
[java] Optional - Optional의 매핑 메소드 (1) | 2023.10.24 |
spring boot - Querydsl, DSL(Domain-Specific Language)이란?? (0) | 2023.07.15 |
JWT_인증/인가 (0) | 2023.06.05 |
💡깨달음 - entity클래스가 있는데 DTO가 필요한가? (0) | 2023.05.10 |