Spring/Spring Boot

Spring Boot > Boot 1을 Boot 2로 전환

Krevis 2024. 3. 25. 15:38

3/27/2024, Gradle 기준

 

정확히는 1.5.22.RELEASE를 2 최신 버전(2.7.x)으로 전환하는 것이다

Boot 1의 최신 버전(1.5.x)까지 올린다

의존성 목록: https://docs.spring.io/spring-boot/docs/1.5.x/reference/html/appendix-dependency-versions.html

 

Java 6+와 Spring Framework 4.3.25을 요구한다

 

여기서는 이미 최신 버전을 사용하고 있어 건너띔

Boot 2의 첫 버전(2.0.0.RELEASE)으로 올린다

의존성 목록: https://docs.spring.io/spring-boot/docs/2.0.x/reference/html/appendix-dependency-versions.html

 

Java 8+와 Spring Framework 5.0을 요구한다

 

2.1로 단번에 올리지 말고, 단계적으로 올려야 한다

application.properties/yml 설정을 변경한다

많은 프라퍼티가 개명/삭제되었다

 

이를 위해 spring-boot-properties-migrator 모듈을 제공한다. 애플리케이션의 환경을 분석하고, 시작할 때 진단을 출력한다. 또한 런타임에 일시적으로 전환까지 해준다. 전환 중에는 의존성을 추가하자. 전환이 완료되면 꼭 제거해주자

runtime "org.springframework.boot:spring-boot-properties-migrator"

Spring Boot Gradle Plugin

더이상 자동으로 의존성 관리 플러그인을 적용하지 않는다. 스프링 부트 의존성 BOM과 맞는 버전을 Importing 해야한다

 

최신 버전은 1.1.4인데 해당 버전 사용 시 빌드 에러 발생하였다 (그레이들 버전: 4.9)

Failed to notify dependency resolution listener.
> org.gradle.api.artifacts.result.ResolvedDependencyResult.isConstraint()Z

 

1.1.0 버전을 사용하니 빌드가 되었다

plugins {
    id "java"
    id "org.springframework.boot" version "2.0.0.RELEASE"
    id "io.spring.dependency-management" version "1.1.0"
}

 

spring-boot-starter-mobile

기존 프로젝트가 spring-boot-starter-mobile 의존성을 사용하는데, 다른 스프링 부트 의존성처럼 스프링 부트 버전을 생략했더니 빌드 실패했다

프로젝트명:test: Could not find org.springframework.boot:spring-boot-starter-mobile:.
Required by:
    project :

 

원인은 해당 모듈의 마지막 버전은 1.5.22.RELEASE이며

https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-mobile

 

더이상 유지보수가 되지 않는 모듈이다

https://github.com/spring-attic/spring-mobile

 

따라서 버전을 직접 명시했다

compile "org.springframework.boot:spring-boot-starter-mobile:1.5.22.RELEASE"

Executable jar로 패키징

bootRepackage 태스크가 bootJar로 변경되었다

 

아래 설정은 제거해도 된다

springBoot {
    executable = true
}

Fully executable jar로 패키징

bootJar {
    launchScript()
}

ErrorController 클래스 패키지 이동됨

org.springframework.boot.autoconfigure.web.ErrorController가 org.springframework.boot.web.servlet.error.ErrorController로 패키지 이동되었다

Spring Data Commons 의존성 관련

QueryByExampleExecutor 클래스의 메서드가 바뀜

 

findByOne을 사용한 코드는 findById 등으로 변경해야 함

Spring Security 의존성 관련

시큐리티 버전이 4.2.13.RELEASE에서 5.0.3.RELEASE가 되어 제공되는 클래스들이 달라졌다

GlobalAuthenticationConfigurerAdapter 클래스 삭제됨

대신 SecurityConfigurerAdapter를 사용하면 된다. 하위 클래스인 WebSecurityConfigurerAdapter를 상속받는 설정 클래스를 만들어 쓰면 될 듯?

pl.allegro.tech.boot:handlebars-spring-boot-starter 의존성 관련

java.lang.NoSuchMethodError: org.springframework.boot.autoconfigure.template.AbstractTemplateViewResolverProperties.applyToViewResolver(Ljava/lang/Object;)V 에러

해당 프로젝트는 pl.allegro.tech.boot:handlebars-spring-boot-starter 0.2.10을 사용하고 있었는데,

