[SpringBoot] Spring 버전 마이그레이션

2025. 1. 13. 23:31· Spring Framework/spring
목차
  1.  
  2. 마이그레이션 요구사항
  3.  
  4. 변경 시작
  5. 프로젝트 재로딩
  6. 주의할 점
  7. 정리
반응형

 

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 설정을 다뤄보는 값진 시간이었습니다. 특히, 개발자로서 마이그레이션 경험은 매우 중요하기에, 변경해야 할 부분을 사전에 학습하고 준비할 수 있었던 의미 있는 경험이었습니다.😊

반응형
LIST

'Spring Framework > spring' 카테고리의 다른 글

[SpringBoot] CORS의 이해와 설정  (1) 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
  1.  
  2. 마이그레이션 요구사항
  3.  
  4. 변경 시작
  5. 프로젝트 재로딩
  6. 주의할 점
  7. 정리
'Spring Framework/spring' 카테고리의 다른 글
  • [SpringBoot] CORS의 이해와 설정
  • [SpringBoot] Spring Transaction에 대하여
  • [SpringBoot] Spring FIiter
  • [SpringBoot] ApplicationEvent를 활용한 이벤트 발행/구독
iron_jin
iron_jin
배운 것에 대한 내 생각을 가지고 정리하자
學而不思則罔(학이불사즉망)배운 것에 대한 내 생각을 가지고 정리하자
iron_jin
學而不思則罔(학이불사즉망)
iron_jin
전체
오늘
어제
  • 전체 (162)
    • 도서 (10)
    • 생각 정리 (0)
    • 후기 모음 (14)
    • 언어 (19)
      • css (1)
      • java (9)
      • Kotlin (0)
      • javascript (0)
      • Solidity (3)
      • Python (3)
      • GO (3)
    • Spring Framework (32)
      • spring (16)
      • JPA (6)
      • Error (4)
      • Settings (4)
    • 알고리즘 (62)
      • 이론 (0)
      • 연습문제 (58)
    • 인프라 (6)
      • 클라우드 (1)
      • 도커 (0)
      • AWS (4)
      • Elastic Search (0)
    • 쿠버네티스 (3)
      • 이론 (0)
      • 실습 (2)
      • 트러블슈팅 (1)
    • Nginx (2)
    • CS (0)
      • 서버 (0)
      • 리눅스 (2)
      • 네트워크 (0)
      • OAuth (2)
    • 형상관리 (3)
      • GIT (3)
    • Open API (3)
      • 카카오 API (1)
      • QGIS (2)
    • 보안 (0)
      • 알고리즘 (0)
    • 공통 (1)
      • 성능 관리 도구 (1)
    • Database (2)
      • MySQL (1)
      • Redis (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • Python
  • 스프링 부트
  • SpringBoot
  • 2020 카카오
  • MySQL
  • 코딩테스트
  • 2019 카카오
  • 스프링
  • spring
  • Java
  • Hibernate
  • 도메인 주도 개발
  • 에릭 에반스
  • ddd
  • 프로그래머스
  • spring boot
  • 항해99
  • 2020 kakao
  • 자바
  • 알고리즘
  • 2020 카카오 블라인드
  • JPA
  • 2018 kakao
  • 2019 카카오 블라인드
  • AWS
  • 2019 kakao
  • 항해플러스
  • 백준
  • 카카오 겨울 인턴십
  • 2018 카카오 블라인드

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
iron_jin
[SpringBoot] Spring 버전 마이그레이션
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.