코틀린 스프링을 한 번 체험해보고 싶어서 인프런 무료 강의를 수강했습니다.
이 강의 중간에 카카오 다음 검색 API 사용하는부분이 있는데,
KAKAO API KEY를 application.yml에 작성하고 @Value annotation 으로 가져와서 사용하는 것으로 설명이 나옵니다.
Node.js 에서 .env 환경변수를 사용하는것처럼 application.yml 을 여러개의 파일로 나누고 기본적인 application.yml만 깃허브에 업로드하고, KAKAO API KEY 는 제가 임의로 생성한 secret.yml 에 작성하여 깃허브에 올리고 싶지 않았습니다.
그래서 yml 을 여러개 사용하는 방법을 찾아보다가 스프링에서는 불변객체로 만들어서 사용할수도 있다는 것을 알았습니다.
일단 yml을 작성하고, 불변객체를 만들어 보았습니다.
// resources/secret.yml
secret:
kakaoApiKey: 나의kakaoApiKey
// com.example.study.blog/SecretProperties
package com.example.study.blog
import org.jetbrains.annotations.NotNull
import org.springframework.boot.context.properties.ConfigurationProperties
@ConfigurationProperties("secret")
data class SecretProperties(
@field:NotNull
val kakaoApiKey: String
) {
}
// com.example.study/StudyApplication.kt
package com.example.study
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.context.properties.ConfigurationPropertiesScan
import org.springframework.boot.runApplication
@ConfigurationPropertiesScan
@SpringBootApplication
class StudyApplication
fun main(args: Array<String>) {
runApplication<StudyApplication>(*args)
}
불변객체를 만들때 @ConstructingBinding annotation 을 사용하라는 블로그 글이 엄청 많은데, 이건 최신버전에서 사용할 수 없습니다. 테스트 해보니 사용하지 않아도 불변객체로 처리됩니다.
그리고 properties를 빈에 등록 할 때 @EnableConfigurationProperties와 @ConfigurationPropertiesScan 을 사용할 수 있는데, 처음에는 어떤 properties를 사용할 것인지 명시해줄 목적으로 @EnableConfigurationProperties를 사용했습니다. 참조
하지만, 다른 블로그 글을 보니 properties가 많아지게되면 코드 수정이 많아질것으로 예상되고, 어차피 properties 파일을 한 곳에 모아두니 @ConfigurationPropertiesScan을 사용하는 것이 더 좋겠다는 생각이 들었습니다. @ConfigurationPropertiesScan이 이런 문제를 해결하기 위해 나온 최신 기술인것같기도 하구요. 그래서 @ConfigurationPropertiesScan를 사용했습니다.
이렇게 실행해보니 secret이 없다는 에러가 발생하고 서버가 켜지지 않았습니다.
application.yml 만 기본적으로 인식을 하고, 다른 파일 이름.yml 은 인식하지 못해서 발생한 에러였습니다.
그래서 파일 경로를 지정해주는 방법이 없을까 하다가 PropertySource라는것을 발견했는데, 이것은 .properties 파일을 위한것이여서 .yml 을 불러오는 것에는 아예 무시가 됐습니다. 참조
그래서 application.yml에 secret.yml 을 불러와서 합쳐주는 방식을 사용했습니다. 참조
// application.yml
spring:
config:
import:
- secret.yml
production, development 등과 같은 환경을 나눌때는 profile 을 사용하면 좋을거같습니다.
참조1