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
하위 정보를 가져오려고 했었다.
망각은 금물이다.
반응형