Spring을 사용하다 보면 어느 순간 버전업이 많이 진행돼서 기존에 사용하던 버전이 레거시가 될 수도 있고 새로운 버전에서 지원해주는 강력한 기능을 사용하고 싶어서 마이그레이션 해야 하는 상황이 올 수 있습니다.
이러한 버전업을 요구하는 상황이 올 경우 어떻게 대처해야 할지, 어떤 부분을 수정하는 게 좋을지를 미리 학습하는 과정을 통해 버전 마이그레이션을 학습해보려 합니다.
마이그레이션 요구사항
항목 | 현재 버전 | 변경 버전 |
---|---|---|
JDK | 1.8 | 17 |
Gradle | 5.6.X | 8.3 |
SpringBoot | 2.1.X | 3.1.4 |
시작 템플릿 build.gralde
의존성은 간단하게 spring-boot-starter-web과 롬복 정도만 구성했습니다.
plugins {
id 'java'
id 'org.springframework.boot' version '2.1.9.RELEASE'
id 'io.spring.dependency-management' version '1.0.8.RELEASE'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
java {
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
bootRun {
systemProperty 'spring.profiles.active', System.properties['spring.profiles.active']
}
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}
tasks.named('test') {
useJUnitPlatform()
}
시작 템플릿 gradle-wrapper.properties
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https://services.gradle.org/distributions/gradle-5.6.3-all.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
변경 시작
JDK 버전 변경
JDK 버전을 변경하기 위해서는 우선 개발 환경 내에 JDK 17에 대한 kit가 존재해야 합니다. 저의 경우에는 Intellij를 사용하고 있기 때문에 [파일] > [프로젝트 구조] > [프로젝트 설정] > [프로젝트] 항목에서 다음과 같이 JDK 17을 설정합니다.
만약 JDK17이 존재하지 않는다면, 위 SDK 셀렉트 박스 클릭 후에 [JDK 다운로드]를 클릭하여 다음과 같이 JDK17을 다운로드 해줍니다.
JDK 설정 후에, build.gradle 내에 JDK 버전을 17로 변경합니다.
//java {
// sourceCompatibility = JavaVersion.VERSION_1
// targetCompatibility = JavaVersion.VERSION_1_8
//}
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
Spring Version 변경
build.gradle 내에 Spring의 Version을 다음과 같이 변경해줍니다.
plugins {
id 'java'
id 'org.springframework.boot' version '3.1.4.RELEASE'
id 'io.spring.dependency-management' version '1.0.8.RELEASE'
}
Gradle Version 변경
gradle-wrapper.properties 내에 gradle version을 다음과 같이 변경해줍니다.
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https://services.gradle.org/distributions/gradle-8.3-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
프로젝트 재로딩
Intellij 오른쪽 메뉴바에 gralde 대표 코끼리 아이콘을 클릭하면 오른쪽 탭이 열리는데요, [새로고침] 버튼을 클릭하게 되면 IDE에서 현재 설정한 프로젝트 구조를 기반으로 새롭게 프로젝트를 불러오게 됩니다.
설정한 구조가 정상적으로 로드되면 다음과 같이 콘솔에 빌드가 성공됐다는 로그가 찍히게 됩니다.
주의할 점
JDK17로 업그레이드 시 주의 사항
JDK17로 업그레이드 되면서 모든 javax 패키지가 jakarta로 변경되었습니다. 따라서 다음과 같이 기존 javax를 사용하는 클래스들에서 컴파일 에러가 발생할텐데요, 기존 import를 지워주고 jakarta 패키지로 다시 변경해야 합니다.
Dockerfile을 사용한 빌드과정
war를 사용할 경우 톰캣을 외부에서 띄우게 되는데, Spring Boot 3.1은 Jakarta EE 9 이상을 사용하고 Tomcat 8.5는 Jakarta EE 8까지만 지원하기 때문에 호환되지 않을 수도 있습니다. 이러한 상황에서는 다음 두 가지 빌드 방법이 있습니다.
톰캣 버전을 10.x 버전으로 올리려서 외장 톰캣을 사용하는 방법
FROM gradle:8.3-jdk17 AS build
# 작업 디렉토리 설정
WORKDIR /app
# Gradle 설정 파일 복사
COPY settings.gradle settings.gradle
COPY build.gradle build.gradle
# 의존성 캐싱 및 테스트 제외한 빌드
RUN gradle build --no-daemon -x test --parallel --continue || true
# 소스 코드 복사
COPY src src
# Spring Boot WAR 파일 생성
RUN gradle clean bootWar --no-daemon --debug
# Tomcat 10.1 이미지를 기반으로 컨테이너 실행 준비
FROM tomcat:10.1
# 로그 디렉토리 생성 및 소유권 변경
RUN mkdir -p /logs/app && chown -R ubuntu:ubuntu /logs/app
# 빌드된 WAR 파일 복사
COPY --from=build /app/build/libs/*.war /usr/local/tomcat/webapps/ROOT.war
# 컨테이너 포트 노출
EXPOSE 8080
# Tomcat 실행
CMD ["catalina.sh", "run"]
내장 톰캣을 사용하는 방법
내장 톰캣을 사용하는 경우 보통 jar로 패키징하여 배포하게 됩니다. 빌드 코드는 다음과 같습니다.
FROM gradle:8.3-jdk17 AS build
# 작업 디렉토리 설정
WORKDIR /app
# Gradle 설정 파일 복사
COPY settings.gradle settings.gradle
COPY build.gradle build.gradle
# 소스 코드 복사
COPY src src
# 의존성 캐싱 및 테스트 제외한 빌드
RUN gradle build --no-daemon -x test --parallel || true
# JAR 파일 빌드
RUN gradle bootJar --no-daemon
# 런타임 이미지를 최소화하기 위해 경량 JDK 사용
FROM eclipse-temurin:17-jre
# 작업 디렉토리 설정
WORKDIR /app
# 빌드된 JAR 파일 복사
COPY --from=build /app/build/libs/*.jar app.jar
# 컨테이너 포트 노출
EXPOSE 8080
# 애플리케이션 실행
ENTRYPOINT ["java", "-jar", "app.jar"]
정리
버전 마이그레이션을 진행하며 Gradle 설정을 다뤄보는 값진 시간이었습니다. 특히, 개발자로서 마이그레이션 경험은 매우 중요하기에, 변경해야 할 부분을 사전에 학습하고 준비할 수 있었던 의미 있는 경험이었습니다.😊
'Spring Framework > spring' 카테고리의 다른 글
[SpringBoot] CORS의 이해와 설정 (0) | 2025.01.21 |
---|---|
[SpringBoot] Spring Transaction에 대하여 (0) | 2025.01.06 |
[SpringBoot] Spring FIiter (0) | 2024.12.29 |
[SpringBoot] ApplicationEvent를 활용한 이벤트 발행/구독 (0) | 2024.12.28 |
[SpringBoot] @ComponentScan 동작 원리 (0) | 2024.12.09 |