Skip to main content

viper로 설정 관리하기


viper 설정 우선순위

  1. Set으로 설정한 값
  2. flag
  3. 환경 변수
  4. 설정파일
  5. 키/값 저장소
  6. 기본값

설정파일

viper.SetConfigName(".env") // 확장자를 제외한 파일명을 적습니다.
// 확장자가 없다면 명시적으로 설정해줘야 합니다.
// "json", "toml", "yaml", "yml", "properties", "props", "prop", "env", "dotenv"
viper.SetConfigType("dotenv")
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")
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)