๋ฉํฐ ๋ชจ๋ !
์ต๊ทผ ๊ฐ์ธ ํ๋ก์ ํธ+์ค์ต ๊ณผ์ ๋ฑ๋ฑ ๋ฉํฐ ๋ชจ๋์ ์ ์ฉํด๋ณผ ์ผ์ด ๋ง์๋ค. ๋ง๋ก๋ง ํ๋ฉด ๊ทธ์ ๋ชจ๋์ ๋ถ๋ฆฌํ๋ฉด ๋๋ ๊ฒ์ด ์๋๊ฐ ํ๊ฒ ์ง๋ง ๋ง์ ์ ์ฉํ๋ ค๋ฉด ๋ฌด์ํ ์ค๋ฅ๋ฅผ ๋ง๋ฅ๋จ๋ฆฐ๋ค.
์ด ์ค๋ฅ๋ค์ด ๋์ ๋ฐ๊ฑฐ๋ฆ์ด ๋ ์ ์๋๋ก ์ค๋๋ ํฌ์คํ
ํ์ฌ ์์ง ์๊ธฐ!
์์ฑ๋ฐฉ๋ฒ
๋ฉํฐ ๋ชจ๋ ์์ฑ ๋ฐฉ๋ฒ์ ์ฝ๋ค. ๊ทธ์ ๋ง์ฐ์ค ์ฐํด๋ฆญ + Module + ์์ฑ๋ง ํด์ฃผ๋ฉด ์์ฑ์ด๋ค. ๊ทธ๋ผ ๋ฃจํธ ํ๋ก์ ํธ ํ์์ ๋ด๊ฐ ๋ง๋ค๋ ค๋ ๋ชจ๋์ด ์์ฑ๋๊ณ
์ด๋ ๊ฒ ๊ฐ๊ฐ์ ๋ชจ๋ ์์ build.gradle ํ์ผ์ด ์กด์ฌํ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
(์ด๊ฑด ์ ๊น ๋ฐ์ง์ธ ์์ด๋์ด๋ฅผ ์คํํด ๋ณผ ํ ์ด ํ๋ก์ ํธ..)
๋ฃจํธ์ src๋ ์ฌ์ฉํ์ง ์์ ๊ฑฐ๋ผ ์ญ์ ํด์คฌ๋ค.
๋๋ง์ ์ค์ ๋ฐฉ๋ฒ
์ผ๋จ settings.gradle ์ ํ์ ๋ชจ๋๋ค์ด ์ ์ธํ
์ด ๋์๋ ํ์ธ
domain๊ณผ api ๋ชจ๋์ ํฌํจํ๋ค๊ณ ์ ์ธํ
์ด ๋์ด์๋ค. ์๋์ด์์ด๋ ํ์ดํ ํด์ฃผ๊ณ ์ฝ๋ผ๋ฆฌ ๋๋ฌ์ ์ ์ฉํด์ฃผ๋ฉด ๋๋ ๊ฑฑ์ ์ ๊ธ๋ฌผ
์ฒซ๋ฒ์งธ๋ก ๋ฃจํธ ํ์ build.gradle ํ์ผ์ ์์ ํ๋ค.
// Gradle์ด ๋น๋๋๊ธฐ ์ ์คํ๋๋ ์ค์
buildscript {
ext {
springBootVersion = '3.0.3'
}
repositories {
mavenCentral()
}
dependencies {
classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
classpath "io.spring.gradle:dependency-management-plugin:1.1.0.RELEASE"
}
}
// ํ์ฌ root ํ๋ก์ ํธ์ ์๋ธ ๋ชจ๋์ ๋ํ ์ค์
allprojects {}
// ์ ์ฒด ์๋ธ ๋ชจ๋์ ํด๋น๋๋ ์ค์
subprojects {
apply plugin: 'java-library'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'com.sek.ottfind'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
repositories {
mavenCentral()
}
dependencies {
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
}
// api ๋ชจ๋์ domain์ ์์กด์ฑ์ ์ถ๊ฐ
project(':api') {
dependencies {
implementation project(':domain')
}
}
apply plugin: 'java' ๊ฐ ์๋๋ผ apply plugin: 'java-library' ์ธ ์ด์ ๋ ์๋์์ ์ค๋ช ํ๊ฒ ๋ค.
๋๋ฒ์งธ๋ก domain์ build.gradle ํ์ผ
dependencies {
api 'org.springframework.boot:spring-boot-starter-data-jpa'
api 'org.springframework.boot:spring-boot-starter-web'
runtimeOnly 'com.mysql:mysql-connector-j'
}
bootJar {
enabled = false
}
jar {
enabled = true
}
์ฌ๊ธฐ dependencies ๋ฅผ ๋ณด๋ฉด implementation์ด ์๋๋ผ api๋ฅผ ์ฌ์ฉํ๋๋ฐ implementation์ ์ฐ๋ฉด ์ง์ ์์กดํ๋ domian ๋ชจ๋๋ฐ์ ์์กด์ฑ์ ์ฌ์ฉํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. api ๋ชจ๋์์๋ ์ฐ๊ธฐ ์ํด์ api ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด์ฃผ์ด์ผ ํ๊ณ ๊ทธ๋ฌ๋ ค๋ฉด ์์์ ๋งํ ํ๋ฌ๊ทธ์ธ ์์ด๋๋ java๊ฐ ์๋ java-library ์ฌ์ฉํ๋ฉด ๋๋ค.
bootJar๋ ์คํ๊ฐ๋ฅํ jar๋ฅผ ๋ง๋ค๊ธฐ ๋๋ฌธ์ main()์ด ํ์ํ๋ฐ domain๋ main()์ด ์๋ค. ๋ฐ๋ผ์ domain์ enabled๋ฅผ false ์ต์ ์ผ๋ก ์ค์ ํ์ฌ ์ถํ domain์ ์๋ bean class๋ฅผ ๋ค๋ฅธ ๋ชจ๋์์ ์๋ฌ ์์ด ์ฌ์ฉํ๋๋ก ํ๋ค.
๋ง์ง๋ง์ผ๋ก api์ build.gradle ํ์ผ์
dependencies {}
ํ์ํ ์์กด์ฑ์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
๋ชจ๋ ์ค์ ์ ์๋ฃํด์ฃผ๋ฉด api ์๋ฒ์์๋ domain์ ์์กด์ฑ์ด ์ถ๊ฐ๋์ด ์ฌ์ฉํ ์ ์๋ค.
queryDSL ์ ์ฉ
์์ง๋
Attempt to recreate a file for type com.sek.ottfind.domain.entity.QTest
์๋ฌ์์ ํค์ด๋์ค๊ณ ์์ง ๋ชปํ๊ธด ํ๋ค๋ง ..
plugins {
// QueryDSL ํ๋ฌ๊ทธ์ธ ์ถ๊ฐ
id "com.ewerk.gradle.plugins.querydsl" version "1.0.10"
}
dependencies {
api 'org.springframework.boot:spring-boot-starter-data-jpa'
api 'org.springframework.boot:spring-boot-starter-web'
// QueryDSL ์์กด์ฑ ์ถ๊ฐ (์คํ๋ง ๋ถํธ 3.0 +)
implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta'
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
runtimeOnly 'com.mysql:mysql-connector-j'
}
bootJar {
enabled = false
}
jar {
enabled = true
}
// QClass ๋๋ ํ ๋ฆฌ ์์ฑ ์์น
def querydslDir = "$buildDir/generated/querydsl"
querydsl {
jpa = true
querydslSourcesDir = querydslDir
}
// QClass ์์ค ์์น ์ง์
sourceSets {
main.java.srcDir querydslDir
}
compileQuerydsl{
options.annotationProcessorPath = configurations.querydsl
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
querydsl.extendsFrom compileClasspath
}
์ผ๋จ domain ์ชฝ์ queryDSL ์ค์ ์ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
dependencies ์ ์ถ๊ฐํ๋ ๋ถ๋ถ์์ ์ ๋ฅผ ๋ง์ด ๋จน์๋ค T^T ์คํ๋ง ๋ถํธ 3.0+ ๋ถํฐ๋ ์กฐ๊ธ ๋ค๋ฅธ ์ค์ ๋ฐฉ์์ด ํ์ํ๋ค.
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"
์ด ๊ตฌ๋ฌธ์
java.lang.NoClassDefFoundError:javax/persistence/Entity
์ด ์๋ฌ ๋ฐฉ์ง๋ฅผ ์ํด ์ถ๊ฐํด์ค๋ค.
์ผ๋จ ํํด๋์ค ์์ฑ๊น์ง๋ ์๋๋๋ฐ ์๋ฌด๋ฆฌ build clean์ ํ๊ณ generated ๋๋ ํ ๋ฆฌ๋ฅผ ์ญ์ ํด๋ ์ ์๋ฌ๊ฐ ์์ด์ง์ง ์๋๋ค. ์ข ๋ ์ฐพ์๋ณด๊ณ ํฌ์คํ ์ ์์ ํด์ผ๊ฒ ๋ค!
๊ทธ๋ผ ์ค๋์ ์ด๋ง..