인프런 커뮤니티 질문&답변

PrivilegeEscalate님의 프로필 이미지
PrivilegeEscalate

작성한 질문수

스프링 부트 - 핵심 원리와 활용

외부설정 사용 - @ConfigurationProperties 시작

현재 SpringBoot 3.2.1 부터 @ConfigurationProperties 를 사용한 설정값 바인딩에 이슈가 있는것 같습니다.

해결된 질문

작성

·

2.8K

·

수정됨

1

안녕하세요! 질문 내용은 제목과 같습니다. 스프링부트 3.2.1 부터 @ConfigurationProperties 가 동작하지 않는것 같습니다. 확실하지 않지만 스텍오버플로우에도 비슷한 이슈가 올라온 상태인것 같습니다. https://stackoverflow.com/questions/77703018/spring-boot-3-2-1-properties-binding

 

스프링부트 3.2.1 에서 저는 아래와 같은 익셉션이 발생합니다,

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.2.1'
    id 'io.spring.dependency-management' version '1.1.4'
}
token:
  expired: 20s
  secret-key: test-key
@ToString
@AllArgsConstructor
@ConfigurationProperties(prefix = "token")
public class TokenProperties {

    private Duration expired;
    private String secretKey;

}
@Slf4j
@RequiredArgsConstructor
@Component
@EnableConfigurationProperties(TokenProperties.class)
public class TokenConfiguration {

    private final TokenProperties tokenProperties;

    @PostConstruct
    void init() {
        log.info("tokenProperties = {}", tokenProperties);
    }
}
***************************
APPLICATION FAILED TO START
***************************

Description:

Failed to bind properties under 'token' to revi1337.configurationpropertiesdemo.property.TokenProperties:

    Reason: java.lang.IllegalStateException: Unable to create instance for revi1337.configurationpropertiesdemo.property.TokenProperties

This may be due to missing parameter name information

Action:

Update your application's configuration




이 상태에서 스프링 버전을 3.1.5 으로 다운그레이드하면 정상동작합니다.

plugins {
    id 'java'
    id 'org.springframework.boot' version '3.1.5'
    id 'io.spring.dependency-management' version '1.1.4'
}

 

현재 스프링 3.2.1 에서 뭐 바뀐게 있을까요? 제가 무언가를 잘못했을 확률이 대단히 높지만 제가 찾아볼때는 명확한 해결방법이 3.1.5 로 다운그레이드하는 방법밖에 나오지가 않네요.. 확인좀 부탁드리곘습니다

답변 1

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. PrivilegeEscalate님

스프링 부트 3.2부터 발생하는 이슈인데요.

다음에 해결 방안을 정리해두었습니다 🙂

https://docs.google.com/document/d/1j0jcJ9EoXMGzwAA2H0b9TOvRtpwlxI5Dtn3sRtuXQas/edit#heading=h.b1yk4ued1pxo

 

관련 내용

해결 방안3(권장)

Gradle을 사용해서 빌드하고 실행한다.

참고로 이 문제는 Build, Execution, Deployment -> Build Tools -> Gradle에서
Build and run using를 IntelliJ IDEA로 선택한 경우에만 발생한다. Gradle로 선택한 경우에는 Gradle이 컴파일 시점에 해당 옵션을 자동으로 적용해준다.

 

문제 원인

공식 링크: https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-Spring-Framework-6.x#parameter-name-retention

자바를 컴파일할 때 매개변수 이름을 읽을 수 있도록 남겨두어야 사용할 수 있다. 컴파일 시점에 -parameters 옵션을 사용하면 매개변수 이름을 사용할 수 있게 남겨둔다.

스프링 부트 3.2 전까지는 바이트코드를 파싱해서 매개변수 이름을 추론하려고 시도했다. 하지만 스프링 부트 3.2 부터는 이런 시도를 하지 않는다.

 

감사합니다.

죄송합니다. 답변을 이제야 봤습니다. Build and run using 를 기존 Gradle 을 선택해주면 테스트코드 실행 및 애플리케이션 실행시 조금 느려지는것은 감수해야하는것일까요?

특히나 테스트 코드를 실행할때 Gradle 로 실행하면 속도가 매우 느린것으로 기억합니다 ㅠ

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. PrivilegeEscalate님

Gradle의 경우 캐싱 기능이 있어서 두번째 실행하는 경우에는 어느정도 속도가 나옵니다.

그래도 답답하다면 해결방안에 있는 해결방안 2를 선택하시면 됩니다.

감사합니다.

오.. 굉장히 빠른 답변 감사합니다.

PrivilegeEscalate님의 프로필 이미지
PrivilegeEscalate

작성한 질문수

질문하기