๋ณธ๋ฌธ์œผ๋กœ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋ฌธ์ œ ์ƒํ™ฉ

์ด์ „์— ํ”„๋กœ์ ํŠธํ•  ๋‹น์‹œ ์‚ฌ์šฉํ–ˆ๋˜ JPA, QueryDSL ์ฝ”๋“œ๋ฅผ ์ƒˆ๋กœ์šด ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•˜๋ ค๋‹ค๊ฐ€

EntityManager ๊ด€๋ จ ์—๋Ÿฌ์™€ Q์—”ํ‹ฐํ‹ฐ๊ฐ€ ๋งŒ๋“ค์–ด์ง€์ง€ ์•Š๋Š” ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค.

 

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

- SpringBoot 3๋ฒ„์ „ ์ด์ƒ์€ QueryDsl ์„ธํŒ…์ด ๋ณ€๊ฒฝ๋˜์—ˆ๋‹ค. ๋ณ€๊ฒฝ๋œ ๋ฐฉ๋ฒ•์œผ๋กœ ์„ ์–ธํ•ด์ฃผ์ž.

 

ํ•ด๊ฒฐ ๊ณผ์ •

๊ธฐ์กด์—๋Š” build.gradle์— ์•„๋ž˜์™€ ๊ฐ™์ด ์„ ์–ธํ•ด์ฃผ์—ˆ๋Š”๋ฐ, 

implementation "com.querydsl:querydsl-jpa"

์ด์ œ๋Š” jakarta ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ฒ ๋‹ค๊ณ  ๋ช…์‹œ๋ฅผ ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

implementation "com.querydsl:querydsl-jpa:5.0.0:jakarta"
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"

 

JPA์—์„œ ์‚ฌ์šฉ๋˜๋Š” Entity ๋“ฑ์˜ ์–ด๋…ธํ…Œ์ด์…˜์ด javax -> jakarta ๋กœ ํŒจํ‚ค์ง€๊ฐ€ ์ด๋™ํ•˜์˜€๋‹ค.

๋•Œ๋ฌธ์— javax/persistence/entity ์—๋Ÿฌ์™€ ๊ฐ™์ด javax ๊ด€๋ จ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

๋•Œ๋ฌธ์— ์œ„์™€ ๊ฐ™์ด jakarta๋ฅผ ๊ฐ™์ด ๋ช…์‹œํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

 

์ „์ฒด build.gradle

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.1.3'
    id 'io.spring.dependency-management' version '1.1.3'
}

group = 'com.async.myapp'
version = '0.0.1-SNAPSHOT'

java {
    sourceCompatibility = '17'
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa' //jpa
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'org.projectlombok:lombok:1.18.22'
    annotationProcessor 'org.projectlombok:lombok' //add
    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    //mysql
    runtimeOnly 'com.mysql:mysql-connector-j'

    //swagger ์‚ฌ์šฉ
    implementation group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2'
    implementation group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2'

    //webClient ์‚ฌ์šฉ - http ์š”์ฒญ
    implementation 'org.springframework.boot:spring-boot-starter-webflux'

    //querydsl ์ถ”๊ฐ€ 1
    implementation "com.querydsl:querydsl-jpa:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
    annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
    // java.lang.NoClassDefFoundError (javax.annotation.Generated) ๋Œ€์‘ ์ฝ”๋“œ
    annotationProcessor "jakarta.annotation:jakarta.annotation-api"
    // java.lang.NoClassDefFoundError (javax.annotation.Entity) ๋Œ€์‘ ์ฝ”๋“œ
    annotationProcessor "jakarta.persistence:jakarta.persistence-api"

}

//querydsl ์ถ”๊ฐ€ 2
def generated = 'src/main/generated'    //QClass ํŒŒ์ผ ์ƒ์„ฑ ์œ„์น˜
sourceSets {
    main.java.srcDirs += [generated]	//java source set์— querydsl QClass ์œ„์น˜ ์ถ”๊ฐ€
}
tasks.withType(JavaCompile){			//QClass ํŒŒ์ผ ์ƒ์„ฑ ์œ„์น˜๋ฅผ ์ง€์ •
    options.getGeneratedSourceOutputDirectory().set(file(generated))
}
clean{
    delete file(generated)  			//gradle clean ์‹œ generated ๋””๋ ‰ํ† ๋ฆฌ ์‚ญ์ œ
}