Go Viper - Config file 읽어오기

하설·2023년 7월 6일
0

참고자료

https://github.com/spf13/viper

Viper 란

설정 관리 모듈로 flag, 환경 변수, 설정 파일, kv 스토리지 등을 통하여 설정들을 가져올 수 있는 기능을 제공

설정된 값의 우선순위

  1. 코드 내에서 Set 함수를 통해 설정된 값
  2. cli 커맨드 상의 flag
  3. 환경 변수
  4. 설정 파일
  5. kv 스토리지
  6. default

예시

프로젝트 디렉토리 구조

.
├── config.yaml
├── go.mod
└── main.go

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() 까지) 설정 반영
	})
}

추가 설명

1. nested struct 의 값 가져오기

Unmarshal 할 구조체가 다른 구조체를 품고 있을 때 viperConfig.Get(\<Key\>) 로 내부 구조체의 값을 가져오고 싶을 때 기본적인 구분자는 .

예시
type Tire struct {
	Color string `yaml:"color"`
}

type Car struct {
	tire Tire `yaml:"tire"`
}
  • 위 코드에서 Car 이 Config 라고 가정한다면 타이어의 색을 알기 위해서는 viperConfig.Get("tire.color") 를 통하여 값을 가져올 수 있음
  • 환경 변수로부터 값을 가져올 때 Key 의 구분자를 변경할 수 있음
    - 정확하게는 구분자 설정을 바꾸는 것이 아닌 string replacer 를 통하여 값을 변경해주는 것
viperConfig.SetEnvKeyReplacer(strings.NewReplacer(".", "_"))

2. 설정 변경 감지

OnConfigChange 함수를 통하여 설정 변경 감지를 지원
하지만 사용하기 힘듦

사용하기 힘든 이유
  1. 설정 값이 변경하였다 하더라도 그 변경된 설정 값이 어플리케이션에 반영하는 것은 별도로 설정해야 됨
  2. 시스템 안정성 측면에서 최초 설정 이후 설정 값을 변경하기 어려운 것이 유리
    • 만약 변경이 쉽게 가능하여야한다면 차라리 해당 설정 값을 DB 혹은 별도로 관리하는 것이 운영성 측면에서도 더 유리
  3. OnConfigChange 함수의 경우 우리가 작성한 어플리케이션 코드에서 직접 호출하는 것이 아니다보니 호출 타이밍을 예측하기 어렵기 때문에 보다 동시성에 주의해서 작성해야 됨

참고하면 좋을 자료

https://github.com/notaryproject/notary/blob/1062e481efc6f3b4995fb3b04812ac3a4fe6791e/utils/configuration.go#L204

profile
리자몽이 되고픈 파이리 데이터 엔지니어

0개의 댓글