글 작성자: 개발섭

도대체 왜 그대로 따라서 쳤는데 왜 안되는걸까?

내가 스프링부트를 이용하면서 가장 짜증났었던 부분 중 하나는 버전 업 이슈 사항들이 딱히 전파가 잘 되지 않는다라는 점이었다.

Spring boot를 사용하다보면 가끔 내가 쓰고 있는 버전과 블로그나 인터넷에서 제공하는 기능이 정상작동을 하지 않는 경우가 있었는데, 그런 경우에는 버전업에 따른 Deprecated 이슈가 있는 상황이 간혹 있었다. 그리고 전에는 분명히 이렇게 하면 됬는데, https://start.spring.io/에서는 기본 스프링부트의 버전을 거의 최신으로 유지하고 있어서 낮은 버전을 강제할 수도 없는 상황이 많이 생긴다.

즉, 이런 낮은 상황을 강제하려면 Maven, gradle의 도움을 받아서 억지로 낮은 버전을 찾아서 세팅하는 방법이 있기도 하지만.. 신규 프로젝트의 경우 낮은 버전을 강제하지는 않을 수도 있으며 이전 버전을 사용하던 개발자들이 분명히 전 버전과 달라서 마주하는 상황을 당연히 겪을수도 있겠다 싶어서 정리해보고자 한다.

도대체 어떤 이슈를 겪었기에...?

  • data.sql 순서 오류

일단 나는 미리 데이터를 넣어두고 Test code를 작성하기 위해서 data.sql을 사용한 케이스가 있었다. 근데 schema.sql이 먼저 켜지면서 table이 만들어지지 않은 상태로 data.sql이 작동을 해. 시작조차 하지 않은 경우가 있었다. 이것 역시 2.5버전으로 버전업하면서 초기화 이슈가 있었다.

  • Spring.profiles 양식 변경

2.4부터는 Spring boot의 Spring.profile 양식이 약간 달라졌다. 물론 레거시 모드를 사용하는 것이 사용 가능했으나, 여러 단계를 갖춰서 환경세팅을 분리하려고 했으나, 외안대? 하는 상황이 많이 생겼었다. 특히, dev, prod, stg을 분리해야하는 상황을 만들어야하는데, 이런 상황자체가 정상적으로 사용하기 어렵다는 것이 나를 열받게 했던 포인트이다.

Spring boot 2.4 릴리즈 노트

개인적으로 스스로 중요하게 생각하는 부분 위주로 업데이트 됬다는 것을 확인해보고 싶어서 정리해봤습니다. 몇몇 부분들은 빼고 번역하였습니다.

🚨 번역의 의역이나, 오류등이 많습니다! 이상한 번역, 이해 안되는 점은 무조건 댓글 남겨주세요. 미숙한 영어 실력 때문에 번역 자체에 이슈가 많을것으로 예상됩니다.

 

 

GitHub - spring-projects/spring-boot: Spring Boot

Spring Boot. Contribute to spring-projects/spring-boot development by creating an account on GitHub.

github.com

주요 설정 업데이트

2.3 버전에서 업데이트 된 내용

버전 양식 변경

버전 양식을 변경. 2.3.5 RELEASE -> 2.4.0 이렇게 변경되었습니다.

spring-boot-starter-test 에서 Vintage Engine 제거

Junit4에서 사용하던, 빈티지 엔진을 사용하기 위해서는 아래 처럼 사용해야합니다.

Maven

<dependency>
    <groupId>org.junit.vintage</groupId>
    <artifactId>junit-vintage-engine</artifactId>
    <scope>test</scope>
    <exclusions>
        <exclusion>
            <groupId>org.hamcrest</groupId>
            <artifactId>hamcrest-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

Gradle

testImplementation("org.junit.vintage:junit-vintage-engine") {
    exclude group: "org.hamcrest", module: "hamcrest-core"
}

