Spring

코틀린 스프링 - application.yml 여러개 사용하여 불변객체 만들기

꼰딩 2023. 8. 16. 16:42

코틀린 스프링을 한 번 체험해보고 싶어서 인프런 무료 강의를 수강했습니다.

 

인프런 강의 링크

 

[무료] [초급] 맛보자! 코틀린과 스프링으로 API 호출하기 - 인프런 | 강의

간단한 기능 구현을 통해 코틀린과 스프링 조합을 빠르게 훑어볼 수 있는 강의입니다., API를 호출하는 실습을 통해코프링을 가볍게 찍어 먹어 보세요! 🥄 [사진] 코틀린과 스프링 맛보기 🔍 요

www.inflearn.com

 

이 강의 중간에 카카오 다음 검색 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

참조2

참조3

 

전체코드