[๐Ÿ’ก]๋ฉ€ํ‹ฐ๋ชจ๋“ˆ์— ๊ด€ํ•˜์—ฌ..(_ _)

์„œ์€๊ฒฝยท2023๋…„ 2์›” 27์ผ
0

Spring

๋ชฉ๋ก ๋ณด๊ธฐ
43/43

๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ !
์ตœ๊ทผ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ+์‹ค์Šต ๊ณผ์ œ ๋“ฑ๋“ฑ ๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ์„ ์ ์šฉํ•ด๋ณผ ์ผ์ด ๋งŽ์•˜๋‹ค. ๋ง๋กœ๋งŒ ํ•˜๋ฉด ๊ทธ์ € ๋ชจ๋“ˆ์„ ๋ถ„๋ฆฌํ•˜๋ฉด ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ๊ฐ€ ํ•˜๊ฒ ์ง€๋งŒ ๋ง‰์ƒ ์ ์šฉํ•˜๋ ค๋ฉด ๋ฌด์ˆ˜ํ•œ ์˜ค๋ฅ˜๋ฅผ ๋งž๋‹ฅ๋œจ๋ฆฐ๋‹ค.
์ด ์˜ค๋ฅ˜๋“ค์ด ๋‚˜์˜ ๋ฐ‘๊ฑฐ๋ฆ„์ด ๋  ์ˆ˜ ์žˆ๋„๋ก ์˜ค๋Š˜๋„ ํฌ์ŠคํŒ…ํ•˜์—ฌ ์žŠ์ง€ ์•Š๊ธฐ!

์ƒ์„ฑ๋ฐฉ๋ฒ•

๋ฉ€ํ‹ฐ ๋ชจ๋“ˆ ์ƒ์„ฑ ๋ฐฉ๋ฒ•์€ ์‰ฝ๋‹ค. ๊ทธ์ € ๋งˆ์šฐ์Šค ์šฐํด๋ฆญ + 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 ๋””๋ ‰ํ† ๋ฆฌ๋ฅผ ์‚ญ์ œํ•ด๋„ ์ € ์—๋Ÿฌ๊ฐ€ ์—†์–ด์ง€์งˆ ์•Š๋Š”๋‹ค. ์ข€ ๋” ์ฐพ์•„๋ณด๊ณ  ํฌ์ŠคํŒ…์„ ์ˆ˜์ •ํ•ด์•ผ๊ฒ ๋‹ค!

๊ทธ๋Ÿผ ์˜ค๋Š˜์€ ์ด๋งŒ..

0๊ฐœ์˜ ๋Œ“๊ธ€