https://github.com/spf13/viper
설정 관리 모듈로 flag, 환경 변수, 설정 파일, kv 스토리지 등을 통하여 설정들을 가져올 수 있는 기능을 제공
Set
함수를 통해 설정된 값.
├── config.yaml
├── go.mod
└── main.go
package main
import (
"fmt"
"github.com/fsnotify/fsnotify"
"github.com/spf13/viper"
)
// Config 는 설정 값의 예시
type Config struct {
Name string `yaml:"name"`
}
func main() {
// *viper.Viper 초기화
viperConfig := viper.New()
// 설정 파일의 디렉토리 세팅
viperConfig.AddConfigPath(".")
// 설정 파일명 세팅
viperConfig.SetConfigFile("config.yaml")
// 설정 파일 읽어오기
err := viperConfig.ReadInConfig()
if err != nil {
fmt.Println("Error on Reading Viper Config")
panic(err)
}
var config Config
// 읽어온 설정값을 config 로 언마샬
err = viperConfig.Unmarshal(&config)
if err != nil {
fmt.Println("Error on Unmarshal Viper Config")
panic(err)
}
fmt.Println(config)
// viperConfig 에서 감지하고 있는 설정들에 변경 사항 감지 시 콜백 함수를 호출
viperConfig.OnConfigChange(func(e fsnotify.Event) {
// 위와 같이 (viperConfig.ReadInConfig() 부터 viperConfig.Unmarshal() 까지) 설정 반영
})
}
Unmarshal 할 구조체가 다른 구조체를 품고 있을 때 viperConfig.Get(\<Key\>)
로 내부 구조체의 값을 가져오고 싶을 때 기본적인 구분자는 .
type Tire struct {
Color string `yaml:"color"`
}
type Car struct {
tire Tire `yaml:"tire"`
}
viperConfig.Get("tire.color")
를 통하여 값을 가져올 수 있음viperConfig.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))
OnConfigChange
함수를 통하여 설정 변경 감지를 지원
하지만 사용하기 힘듦
OnConfigChange
함수의 경우 우리가 작성한 어플리케이션 코드에서 직접 호출하는 것이 아니다보니 호출 타이밍을 예측하기 어렵기 때문에 보다 동시성에 주의해서 작성해야 됨