이번 글에서는 Kotlin에서 아래의 application.yml의 설정값을 읽어오는 방법을 정리해보겠습니다. 이 글에서 사용하는 설정방법은 SpringBoot 2.2.1 이상 버전부터 지원가능한 방법입니다.
모든 소스는 Github에 올려두었습니다.
Application.yml
sample:
kotlin:
language: kotlin
study-days: 30
java:
language: java
study-days: 90
test: javaTest
build.gradle.kts
아래의 디펜던시가 추가되있어야 ConfigurationProperties를 사용할 수 있습니다.
dependencies {
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
}
SampleProperties.kt
Application.yml에서 설정 정보를 매핑할 객체를 생성합니다.
아래의 코드를 생성하면 ConfigurationProperties에서 에러가 발생합니다. 에러를 무시하고 하단의 설정을 계속 진행하시면 발생한 에러는 사라집니다.
@ConstructorBinding // 1)
@ConfigurationProperties(prefix = "sample") // 2)
data class SampleProperties (
val kotlin: KotlinProperties,
val java: JavaProperties
) {
data class KotlinProperties(
val language: String,
val studyDays: Int
)
data class JavaProperties(
val language: String,
val studyDays: Int,
val test: String
)
}
1) SpringBoot 2.2.1 부터 지원되는 기능으로 따로 Component 어노테이션을 선언하지 않고 빈에 등록해주며 생성자 바인딩 시켜주는 어노테이션입니다.
2) Application.yml 에서 prefix "sample"인 설정정보를 읽어옵니다.
Tip!
Application.yml 에 설정 키 값에 "-"가 들어갈 경우 camel 케이스로 작성해주시면 매핑시켜줍니다.
MainApplication.kt
ConfigurationProperties를 스캔하는 어노테이션을 추가합니다. ( 여기까지 작업하셨다면 위에서 발생했던 에러는 사라집니다. )
@ConfigurationPropertiesScan // 추가
@SpringBootApplication
class SampleApplication
fun main(args: Array<String>) {
runApplication<SampleApplication>(*args)
}
사용
Bean에 등록된 설정 정보를 가지고 있는 객체를 불러와 사용합니다.
@RestController
@RequestMapping("/sample")
class SampleController(
val sampleProperties: SampleProperties
) {
@GetMapping
fun getSetting() = sampleProperties.kotlin.language
}
Test Code
테스트 코드에서 확인하시려면 몇가지 설정을 추가적으로 해주셔야합니다.
@SpringBootTest
@TestConstructor(autowireMode = TestConstructor.AutowireMode.ALL)
@EnableConfigurationProperties(SampleProperties::class)
@TestPropertySource("classpath:application.yml")
internal class SamplePropertiesTest(
val sampleProperties: SampleProperties
) {
@Test
fun `properties 조회`() {
assertThat(sampleProperties.kotlin.language).isEqualTo("kotlin")
assertThat(sampleProperties.kotlin.studyDays).isEqualTo(30)
assertThat(sampleProperties.java.language).isEqualTo("java")
assertThat(sampleProperties.java.studyDays).isEqualTo(90)
assertThat(sampleProperties.java.test).isEqualTo("javaTest")
}
}
- @SpringBootTest : Bean 객체를 컨테이너에 올려 테스트하기 위한 설정
- @TestConstructor : Constructor에 있는 속성값들에 빈주입하는 설정. ( 개인취향이므로 따로 @Autowired로 사용해도 무방 )
- @EnableConfigurationProperties : 테스트 타겟인 설정 객체를 선언하면 테스트 코드에서 설정 객체에 매핑
- @TestPropertySource : 테스트 타겟인 설정값들이 담기 yml파일 정보 세팅
테스트 코드를 실행하면 정상작동을 확인할 수 있습니다.
Reference
- https://www.baeldung.com/spring-boot-testing-configurationproperties
'Develop > kotlin' 카테고리의 다른 글
Kotlin (꿀)Tips! (0) | 2022.04.18 |
---|---|
Querydsl-JPA 코틀린스럽게 작성하기 ( 설정 포함 ) (1) | 2021.04.29 |