본문으로 건너뛰기

viper로 설정 관리하기

viper 설정 우선순위

  1. Set으로 설정한 값
  2. flag
  3. 환경 변수
  4. 설정파일
  5. 키/값 저장소
  6. 기본값
정보
  • 설정 key는 대소문자를 구분하지 않습니다.
  • 설정을 전달하는 방식마다 설정값을 따로 저장하고 있다가 값을 가져오는 순간 우선순위를 평가하여 값을 가져옵니다.
  • viper.Debug(): viper 설정을 출력합니다.
  • viper.AllSettings(): 최종 설정값을 리턴합니다.

설정파일

viper.SetConfigName("config") // 확장자를 제외한 파일명을 적습니다.
// 확장자가 없다면 명시적으로 설정해줘야 합니다.
// "json", "toml", "yaml", "yml", "properties", "props", "prop", "env", "dotenv"
viper.SetConfigType("yaml")
viper.AddConfigPath(".") // 설정파일을 찾을 경로를 추가합니다.

if err := viper.ReadInConfig(); err != nil {
if errors.As(err, &viper.ConfigFileNotFoundError{}) {
fmt.Println("failed to find .env file")
} else {
panic(fmt.Errorf("fatal error config file: %w", err))
}
}

환경 변수

환경 변수는 BindEnv호출 시점이 아니라 값에 접근하는 시점에 평가됩니다.

viper.SetEnvPrefix("a")
viper.BindEnv("c") // viper.BindEnv("c", "A_C")
viper.BindEnv("d") // viper.BindEnv("d", "A_D")

viper.SetEnvPrefix("b")
viper.BindEnv("c") // viper.BindEnv("c", "B_C")
viper.BindEnv("f") // viper.BindEnv("f", "B_F")

// viper.BindEnv("c", "A_C", "B_C")
// 환경변수를 읽을 때 key의 `.` 또는 `-`을 `_`로 변환하여 읽어옵니다.
// viper.Get("a.b") 를 호출하면 A_B 환경변수를 읽어옵니다.
viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_", "-", "_"))
viper.AutomaticEnv() // 환경변수를 자동으로 읽어옵니다.
  • c의 경우 A_CB_C가 모두 설정되어 있을 경우, A_C가 우선순위가 높습니다.
  • AutomaticEnv가 설정되어 있을 경우 BindEnv보다 우선순위가 높습니다.
    • SetEnvPrefix는 마지막 설정값만 유효합니다.
// 환경 변수가 빈 값으로 설정되어 있을 때, 환경 변수를 설정한 것으로 간주할지
// 여부를 결정합니다.
viper.AllowEmptyEnv(true)

flag

flag는 BindPFlag호출 시점이 아니라 값에 접근하는 시점에 평가됩니다.

pflag.String("log_level", "info", "log level")

pflag.Parse()
viper.BindPFlags(pflag.CommandLine)
flag.String("log_level", "info", "log level")

pflag.CommandLine.AddGoFlagSet(flag.CommandLine)
pflag.Parse()
viper.BindPFlags(pflag.CommandLine)