2022년 11월 기존의 Spring framework 5와 Spring Boot 2.X를 대체하는 Spring framework 6와 Spring Boot 3가 릴리즈되었다. 새로들어가는 회사 프로젝트와 사이드프로젝트에서 Spring Boot 3버전을 사용하기에 오늘은 Spring Boot 3버전의 주요 업데이트 내용과 레거시 방법에 대해서 알아볼려고 한다.
1. Spring Boot 3.x 주요 업데이트 내용
- Java 17 버전 이상만 지원: Spring Boot 3.0은 최소 Java 17을 필요로 하며, Kotlin 1.7 이상도 지원
- Java EE를 Jakarta EE로 대체: javax.*에서 jakarta.*로 변경. 기존에 java는 오라클이 상표권을 갖고 있기 때문에 Jakarta로 이름을 변경
- GraalVM 기반의 Spring Native 공식 지원: GraalVM은 JIT 컴파일러를 Java로 만들기 위한 프로젝트. AOT(Ahead of Time) 컴파일을 지원하게 되었으며, 이로 인해 어플리케이션의 시작 시간과 메모리 사용량이 감소
- HTTP/RSocket Interface Client 제공: 서비스 인터페이스 선언만으로 Http와 RSocket 액세스가 가능해 짐. 이에 따라 RestClient 또는 WebClient와 같은 클래스를 직접 구현하지 않아도, 인터페이스만 선언하면 API 호출이 가능
- 모니터링을 위한 메트릭 지원 강화: Micrometer Observation API 자동 구성, Observability 공식 지원 등이 이루어졌다. Micrometer를 통해 애플리케이션 메트릭을 효율적으로 기록하고, OpenZipkin 및 OpenTelemetry와 같은 공급자를 통해 추적을 구현할 수 있게 됨
- HTTP API 에러 처리를 위한 RFC 7807 지원: API 에러 응답값에 대한 표준 스펙인 RFC 7807을 지원. 특정 에러 상황에 대한 응답을 보다 표준화하고 세분화
- 사용되지 않는 코드들이 모두 제거(Deprecated)
- 보안 강화: /api/hello 와 /api/hello/는 보안상의 이유로 더 이상 일치하지 않음
- Logback 및 Log4j2 날짜 및 시간 표준화: ISO-8601 표준을 따르도록 변경
1. GraalVM: GraalVM은 Java, JavaScript, Ruby, R, Python 등 여러 언어를 지원하는 고성능 런타임. 다양한 언어로 작성된 프로그램을 JVM 상에서 실행
2. AOT(Ahead of Time) 컴파일: AOT 컴파일은 프로그램을 실행하기 전에 미리 컴파일하는 방식. 프로그램의 실행 시간을 줄이고, 메모리 사용량을 최적화하는 데 도움
3. Micrometer Observation API: Micrometer는 Java 애플리케이션의 성능을 측정하는 데 사용되는 라이브러리. Observation API는 이를 활용해 애플리케이션의 상태를 관찰하고, 이를 바탕으로 성능을 최적화하는 데 사용
4. OpenZipkin 및 OpenTelemetry와 같은 공급자를 통해 추적을 구현: OpenZipkin과 OpenTelemetry는 서비스 간의 호출을 추적하는 데 사용되는 도구. 서비스 간의 문제를 빠르게 파악하고, 해결
5. RFC 7807: RFC 7807은 HTTP API에서 발생하는 문제를 표현하는 표준. API에서 발생하는 에러를 일관된 형식으로 표현할 수 있어, 클라이언트가 에러를 더 쉽게 처리
2. Spring Boot 3.x 마이그레이션 방법
1. Java 17로 업그레이드하기
Spring Boot 3.0은 최소 Java 17을 필요로 한다. 최근의 Spring Boot 2.x 릴리즈는 Java 17과 매우 잘 작동하기 때문에 Java 17로 먼저 업그레이드 한 후 스프링을 업그레이트 하는것이 좋을 것 같다.
2. 최신 Spring Boot 2.7.x 버전으로 업그레이드하기
Spring Boot 2.x의 이전 버전을 사용하고 있다면, Spring Boot 2.7로 업그레이드하는 것이 중요하다. Spring Boot 3.0이 릴리즈된 후마이그레이션 가이드를 제공하지만, 이는 Spring Boot 2.7에서 마이그레이션이 진행된다는 가정 하에 제공ehla(2.7 -> 3.0 마이그레이션 가이드)
3. Deprecated 코드 검사하기
Spring Boot 3.0은 모든 deprecated 된 코드를 제거한다. 따라서 기존 코드가 deprecated된 메소드에 의존하고 있지 않은지 확인하는 것이 중요. -Werror Java 컴파일러 옵션을 사용하여 deprecation 경고가 보고될 경우 빌드가 실패하도록 설정하는 것이 좋다.
4. 레거시 application.properties 및 application.yaml 처리 마이그레이션하기
Spring Boot 2.4 이후 버전에서는 application.properties와 application.yaml 파일의 처리 방식이 변경됨. 이전에는 하나의 프로파일만 활성화하는 방식이었다면, 이제는 여러 프로파일을 동시에 활성화하여 설정을 덮어쓸 수 있게 됨. Spring Boot 3.0은 레거시 처리를 지원하지 않기 때문에 프로젝트가 spring.config.use-legacy-processing를 설정하지 않는지 확인필요.
5. Spring Boot Migrator 프로젝트 사용하기
Spring Boot Migrator는 프로젝트를 Spring Boot의 새로운 버전으로 업그레이드하는 데 도움을 주는 도구. OpenRewrite라는 코드 변환 라이브러리를 사용하여 작성됨
Spring Boot Migrator는 프로젝트의 코드를 분석하고, 필요한 변경 사항을 자동으로 적용해줌으로써 개발자는 코드의 변화를 수동으로 관리하는 번거로움에서 벗어날 수 있음
'spring.config.use-legacy-processing'은 Spring Boot 2.4 버전 이후부터 새롭게 도입된 설정. 새로운 프로파일 처리 방식과 이전 방식 사이에서 선택할 수 있게 해줌.
'spring.config.use-legacy-processing' 설정을 true로 설정하면, Spring Boot는 이전 방식대로 프로파일 설정을 처리(우선순위가 더 높음)
Spring Boot 3.0 부터는 이 설정이 제거
5. 마치며
spring boot 3 주요 변경 사항 및 마이그레이션 방법에 대해 정리해봤다. 회사의 새프로젝트는 자바로, 사이드프로젝트는 코틀린으로 진행하는데 security나 querydsl 설정 등 변경된 부분이 많고, 공식 문서외에 레퍼런스가 많이 없어서 오류가 발생했을 때 해결하는데 조금 오래 걸리기도한다. 써보는게 익숙해지는 가장 빠른 방법이니 많이 부딪히면서 배우고 기존 프로젝트도 마이그레이션 해봐야겠다!
[reference]
- https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0.0-M3-Release-Notes#logging-date-format
- https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-3.0-Migration-Guide
- https://spring.io/blog/2022/10/12/observability-with-spring-boot-3
- https://docs.spring.io/spring-framework/docs/6.0.0-RC1/reference/html/overview.html#overview-history
- https://spring.io/blog/2022/05/24/preparing-for-spring-boot-3-0
'개발 하나둘셋 > Java & Spring' 카테고리의 다른 글
Java와 Spring에서의 비동기 처리 @Async와 CompletableFuture (2) | 2024.11.08 |
---|---|
FFmpeg로 자막(srt) 삽입하여 영상 인코딩 시 자막이 깨지는 문제! Troubleshooting (0) | 2024.06.23 |
Redis 서버 재시작 시 데이터 초기화 문제와 해결 방법: RDB와 AOF (1) | 2024.01.21 |
Redis를 활용한 효율적인 조회수 관리 방법 (2) | 2024.01.04 |
Java 'MultipartFile'에서 파일 이름 가져오기 문제와 해결방법, 유니코드 (0) | 2023.12.21 |