https://github.com/allegro/handlebars-spring-boot-starter 여기를 보면 스프링 부트 2부터는 0.3.0 이상을 사용해야하는 것 같다

 

https://github.com/allegro/handlebars-spring-boot-starter/tags

Boot 2.0의 최신 버전(2.0.9.RELEASE)으로 올린다

이번 작업 시에는 변경사항 없었음

Boot 2.4의 최신 버전(2.4.13)으로 올린다

그레이들 버전 판올림

Spring Boot Gradle Plugin이 그레이들 판올림을 요구한다

Caused by: org.gradle.api.GradleException: Spring Boot plugin requires Gradle 5 (5.6.x only) or Gradle 6 (6.3 or later). The current version is Gradle 4.9

 

https://services.gradle.org/distributions/

 

여기서는 그레이들 6.9.4로 올려보겠다

gradle/wrapper/gradle-wrapper.properties

..
distributionUrl=https\://services.gradle.org/distributions/gradle-6.9.4-bin.zip
..

 

이제 io.spring.dependency-management 플러그인의 최신버전(1.1.4)을 사용할 수 있게 된다

plugins {
    ..
    id "io.spring.dependency-management" version "1.1.4"
}

 

의존성 관리를 위한 설정이 바뀌었다

https://docs.gradle.org/current/userguide/upgrading_version_5.html#deprecations

 

그레이들 7부터는 사용불가라고 하고 IDE에서 Strikethrough 표시가 되니 이참에 변경하자

  • compile -> implementation
  • runtime -> runtimeOnly
  • testCompile -> testImplementation
  • ..

PageRequest 객체 생성자 변경

생성자 호출 대신 PageRequest.of 정적 메서드 사용

JUnit 4 -> JUnit 5

이제 스프링 부트 테스트에서 @RunWith 애너테이션이 불필요하다

 

build.gradle

test {
    useJUnitPlatform()
}

설정 데이터 변경

2.4부터 설정 데이터에 변경사항이 있다

https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-Config-Data-Migration-Guide

spring.profiles.include

2.4 아래 버전에서 아래와 같이 프로파일 전용 설정파일을 쓰고 있으면 

 

application-local.yml

spring:
  profiles:
    include: console-logging

(로컬 PC에서 개발할 때 local 프로파일만 사용해도 console-logging 프로파일을 추가로 사용하게 되어 로그백 설정 중 콘솔 출력을 활성화시키는 설정을 해두었음)

 

아래와 같은 에러 메시지가 발생한다

Property 'spring.profiles.include' imported from location 'class path resource [config/application-local.yml]' is invalid in a profile specific resource [origin: class path resource [config/application-local.yml] - 9:14]

 

아래와 같이 변경해야 한다

 

application.yml

spring:
  profiles:
    group:
      local:
        - console-logging

logging.path

application-local.yml

logging:
  path: /path/logs/${spring.application.name}

 

로컬 개발이 아닌 서버 운영 환경에서는 파일 로깅을 할 것이다. 위와 같은 설정을 할 텐데 아래 경고 로그가 출력된다

Property source 'Config resource 'class path resource [config/application.yml]' via location 'optional:classpath:/config/'':
	Key: logging.path
		Line: 5
		Replacement: logging.file.path

 

아래와 같이 변경해야 한다

 

application.yml

logging:
  file:
    path: /path/logs/${spring.application.name}
  logback:
    rollingpolicy:
      max-file-size: 10MB
      max-history: 7

 

파일 롤링 정책 설정도 추가되었는데, logback-spring.xml에서 아래와 같이 환경변수를 사용할 수 있다

..
      <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
        ..
        <maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE}</maxFileSize>
        <maxHistory>${LOGBACK_ROLLINGPOLICY_MAX_HISTORY}</maxHistory>
      </rollingPolicy>
..

 

spring.mvc.favicon.enabled

부트 2.2부터 Deprecated되었다. 더 이상 지원하지 않으니 그냥 제거하자

Boot 2.7의 최신 버전(2.7.18)으로 올린다

ErrorController 인터페이스 > getErrorPath 메서드

2.5에서 해당 메서드는 제거된다

 

server.error.path 프라퍼티 설정으로 대체된다. 경로를 /error로 사용한다면 기본값이므로 설정하지 않아도 된다

참고