구성 파일 프로세싱 (Application.properties or . yaml 파일)

2.4버전부터는 두 파일이 변경되었는데 만약 복잡하게 셋업을 해놓은경우 profile을 통한 여러 환경에 대해서 적용해야하는 경우는 링크를 참고해서 migration에 관련한 정보를 확인해보시면 좋습니다.

이것은 또 제가 정리를 하고 링크를 또 남기겠습니다.

만약에 2.3.버전의 로직을 사용하려면 spring.config.use-legacy-processing을 true로 해서 이전 스타일로 사용할 수 있습니다.

Logback Configuration Properties

로그백 설정과 관련한 설정을 명시적으로 구현해두었습니다. 이전 설정명은 모두 deprecated 처리.

스프링부트에서 다음속성은 이렇게 변화했고...

  • logging.pattern.rolling-file-namelogging.logback.rollingpolicy.file-name-pattern
  • logging.file.clean-history-on-startlogging.logback.rollingpolicy.clean-history-on-start
  • logging.file.max-sizelogging.logback.rollingpolicy.max-file-size
  • logging.file.total-size-caplogging.logback.rollingpolicy.total-size-cap
  • logging.file.max-historylogging.logback.rollingpolicy.max-history

비슷하게 시스템 속성은 다음과 같이 변경 되었습니다.

  • ROLLING_FILE_NAME_PATTERNLOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN
  • LOG_FILE_CLEAN_HISTORY_ON_STARTLOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START
  • LOG_FILE_MAX_SIZELOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE
  • LOG_FILE_TOTAL_SIZE_CAPLOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP
  • LOG_FILE_MAX_HISTORYLOGBACK_ROLLINGPOLICY_MAX_HISTORY

기본 서블렛 등록

2.4 버전부터는 DefaultServlet 서블렛 컨테이너를 등록하지 않음. 대부분 Spirng MVC에서 DispatcherServlet으로 사용되서 사용이 안되서 등록하지 않았습니다.

만약 설정시 server.servlet.register-default-servlettrue 설정할 것.

인베디드 DB 추적

인베디드 데이터베이스의 로직을 재정의했습니다. 인메모리아닌 경우는 다른 DB로 간주하게 되어있었습니다.

  • sa의 유저이름은 이제 유효하지 않습니다. 만약 쓰고 싶다면, spring.datasource.username=sa 설정 달아주면 됩니다.
  • 의아한점: 유효하지 않게 만들었으나, 위의 설정 달지 않으면 로그인이 불가하다는 점
  • 임베디드의 초기화 기능은 이제 고려되지 않았습니다.. 만약에 쓰고 싶으면 spring.datasource.initialization-mode 로 설정해야합니다.

exec-maven-plugin 위한 버전 매니징

