관리 메뉴

피터의 개발이야기

[GO] Golang에서 Viper 사용하기: 설정 관리 도구 본문

Programming/GO

[GO] Golang에서 Viper 사용하기: 설정 관리 도구

기록하는 백앤드개발자 2025. 1. 10. 01:57
반응형

ㅁ 들어가며 

  Viper는 Golang 애플리케이션에서 설정 정보를 관리하는 라이브러리이다. 이 글에서는 다양한 파일 형식을 지원하고 동적으로 값을 구성할 수 있는 Viper의 사용 방법을 정리하였다.

 

ㅁViper 설치하기

go get github.com/spf13/viper

 

ㅁ 기본 사용법

구성 파일 설정

viper.SetConfigName("config") // 확장자를 제외한 구성 파일 이름
viper.SetConfigType("yaml") // 구성 파일 형식 지정 (yaml, json, toml 등)
viper.AddConfigPath("/etc/appname/") // 구성 파일을 찾을 경로 추가
viper.AddConfigPath("$HOME/.appname") // 여러 경로 추가 가능
viper.AddConfigPath(".") // 현재 작업 디렉토리에서도 찾기

err := viper.ReadInConfig() // 구성 파일 읽기
if err != nil {
    panic(fmt.Errorf("구성 파일 읽기 오류: %s", err))
}

 

기본값 설정

viper.SetDefault("ContentDir", "content")
viper.SetDefault("LayoutDir", "layouts")
viper.SetDefault("Taxonomies", map[string]string{"tag": "tags", "category": "categories"})

 

값 읽기

viper.GetString("ContentDir")
viper.GetInt("Port")
viper.GetBool("Debug")

 

ㅁ 고급 기능

 환경 변수 사용

viper.AutomaticEnv() // 환경 변수 자동 읽기
viper.SetEnvPrefix("MYAPP") // 환경 변수 접두사 설정

 

구성 파일 감시 및 실시간 재로드

viper.WatchConfig()
viper.OnConfigChange(func(e fsnotify.Event) {
    fmt.Println("구성 파일이 변경되었습니다:", e.Name)
})

ㅇ 구성 파일의 변경을 감지하고 자동으로 재로드할 수 있다.

 

구성 파일 쓰기

viper.WriteConfig() // 현재 구성을 파일로 저장
viper.SafeWriteConfig() // 파일이 존재하지 않을 경우에만 저장
viper.WriteConfigAs("/path/to/my/.config") // 특정 경로에 저장

ㅇ 새로운 구성을 파일로 저장할 수 있다.

 

ㅁ 샘플 코드 작성

package main

import (
	"fmt"
	"github.com/spf13/viper"
	"os"
)

func main() {
	fmt.Println("Hello viper")

	err := loadConfig()
	if err != nil {
		fmt.Printf("Error loading config: %v\n", err)
		return
	}

	fmt.Printf("Server Port: %s\n", viper.GetInt("server_port"))
	fmt.Printf("DB Host: %s\n", viper.Get("db_host"))
	fmt.Printf("DB Port: %s\n", viper.Get("db_port"))
}

func loadConfig() (err error) {

	// 환경변수에서 phase 값을 가져옵니다
	phase := os.Getenv("APP_PHASE")
	if phase == "" {
		phase = "dev" // 기본값 설정
	}

	// 설정 파일 이름을 동적으로 생성합니다
	viper.SetConfigName(fmt.Sprintf("application_%s", phase))
	viper.SetConfigType("yaml")
	viper.AddConfigPath(".")

	if err := viper.ReadInConfig(); err != nil {
		return fmt.Errorf("failed to read config file: %w", err)
	}

	return nil
}

ㅇ main.go 작성

 

server_port: 8080
db_host: "DBHost"
db_port: "DBPort"

ㅇ application_dev.yaml 작성

 

 

ㅁ 마무리

  Viper는 Golang 애플리케이션의 설정 관리를 편리하게 해준다. 다양한 파일 형식을 지원하고, 환경 변수 통합, 실시간 구성 변경 감지 등 다양한 기능을 통해 개발을 편리하게 한다.

 

ㅁ 함께 보면 좋은 사이트

 github - viper

개발/go - Viper

[golang 1% 이해하기] viper | dotenv 환경 변수값을 읽는 기능 도입 하기 #1 Config 전역 변수를 활용하기

ㅇ go cobra, viper 사용 시 주의점 ( 인자 / 환경변수 )

 고 (Golang) | 이것만 알면 나도 개발 전문가 | Gin 을 이용한 CRUD RESTful API 개발 Part-2

  ㄴ gin 튜토리얼 샘플 코드 발견

 

반응형
Comments