[Spring] gradle QueryDsl 설정 (with. kotlin)

wononly.dev·2023년 10월 15일
0
post-thumbnail

개발 환경

  • OS: macOS Ventura 13.2.1
  • IDE: IntelliJ
  • SpringBoot: 3.0.5
  • Jdk: openjdk 17버전
  • Gradle언어: Kotlin

QueyrDsl 을 사용하기 위한 gradle 설정 방법 (with. kotlin)

build.gradle.kts

plugins {
	java
	id("org.springframework.boot") version "3.0.5"
	id("io.spring.dependency-management") version "1.1.0"
}

group = "wononly.log"
version = "0.0.1-SNAPSHOT"
java.sourceCompatibility = JavaVersion.VERSION_17

configurations {
	compileOnly {
		extendsFrom(configurations.annotationProcessor.get())
	}
}

repositories {
	mavenCentral()
}

dependencies {
	implementation("org.springframework.boot:spring-boot-starter-web")
	implementation("org.springframework.boot:spring-boot-starter-data-jpa")
	implementation("org.springframework.boot:spring-boot-starter-validation")
	implementation("org.springframework.boot:spring-boot-starter-data-redis")
	implementation("org.springframework.boot:spring-boot-starter-websocket")
	implementation("org.springframework.boot:spring-boot-starter-security")
	implementation("org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE")
	implementation("com.github.ulisesbocchio:jasypt-spring-boot-starter:3.0.5")
	implementation("org.apache.commons:commons-lang3:3.12.0")
	implementation("org.apache.commons:commons-collections4:4.4")

	compileOnly(group = "io.jsonwebtoken", name = "jjwt-api", version = "0.11.2")
	runtimeOnly(group = "io.jsonwebtoken", name = "jjwt-impl", version = "0.11.2")
	runtimeOnly(group = "io.jsonwebtoken", name = "jjwt-jackson", version = "0.11.2")

	developmentOnly("org.springframework.boot:spring-boot-devtools")

	runtimeOnly("com.h2database:h2")
	runtimeOnly("org.postgresql:postgresql")

	implementation("com.querydsl:querydsl-jpa:5.0.0:jakarta")
	implementation("com.querydsl:querydsl-sql:5.0.0")
	annotationProcessor("com.querydsl:querydsl-apt:5.0.0:jakarta")

	compileOnly("org.projectlombok:lombok")
	annotationProcessor("org.projectlombok:lombok")

	annotationProcessor("jakarta.annotation:jakarta.annotation-api")
	annotationProcessor("jakarta.persistence:jakarta.persistence-api")

	testImplementation("org.springframework.boot:spring-boot-starter-test")
}

tasks.withType<Test> {
	useJUnitPlatform()
}

springBoot {
	mainClass.set("com.companywe.xergy.csms.api.Application")
}

val querydslDir = "$buildDir/generated/sources/annotationProcessor"

sourceSets {
	main {
		java.srcDirs("src/main/java", querydslDir)
	}
}

tasks.withType<JavaCompile> {
	options.generatedSourceOutputDirectory.file(querydslDir)
	// 다른 자바 버전에서도 사용할 수 있도록 java.annotation.Generated 로 import 하도록 설정하는 코드
	options.compilerArgs.add("-Aquerydsl.generatedAnnotationClass=javax.annotation.Generated")
}

tasks {
	getByName<Delete>("clean") {
		delete.add(querydslDir) // add accepts argument with Any type
	}
}
  • QueryDsl 사용을 위한 디펜더시 추가

    implementation("com.querydsl:querydsl-jpa:5.0.0:jakarta")
    implementation("com.querydsl:querydsl-sql:5.0.0")
    annotationProcessor("com.querydsl:querydsl-apt:5.0.0:jakarta")

  • QueryDsl 빌드 옵션 추가

    val querydslDir = "$buildDir/generated/sources/annotationProcessor"
    
    sourceSets {
        main {
            java.srcDirs("src/main/java", querydslDir)
        }
    }
    // 컴파일시 querydslDir 위치에 Qfile 생성되도록 설정
    tasks.withType<JavaCompile> {
        options.generatedSourceOutputDirectory.file(querydslDir)
        
        // 다른 자바 버전에서도 사용할 수 있도록 java.annotation.Generated 로 import 하도록 설정
        options.compilerArgs.add("-Aquerydsl.generatedAnnotationClass=javax.annotation.Generated") 
    }
    
    tasks { // build.clean 하는 경우 Qfile 삭제 될 수 있도록 설정
        getByName<Delete>("clean") {
            delete.add(querydslDir)
        }
    }

번외

SpringBoot 프로젝트 환경 셋팅시 kotlin gradle 파일 예시중 QueyrDsl 설정 예시가
많이 없어서 gradle groovy 파일에서의 QueryDsl 설정을 마이그레이션 하는데 시간을 들였다.
그렇다면 내가 예시가 많은 groovy gradle 대신 kotlin gradle을 사용한 이유는?
kotlin의 아래와 같은 장점 때문!

  • IDE 와의 뛰어난 호환성으로 코드 자동완성 기능
  • 컴파일 타입 검사
  • 오류코드 강조
  • 간소화된 선언적 플러그인 구문

참고

profile
항상 이유와 과정을 궁금해하는🤔 백엔드 개발자의 기술 블로그 입니다!

0개의 댓글