exec-maven-plugin 는 삭제되었습니다. 이 플러그인을 사용하고 싶다면, 자신에 맞는 pluginManagement`를 특정 버전을 지정해야합니다.

스프링부트 Gradle Plugin

Spring Boot Gradle Plugin을 위한 DSL인 bootJarProperty<String> 을 사용해 mainClass를 구성 할 수 있도록 업데이트 되었고, 아래는 mainClassName를 사용하는 예제이며

bootJar {
    mainClassName 'com.example.ExampleApplication'
}

mainClass 로 변경 가능해졌습니다.

bootJar {
    mainClass 'com.example.ExampleApplication'
}

Spring Boot 2.2 and 2.3의 Deprecation

스프링 부트의 release compatibility policy 를 반영하여, Spring Boot 2.2의 code deprecated를 2.4버전에서 삭제되며, 2.3버전의 Code deprecated은 아직 남아있지만, 2.5버전에서 삭제될 예정입니다.

새롭게 추가되거나, 주목해봐야할 것들

✅  새로운 configuration에 대한 변경은 상기 링크를 참고해주세요

스프링 5.3

2.4부터는 스프링 5.3 사용

Java 15 공식 지원

자바 15를 공식 지원. 최소 제공 버전은 8임.

커스텀 property 이름 지원

생성자 바인딩을 사용하는 경우에는 속성이름을 매개변수에 사용할 수 있다. 이렇게 사용할 경우 자바 예약어 키워드로 사용하는 경우 문제가 생겼습니다.. 이런 문제를 해결하기 위해서 다음과 같은 @Name 태그를 통해서 사용하면 됩니다.

다음은 sample.import 의 경우 설정 가능합니다.

@ConfigurationProperties(prefix = "sample")
@ConstructorBinding
public class SampleConfigurationProperties {

  private final String importValue;

  public SampleConfigurationProperties(@Name("import") String importValue) {
    this.importValue = importValue;
  }

}

웹 환경설정

Spring MVC와 WebFlux에 공통적으로 제공하는 web 지역, 리소스 위치 속성을 추가하였습니다.

새로 추가된 값

  • spring.web.locale
  • spring.web.locale-resolver
  • spring.web.resources.*

서블릿 또는 리액티브 웹 스택을 사용하여 actuators 관리 엔드포인트에 대한 새로운 속성이 추가되었습니다.

  • management.server.base-path

아래 속성들은 공통으로 매니징 되기 위해 MVC/서블릿 속성에서 deprecated 되었습니다.

  • spring.mvc.locale
  • spring.mvc.locale-resolver
  • spring.resources.*
  • management.server.servlet.context-path

Flyway 7

Flyway 7이 버전 업그레이드 되며 새로운 속성들을 가져왔습니다.

spring.flyway 속성은 다음과 같습니다:

  • url
  • user
  • password

"teams" 버젼 사용하는 경우 다음의 것들을 추가적으로 사용가능합니다.

  • cherry-pick
  • jdbc-properties
  • oracle-kerberos-cache-file
  • oracle-kerberos-config-file

H2 콘솔의 웹 어드민 비밀번호 속성 추가

새로운 속성 h2 웹 어드민 패스워드가 설정에 등록되었습니다. spring.h2.console.settings.web-admin-password 를 통해서 어드민 페이지의 기본 설정, 툴의 접근을 제어합니다.

실패 분석기

FailureAnalizersApplicationContext 가 생성되어지지 않았을때 고려되어집니다. 이를 통해서 환경 처리 중 발생하는 예외 분석이 가능해집니다.

ApplicationContext 를 만들지 않는 경우 BeanFactoryAware or EnvironmentAware 를 구현하는 분석기가 작동하지 않았던 점을 참고했습니다.

Jar 최적화

실행가능한 스프링부트 Jar를 생성시 비어있는 Starter 의존성들을 자동적으로 제거했습니다. 비록 대부분의 Starter들이 타의적인 의존성을 제공했지만, 마지막 jar 패키지에서는 거의 의미가 없었습니다.

Spring Boot 어노테이션 프로세서 역시 빌드하는 동안 오직 사용하므로 제거하게 됩니다.

코드가 없는 고유한 스타터 POM이 있는 경우 Spring-Boot-Jar-Type 항목을 매니페스트에 추가할 수 있습니다."dependencies-starter" 값을 갖는 MF. 주석 프로세서를 필터링하려면 "어노테이션-프로세서" 값으로 동일한 속성을 추가할 수 있습니다.

추가적인 Application Config 삽입

spring.config.use-legacy-processing 를 True 처리하지 않았다면, 추가 정보들이 application.properties or application.yml 자동으로 추가되서 들어가집니다.

짜잘한 업데이트들

링크

의존성 업데이트

2.4버전으로 업데이트 하면서, 다음 스프링 프로젝트를 새로운 버전으로 업데이트 시켰습니다.

또한 서드파티 의존성 역시 업데이트 처리되었습니다. 몇몇 패키지는 새로운점이 추가되었으므로 링크를 확인해보시길 바랍니다.