Eureka Client를 spring boot로 추가하면서 발생한 에러
[JAVA/Spring/MSA] 1. 프로젝트 MSA 적용 여정: 유레카 클라이언트
※ Udemy 강의 中 【Master Microservices with SpringBoot,Docker,Kubernetes】의 내용을 기반으로 실제 프로젝트에 적용하는 과정을 기록하는 포스팅입니다.유레카 클라이언트유레카 서버가 관리할 클라이언트
bitbit-merry-go-round.tistory.com
idea가 제공하는 spring boot v3.3.0 으로 Eureka Discovery Client를 추가하고 build 하자 아래와 같은 에러를 만났다.

error를 그대로 검색한 결과, JVM의 버전이 17이상이 아니기 때문이다. 혹은 spring boot 버전이 의존성과 호환되지 않는다. 등이 문제의 원인으로 제기되었지만, 전혀 통하지 않았다.
에러가 발생한 build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.0'
id 'io.spring.dependency-management' version '1.1.5'
}
ext {
springCloudVersion = "2023.0.3"
}
group = 'pinting'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
runtimeOnly 'org.postgresql:postgresql'
runtimeOnly 'com.h2database:h2'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
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"
}
tasks.named('test') {
useJUnitPlatform()
jvmArgs '-Xshare:off'
}
def querydslSrcDir = 'src/main/generated'
clean {
delete file('src/main/generated')
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
tasks.withType(JavaCompile) {
options.generatedSourceOutputDirectory = file(querydslSrcDir)
}
문제: dependencyManagement의 위치
dependencies 선언 밑에 dependencyManagement가 있었기 때문에 발생한 에러다.
위치를 dependencies 상위로 변경하면 문제 없이 spring cloud dependencies를 잘 불러온다.
반성합니다..
편리함에 속아 build.gradle의 항목들을 대충 이해하고 넘어갔던 것이 화근이었다.
그렇다고 gradle 전문가 코스를 다시 밟을 순 없으니.. Dependency Management와 관련된 내용이라도 공식문서를 통해 이해하고 넘어가자.
Dependency Management Plugin
Gradle’s maven-publish plugin automatically generates a pom file that describes the published artifact. The dependency management plugin will automatically include any global dependency management, i.e. dependency management that does not target a specif
docs.spring.io
Spring Blog의 내용
Better dependency management for Gradle
Maven's dependency management includes the concept of a bill-of-materials (bom). A bom is a special kind of pom that is used to control the versions of a project's dependencies and provides a central place to define and update those versions. A number of S
spring.io
해당 의존성의 메타데이터를 받아오기 위해 maven BOM(bill-of-materials)를 gradle에서 사용하는 방법이다.
start.spring.io에서 Eureka Discovery Client만 import한 결과물이다. 이 녀석도 같은 문제가 있다. 왜일까? 나중에 알아보자.
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.4'
id 'io.spring.dependency-management' version '1.1.6'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
repositories {
mavenCentral()
}
ext {
set('springCloudVersion', "2023.0.3")
}
dependencies {
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
tasks.named('test') {
useJUnitPlatform()
}
수정한 build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.0'
id 'io.spring.dependency-management' version '1.1.5'
}
ext {
springCloudVersion = "2023.0.3"
}
group = 'pinting'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = '17'
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
runtimeOnly 'org.postgresql:postgresql'
runtimeOnly 'com.h2database:h2'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
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"
}
tasks.named('test') {
useJUnitPlatform()
jvmArgs '-Xshare:off'
}
def querydslSrcDir = 'src/main/generated'
clean {
delete file('src/main/generated')
}
tasks.withType(JavaCompile) {
options.generatedSourceOutputDirectory = file(querydslSrcDir)
}
빌드 문제가 해결되고 잘 실행되는 것을 확인할 수 있다. 야호

※ 질문, 개선점, 오류가 있다면 댓글로 남겨주세요 :)
'Architecture > MSA' 카테고리의 다른 글
| [JAVA/Spring/MSA] 1. 프로젝트 MSA 적용 여정: 유레카 클라이언트 (0) | 2024.10.25 |
|---|---|
| [JAVA/Spring/MSA] 0. 프로젝트 MSA 적용 여정: 유레카 서버 (5) | 2024.10.07 |