Immutable Configuration Properties

스프링 부트 2.2 부터 @ConstructorBinding을 사용하여 생성자를 가지지 않는 클래스를 작성할 수 있으며 스프링 부트 3.0 부터는 @ConstructorBinding 선언 대상이 생성자로 축소되어 아래와 같이 스프링 부트 3 에서는 생성자가 하나인 경우에는 굳이 지정하지 않는다.

Spring Boot 2.7
@Getter @RequiredArgsConstructor @ConstructorBinding @ConfigurationProperties(prefix = "feature") public class FeatureProperties { private final boolean enabled; } @ConfigurationPropertiesScan @EnableConfigurationProperties @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
Spring Boot 3.2
@Getter @RequiredArgsConstructor @ConfigurationProperties(prefix = "feature") public class FeatureProperties { private final boolean enabled; } @ConfigurationPropertiesScan @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } }
Parameter Name Discovery from Spring Boot 3.1

Ensure that your compiler is configured to use the ‘-parameters’ flag.

스프링 부트 3.2 에서 생성자 바인딩을 통해 Immutable Configuration Properties를 만드려는 경우 위와 같은 오류가 발생할 수 있다. 위 오류 메시지는 MissingParametersFailureAnalyzer 에 의해 출력되는 것으로 스프링 부트 3.2 에서 의존하는 스프링 프레임워크 버전에서 바이트코드를 분석하여 파라미터 이름을 추론해오던 LocalVariableTableParameterNameDiscoverer 클래스가 제거되어 파라미터 이름으로 추론하는 대상에 해당하는 생성자 바인딩을 위해 StandardReflectionParameterNameDiscoverer 가 사용될 수 있도록 컴파일러에 대해 -parameters 옵션을 지정해야한다.

build.gradle
// NOTE: https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-Spring-Framework-6.x#parameter-name-retention tasks.withType(JavaCompile).configureEach { options.compilerArgs.add("-parameters") }

만약, 인텔리제이를 사용하고 있으며 그래들이 아닌 Build and run using 옵션으로 Intellij IDEA를 지정하는 편이라면 자바 컴파일러 옵션에 -parameters 옵션을 별도로 설정해야한다. 자바 컴파일러 옵션에 -paramters 플래그를 설정했음에도 파라미터 이름 추론을 위한 오류가 출력된다면 인텔리제이가 생성한 out 폴더를 삭제하고 다시 빌드를 수행해보도록 하자.

Spring Boot 3.2 에서 Immutable Configuration Properties 를 사용하기 위해 생각지도 못한 삽질을 했습니다.

참고 링크