들어가며
안녕하세요. LINE Plus에서 태국 LINE BK 채널 서버 개발 및 운영 업무를 맡고 있는 이석재입니다. LINE BK에서는 지난 9월에 LINE BK 보험 중개 서비스를 출시했습니다. 이 서비스는 Spring Boot 2를 기반으로 개발하기 시작해서 올해 초에 Spring Boot 3로 마이그레이션했는데요. 서비스를 정식 오픈한 후에는 현실적으로 대규모 변경 작업이 어렵다는 점과, Spring Boot 2의 OSS 지원이 올해 11월 24일에 EOL(end of life)을 맞이한다는 점(참고)을 고려해 마이그레이션을 결정하고 진행했습니다. 현재 안정적으로 운영되고 있으며, 이 프로젝트에서 쌓은 경험을 바탕으로 최근에는 여신(lending) 서비스를 위한 API 서버를 Spring Boot 3 환경으로 이관하는 작업을 진행하고 있습니다.
본 글에서는 저희가 Spring Boot 2 환경에서 Spring Boot 3 환경으로 이관하는 과정에서 경험한 내용을 공유하려고 합니다. 작년 11월에 출시된 Spring Boot 3는 내부적으로 상당한 변화가 있었습니다(참고). 이에 따라 Spring Boot와 함께 사용하는 다른 Spring 프로젝트들도 버전 업그레이드를 진행하면서 다양한 신규 기능이 추가되는 등의 크고 작은 변화가 있었는데요. 모든 변경 사항을 다루는 것은 어렵겠지만, 팀에서 운영하는 7개의 모듈을 업그레이드하는 과정에서 중요하다고 판단한 내용을 중점으로 다뤄보려고 합니다. 이 글이 마이그레이션을 계획하고 계신 분들에게 참고할 만한 가이드가 되길 바라며 시작하겠습니다.
이 글은 Spring Boot 2.7 버전에서 3.1 버전으로 업그레이드하는 과정을 기반으로 작성했습니다. 빌드 도구는 Gradle을 기준으로 삼았으며, 예제 코드는 Java를 기본으로 Kotlin과 함께 제공합니다.
Spring Boot 마이그레이션
Spring Boot는 다음과 같은 순서로 마이그레이션을 진행했습니다.
- 사전 준비
- Java 버전을 최소 17 이상으로 업데이트
- Spring Boot 버전을 3으로 업데이트
- Java EE를 Jakarta EE로 변경
application.yml
혹은application.properties
수정- 지원이 중단된(deprecated) API 수정
사전 준비
마이그레이션을 준비할 때 관련 공식 문서는 꼭 읽어보는 게 좋습니다. Spring Boot 3가 릴리스된 지 1년이 되어가는 시점에서 가장 신뢰할 수 있는 참고 자료인데요. 프로젝트에서 사용하고 있는 Spring과 Spring Boot의 버전을 확인하고 Spring Boot 3.0 문서부터 릴리스 노트와 마이그레이션 가이드를 최소 한 번 이상 꼼꼼히 읽어보시기를 권장합니다. 읽으면서 담당하는 프로젝트에 해당하는 내용을 Spring 프로젝트별로 정리해 놓는 것도 좋은 방법입니다.
만약 Spring Boot 버전이 최신 버전과 비교해 많이 낮은 상태라면, 업데이트할 때 바로 3 버전으로 업데이트하기보다는 마이너 버전부터 한 단계씩 순차적으로 진행하는 것을 것을 추천합니다. 또는 공식 문서인 Spring Boot Config Data Migration Guide를 참고해서 Spring Boot 2.4 버전으로 먼저 업데이트한 후 Spring Boot Config Data(application.yml
, application.properties
) 관련 변경 사항을 확인한 뒤 2.7 버전을 거쳐 3 버전으로 업데이트하는 것도 좋을 것 같습니다.
Spring 프로젝트는 시맨 틱 버저닝(semantic versioning) 방식으로 운영되고 있어서 마이너 버전마다 크고 작은 신규 기능이 추가되거나 변경됩니다. 이와 같은 이전 릴리스의 변경 사항을 최신 버전의 릴리스 노트에서 한꺼번에 확인하는 것은 쉽지 않습니다. 따라서 버전 업데이트 작업은 물론 이후 프로젝트를 안정적으로 운영하려면 Spring Boot 2의 최신 버전인 2.7 버전 릴리스 노트는 물론 그 이하 마이너 버전의 릴리스 노트도 꼭 한 번쯤은 읽어보는 것을 권장합니다.
Java 버전을 최소 17 이상으로 업데이트
마이그레이션 작업을 시작하면 가장 먼저 해야 할 일은 프로젝트에서 사용하는 Java의 버전을 최소 17 이상으로 올리는 것입니다. Spring Boot 3과, Spring Boot 3에서 사용하는 Spring 프레임워크 6에서 지원하는 최소 Java 버전이 17입니다. 따라서 프로젝트에서 Java 버전을 명시적으로 사용하고 있는 부분이 있다면 수정합니다.
- Kotlin 예제
java.sourceCompatibility = JavaVersion.VERSION_17 java.targetCompatibility = JavaVersion.VERSION_17
java { sourceCompatibility = '17' targetCompatibility = '17' }
Groovy 예제
Spring Boot 버전을 3으로 업데이트
다음으로 Spring Boot 버전을 3으로 올립니다. 아래 예시에서는 Gradle 프로젝트에서 사용하는 Spring Boot 관련 플러그인 버전을 23년 10월 25일 기준 최신 GA(General Availability) 버전인 3.1.5로 업데이트했습니다. 이외에도 Java 버전과 Spring Boot 버전을 설정하는 부분이 있다면 프로젝트에서 사용하는 빌드 도구와 환경에 맞춰 적절하게 수정합니다.
- Kotlin 예제
plugins { id("org.springframework.boot") version "3.1.5" id("io.spring.dependency-management") version "1.1.3" }
plugins { id 'org.springframework.boot' version '3.1.5' id 'io.spring.dependency-management' version '1.1.3' }
Groovy 예제
Java EE를 Jakarta EE로 변경
코드 레벨에서의 큰 변화는 javax
패키지가 jakarta
패키지로 변경된 것입니다. Java의 표준 사양을 관리하는 주체가 Java Community Process(JCP)에서 Eclipse Foundation으로 바뀌면서, Oracle과의 라이선스 이슈 때문에 javax
패키지가 jakarta
패키지로 변경됐습니다. 이에 따라 코드 내 import
문에서, javax.sql
, javax.crypto
등 JDK에 포함돼 있는 일부 패키지를 제외한 대부분의 javax
패키지를 jakarta
패키지로 변경해야 합니다.
이 작업은 수기로 하는 것보다는 IDE의 기능을 이용해 일괄 변경하거나 공식 문서에서 제안하는 몇 가지 방법 중 하나를 선택하는 게 좋습니다. 예를 들어 IntelliJ에서 지원하는 Java EE에서 Jakarta EE로 리팩토링하는 기능을 이용하면 변경해야 하는 코드를 쉽게 수정할 수 있습니다. 작업이 끝나면 IDE의 전체 검색 기능으로 javax.*
를 검색해서 한 번 더 확인하는 것을 추천합니다.
- Java 예제
// As-Is import javax.validation.Valid; // To-Be import jakarta.validation.Valid;
// As-Is import javax.validation.Valid // To-Be import jakarta.validation.Valid
Kotlin 예제
application.yml 혹은 application.properties 수정
application.yml
혹은 application.properties
등에서 Spring Boot Config Data의 일부 프로퍼티의 이름이나 뎁스(depth)를 수정해야 합니다. 예를 들어 아래와 같이 spring.redis.port
가 spring.data.redis.port
로 수정됐습니다.
application.yml
# As-Is spring: redis: port: 6379 # To-Be spring: data: redis: port: 6379
# As-Is spring.redis.port=6379 # To-Be spring.data.redis.port=6379
application.properties
Spring Boot 2.7 버전에서 3.0 버전으로 업데이트될 때 변경된 프로퍼티와, 3.0 버전에서 3.1 버전으로 업데이트될 때 변경된 프로퍼티는 다음과 같습니다.
- 2.7 → 3.0: Spring Boot 3.0 Configuration Changelog
- 3.0 → 3.1: Spring Boot 3.1.0 Configuration Changelog
위 문서와 공식 문서를 참고하면서 IDE의 자동 완성 기능 등을 이용해 기존에 사용하던 설정을 수정하거나 spring-boot-properties-migrator를 사용하는 등 기존에 사용하던 설정을 Spring Boot 3에서 사용할 수 있도록 수정합니다.
지원이 중단된 API 수정
마지막으로 IDE의 자동 완성 기능을 이용하거나 Javadoc을 확인해서 지원이 중단된 API를 사용하고 있는 코드를 최신 버전에서 권장하는 방식으로 수정합니다.
기타 Spring 프로젝트 마이그레이션
앞서 말씀드린 것처럼 Spring Boot가 2에서 3으로 업그레이드되면서 Spring Boot와 함께 사용하는 다른 Spring 프로젝트들도 버전이 업데이트됐습니다. 기타 Spring 프로젝트 마이그레이션은 어떻게 진행하는지 다음과 같은 순서로 살펴보겠습니다(꼭 이 순서대로 작업해야 하는 것은 아닙니다).
- Spring Cloud
- Spring Data JPA
- Spring Batch
- Spring Security
- 기타(Flyway, Mockito 등)
Spring Cloud
Spring Cloud 프로젝트는 다음과 같은 순서로 마이그레이션을 진행했습니다.
- Spring Cloud Bom 업데이트
application.yml
혹은application.properties
수정- Spring Cloud Sleuth를 Micrometer Tracing으로 이관