Develop/kotlin

[Kotlin] Application 설정값 가져오는 방법 - ConfigurationProperties로 구성

에디개발자 2021. 5. 17. 07:00
반응형

나를 닮았다고 한다...

이번 글에서는 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

- https://docs.spring.io/spring-boot/docs/2.2.1.RELEASE/reference/html/spring-boot-features.html#boot-features-kotlin-configuration-properties

반응형

'Develop > kotlin' 카테고리의 다른 글

Kotlin (꿀)Tips!  (0) 2022.04.18
Querydsl-JPA 코틀린스럽게 작성하기 ( 설정 포함 )  (1) 2021.04.29