Spring Boot QueryDSL

BackEnd_Ash.log·2023년 8월 10일
0

자바스터디

목록 보기
19/19

Query DSL 이 뭔가?

QueryDSL은 동적 쿼리를 생성할 때 유용한 프레임워크입니다. 일반적인 JPA의 Criteria API는 사용하기 복잡하고 타입 안정성이 부족한 반면, QueryDSL은 여러 장점을 제공합니다.

장점

  1. 타입 세이프 (Type-Safe): QueryDSL 쿼리는 컴파일 시점에 타입 체크가 되므로, 잘못된 쿼리나 필드 이름을 사용하면 컴파일 오류가 발생합니다.
    이로 인해 런타임에서 쿼리 오류가 발생할 가능성이 크게 줄어듭니다.

  2. 코드 자동완성: IDE에서 QueryDSL 코드를 작성할 때, 필드 이름이나 메서드에 대한 자동완성을 사용할 수 있습니다.
    이는 개발 속도를 향상시키고 오류를 줄여줍니다.

  3. 동적 쿼리 작성의 용이성: 전통적인 JPA Criteria API보다 더 간결하고 가독성이 좋은 쿼리를 작성할 수 있습니다.
    특히 복잡한 조건이나 동적으로 쿼리 조건이 변화하는 경우에 QueryDSL은 매우 유용합니다.

  4. 다양한 백엔드 지원: QueryDSL은 JPA 뿐만 아니라 JDO, SQL, Lucene, Hibernate Search, MongoDB 등 다양한 백엔드를 지원합니다.

  5. 커스텀 함수와 확장성: 사용자 정의 함수나 복잡한 쿼리 로직도 쉽게 추가할 수 있습니다.

  6. 읽기 쉬운 문법: QueryDSL의 체인 방식의 문법은 SQL과 유사하여, SQL을 알고 있는 개발자들이 쉽게 이해하고 사용할 수 있습니다.

  7. 통합 및 표준화: 여러 저장소나 플랫폼에 대한 쿼리를 통합하고 표준화된 방식으로 작성할 수 있어, 여러 백엔드에 걸친 쿼리 로직의 일관성을 유지하는 데 도움이 됩니다.

이러한 이유로 많은 자바 기반의 애플리케이션에서 QueryDSL은 데이터 액세스 및 쿼리 구성의 주요 선택사항 중 하나로 자리 잡았습니다.

단점

QueryDSL은 많은 장점이 있지만, 모든 기술과 도구처럼 단점 또한 존재합니다.

  1. 학습 곡선: JPA와 비교했을 때, QueryDSL은 추가적인 학습이 필요합니다. 특히, JPA를 아직 익히지 않은 개발자가 동시에 QueryDSL을 배우려고 할 때 학습 곡선이 높아질 수 있습니다.

  2. 설정과 관리: QueryDSL을 프로젝트에 통합하기 위해서는 추가적인 설정과 의존성 관리가 필요하며, Q 클래스 생성을 위한 빌드 플러그인 설정 등이 필요합니다.

  3. Q 클래스 생성 오버헤드: 엔터티 또는 데이터 모델이 변경될 때마다 Q 클래스를 다시 생성해야 합니다. 이로 인해 프로젝트의 빌드 시간이 증가할 수 있습니다.

  4. 포트 가능성 문제: QueryDSL을 사용하면서 특정 데이터베이스에 특화된 기능을 사용할 경우, 다른 데이터베이스로의 마이그레이션에 어려움이 생길 수 있습니다.

  5. 다른 기술 스택과의 호환성: 특정 프로젝트나 팀에서 이미 다른 쿼리 생성 도구나 기술 스택을 사용하고 있다면, QueryDSL을 도입하는 것이 꼭 최적의 선택이 아닐 수 있습니다.

  6. 복잡성: 간단한 쿼리의 경우, JPA의 JPQL이나 기본 메소드가 더 간결하고 직관적일 수 있습니다. QueryDSL은 복잡한 동적 쿼리에는 뛰어나지만, 간단한 쿼리에서는 그만큼의 이점을 제공하지 않을 수 있습니다.

  7. 커뮤니티 및 지원: 인기 있는 프레임워크에 비해, QueryDSL의 커뮤니티는 상대적으로 작을 수 있으며, 이는 문제 해결 또는 지원 요청 시 지연이 발생할 수 있다는 것을 의미합니다.

이러한 단점들을 고려하여 프로젝트의 요구사항과 팀의 기술 스택, 그리고 개발 리소스를 평가한 후 QueryDSL의 도입 여부를 결정하는 것이 좋습니다.

적용

buildscript {
	ext {
		querydslVersion = '5.0.0'
	}
}

plugins {
	id 'java'
	id 'org.springframework.boot' version '3.1.1'
	id 'io.spring.dependency-management' version '1.1.0'
	id 'com.ewerk.gradle.plugins.querydsl' version '1.0.10'
}

configurations {
	compileOnly {
		extendsFrom annotationProcessor
	}
	querydsl.extendsFrom compileClasspath
}

dependencies {
	// QueryDSL 라이브러리
	implementation 'com.querydsl:querydsl-jpa:5.0.0'
	implementation 'javax.persistence:javax.persistence-api:2.2'
	implementation 'com.querydsl:querydsl-core:5.0.0'
	// QueryDSL JPA 라이브러리
	implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
	// QueryDSL 관련된 쿼리 타입(QClass)을 생성할 때 필요한 라이브러리로, annotationProcessor을 사용하여 추가
	annotationProcessor 'jakarta.annotation:jakarta.annotation-api'
	annotationProcessor 'jakarta.persistence:jakarta.persistence-api'
	annotationProcessor 'org.projectlombok:lombok'
	annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jpa'
}

def querydslDir = 'src/main/generated'

sourceSets {
	main {
		java {
			srcDirs = ['src/main/java', querydslDir]
		}
	}
}

querydsl {
	jpa = true
	querydslSourcesDir = querydslDir
}

compileQuerydsl {
	options.annotationProcessorPath = configurations.querydsl
}

위와 같이 하고나서,

build > clean 클릭하고나서
build > build 를 눌러준다.

위의 사진과 같이 Q클래스 파일들이 생성된다.

-> clearn & build 하게 될때 바로 실행이 될수도 있지만 Domain 을 못찾을 수도 있다.
error: Could not find class file for 'com.example.jejuairbnb.domain.Product'.

그럴경우

@SpringBootApplication
@EntityScan("com.example.yourpath.domain") // 이거 추가 
public class YourApplication {
    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }
}

위와같이 추가해 주면 된다.

에러 발생시

위와 같은 에러 발생시

1 ) build.gradle 이 제대로 받아오고 있는지 확인한다.
2 ) entity 부분에서 jakarta 를 javax 로 변경해준다.

위와 같이 했는데 에러가 해결되지 않는다면 ,
https://lahezy.tistory.com/94
위의 링크를 확인한다.

profile
꾸준함이란 ... ?

2개의 댓글

comment-user-thumbnail
2023년 8월 10일

이렇게 유용한 정보를 공유해주셔서 감사합니다.

1개의 답글