본문 바로가기
Spring

Spring - @ConfigurationProperties 사용방법 정리 및 @ConstructorBinding

by devLog by Ronnie's 2023. 2. 25.

@ConfigurationProperties은 *.properties or *.yml 파일에 있는 property를 자바 클래스에 값을 가져와 사용할 수 있게 해주는 어노테이션이다. @Value를 통해서도 값을 가지고 올 수 있지만 클래스 파일로 관리할 수 있다는 점에서 차이가 있다.

 

스프링부트 2.2 버전 전 후로 사용방법에 차이가 있어 내용을 정리함과 동시에 @ConstructorBinding 어노테이션에 대해서도 정리한다.

 

Spring - @ConfigurationProperties 사용방법 정리 및 @ConstructorBinding

 

Spring - @ConfigurationProperties 사용방법 정리 및 @ConstructorBinding

 

@ConfigurationProperties 스프링부트 2.2 버전 이전 사용방법


기존에는 @ConfigurationProperties 사용하기 위해서는 @ConfigurationProperties와 같이 @Component 어노테이션을 같이 선언을 해주거나 아니면 @EnableConfigurationProperties 어노테이션을 통해 바인딩 받는 클래스를 모두 적어줬어야 했다.

 

먼저 @ConfigurationProperties을 사용하기 위해서는 클래스를 하나 만들고 @ConfigurationProperties 어노테이션을 작성하면 다음과 같은 경고창을 볼 수 있다.

해당 내용은 @EnableConfigurationProperties를 통해 등록되지 않았거나 @ConfigurationPropertiesScan을 통해 검색되지 않는다는 내용이다.

 

위에서 말한 대로 @Component를 같이 사용하거나 @EnableConfigurationProperties 를 사용해야 된다.

 

@Component 사용 시

@EnableConfigurationProperties 사용 시

이후 Properties Class의 바인딩 받을 변수들을 선언해준다.

@Component

@ConfigurationProperties("binding.language")

class BeforeBindingProperties {

lateinit var a: String

lateinit var b: String

lateinit var c: String

}

 

 

자 이제 테스트를 해보려고 하니 인텔리제이에 Spring Boot Configuration Annotation Processor가 설정되지 않았다고 뜬다.

스프링 docs에 설명을 보면 spring-boot-configuration-processor를 통해 @ConfigurationProperties 어노테이션이 붙은 클래스에 대해서 생성을 도와준다고 한다. configuration metadata file에 생성을 도와줌.

 

다음 의존성을 추가해준다.

annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")

 

자 이제 설정을 끝마쳤으니 application.yml에 작성한 값들을 바인딩해서 잘 가져오는지 테스트 해본다.

 

application.yml 테스트를 위해 다음과 같이 작성한다.

테스트 코드를 작성하여 확인을 해본다.

잘 되는 것을 확인할 수 있고 이렇게 사용해도 동작에는 문제가 없지만 이 글의 중요 내용은 바로@ConfigurationPropertiesScan을 사용하여 @ConstructorBinding을 쓰기 위함에 있다.

 

 

@ConfigurationPropertiesScan 과 @ConstructorBinding


@ConfigurationPropertiesScan은 스프링부트 2.2버전 이후에 등장했다.

@ConfigurationPropertiesScan 선언 후 프로퍼티 객체를 보면 이전과 다르게 @Component나 @EnableConfigurationProperties 를 선언하지 않아도 알아서 바인딩해준다.

 

Immutable 한 프로퍼티 지원


이렇게만 사용해도 바인딩해서 사용하는데는 문제가 없지만  @ConfigurationPropertiesScan을 쓰게 되면 @ConstructorBinding을 사용할 수 있어 생성자를 통해서 프로퍼티를 바인딩 할 수 있다.

 

이 말은 즉 Immutable한 프로퍼티를 지원 가능하다는 말이다.

 

기존에 사용하던 방식은 setter를 통해 바인딩이 되는 형태라 수정도 가능하다는 말이 되는데 이렇게 되면 Immutable 하지 않기 때문이다.

 

결론은 @ConfigurationPropertiesScan을 사용하게 되면 @ConstructorBinding을 사용할 수 있어 Immutable을 보장하는 Properties 객체를 만들수 있다는 점이다.

 

참고로 @EnableConfigurationProperties(BeforeBindingProperties::class)을 사용해서도 @ConstructorBinding을 사용할 수 있지만 프로퍼티 클래스가 많아지게 되면 코드가 무거워지는 한계가 있어 권장하지는 않는다. (일일히 다 선언 필요.)

 

 

참고


https://docs.spring.io/spring-boot/docs/current/reference/html/configuration-metadata.html#appendix.configuration-metadata.annotation-processor

 

Configuration Metadata

Configuration metadata files are located inside jars under META-INF/spring-configuration-metadata.json. They use a JSON format with items categorized under either “groups” or “properties” and additional values hints categorized under "hints", as sh

docs.spring.io

 

댓글