Spring/Spring 이야기

@ConfigurationProperties (Spring Boot)

seungdols 2022. 9. 28. 23:34
kafka:  
  topic: {topic name}
  producer-config:  
    bootstrap.servers: {server info}
    key.serializer: org.apache.kafka.common.serialization.StringDeserializer  
    value.serializer: org.apache.kafka.common.serialization.StringDeserializer  
    acks: all  
    batch.size: 16384  
    linger.ms: 1000

위와 같은 정보를 클래스 형태로 가져오고 싶다면 어떻게 해야 할까?
이럴때 쓸 수 있는 것이 @ConfigurationProperties 이다.

kotlin에서 특히나 불변 값으로 가져오고 싶다면, @ConstructorBinding을 추가하면 된다.

@ConfigurationProperties("kafka")  
@ConstructorBinding  
data class KafkaProperties(  
    val topic: String,  
    val producerConfig: Properties  
)
@SpringBootApplication  
@EnableConfigurationProperties(KafkaProperties::class)  
class Application 

위처럼 Application 레벨에서 특정 클래스만 사용하도록 설정 할수도 있으나, @ConfigurationPropertiesScan으로 자동으로 등록 모두 등록 되도록 할 수도 있다.

import org.assertj.core.api.Assertions.assertThat  
import org.junit.jupiter.api.Test  
import org.springframework.boot.context.properties.EnableConfigurationProperties  
import org.springframework.boot.test.context.SpringBootTest  
import org.springframework.test.context.TestConstructor  
import org.springframework.test.context.TestPropertySource  

@SpringBootTest  
@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL)  
@EnableConfigurationProperties(value = [KafkaProperties::class])
@TestPropertySource("classpath:application.yml")  
internal class KafkaPropertiesTest(  
    val kafkaProperties: KafkaProperties  
) {  
    @Test  
    internal fun `kafka properties를 정상적으로 로드하면, topic이 빈문자열이 아니다`() {  
        assertThat(kafkaProperties.topic).isNotEmpty  
    }  

    @Test  
    internal fun `kafka properties를 정상적으로 로드하면, kafka producerConfig는 null이 아니다`() {  
        assertThat(kafkaProperties.producerConfig).isNotNull  
    }  
}

삽질 - 네이밍이 틀리면, 오류가 난다.

@ConfigurationProperties("kafka")  
@ConstructorBinding  
data class KafkaProperties(  
    val topic: String,  
    val properties: Properties  
)

val properties: Properties이렇게 적어놓고, yaml의 producer-config 하위 정보를 가져오려고 했었다.

망각은 금물이다.

반응형