[go] go 언어에서의 플래그 관련 패턴과 아키텍처

Go 언어에서는 플래그(Flag)를 사용하여 프로그램 실행 시의 옵션을 설정할 수 있습니다. 플래그를 효과적으로 활용하기 위해 패턴과 아키텍처를 몇 가지 제안 드리겠습니다.

1. 플래그 사용하기

플래그를 사용하려면 flag 패키지를 import하여 플래그를 정의하고 값을 설정할 수 있습니다. 아래는 간단한 예제입니다.

package main

import (
	"flag"
	"fmt"
)

func main() {
	wordPtr := flag.String("word", "hello", "a string")
	numbPtr := flag.Int("numb", 42, "an int")
	boolPtr := flag.Bool("fork", false, "a bool")

	flag.Parse()

	fmt.Println("word:", *wordPtr)
	fmt.Println("numb:", *numbPtr)
	fmt.Println("fork:", *boolPtr)
}

위 예제에서는 flag.String, flag.Int, flag.Bool과 같은 함수를 사용하여 각각의 플래그를 정의하고, flag.Parse()를 호출하여 커맨드 라인 인자를 파싱합니다.

2. 환경 변수와 설정 파일

플래그 외에도 환경 변수나 설정 파일을 통해 옵션을 설정할 수 있습니다. viper와 같은 라이브러리를 사용하면 플래그, 환경 변수, 설정 파일을 일관된 방식으로 다룰 수 있습니다.

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

func main() {
	viper.SetConfigName("config")
	viper.AddConfigPath("/etc/appname/")
	viper.AddConfigPath(".")
	err := viper.ReadInConfig()

	if err != nil {
		panic(fmt.Errorf("Fatal error config file: %s \n", err))
	}

	fmt.Println("Using config:", viper.ConfigFileUsed())
}

3. 싱글톤 패턴과 플래그

어떤 옵션을 프로그램 전역에서 사용해야 하는 경우, 해당 옵션을 싱글톤으로 관리하는 패턴을 고려할 수 있습니다. 아래는 싱글톤 패턴을 적용한 플래그 관리 예제입니다.

package main

var (
    flagValue string
)

func GetFlagValue() string {
    return flagValue
}

func SetFlagValue(newValue string) {
    flagValue = newValue
}

이처럼 플래그를 싱글톤으로 관리하면 전역적으로 사용할 수 있으며, 응용 프로그램 내의 여러 모듈에 걸쳐 일관된 값을 제공할 수 있습니다.

위의 패턴과 아키텍처를 활용하여 Go 언어에서 플래그를 효율적으로 활용할 수 있습니다.

참고 자료