본문 바로가기

프로그래밍/golang

[Golang] flag를 활용한 CLI 옵션 처리

golang

Go 프로젝트를 진행하다 보면 실행 시점에 설정 값을 동적으로 변경해야하는 상황을 자주 마주치게 됩니다.
예를 들어 "서버 포트나 실행 모드(dev/prod), 특정 기능의 활성화 여부 등"을 코드 수정 없이 제어하고 싶을 때가 있습니다.
이러한 경우에 Go에서 제공하는 'flag' 패키지를 활용하여 CLI 옵션을 처리할 수 있습니다.

 

1. flag 패키지란?

'flag' 패키지는 Go에서 기본적으로 제공하는 CLI 옵션 파싱 도구입니다.
프로그램 실행 시 전달 되는 파라미터를 쉽게 처리 할 수 있도록 도와줍니다.

 

2. 사용방법

간단한 예제를 통해서 살펴보겠습니다.

 

package main

import (
	"flag"
	"fmt"
)

func main() {
	// flag 정의: (이름, 기본값, 설명)
	// flag 패키지는 설정값을 포인터(*int, *string)로 반환합니다.
	port := flag.Int("port", 8080, "서버 실행 포트")
	mode := flag.String("mode", "dev", "실행 모드 (dev/prod)")

	// 반드시 호출해야 파싱이 시작됩니다.
	flag.Parse()

	// 포인터이므로 역참조(*)를 통해 값을 가져옵니다.
	fmt.Printf("포트: %d\n", *port)
	fmt.Printf("모드: %s\n", *mode)
}

 

 

- 실행 명령어

go run main.go -port=9000 -mode=prod

 

- 출력 결과

port: 9000
mode: prod

 

- 도움말

go run main.go --help

 

 

3. 언제 flag를 사용해야 할까?

  • 서버 실행 포트 변경
  • 실행 모드 설정 변경 (dev / prod)
  • 디버그 옵션 활성화

위 사항과 같이 실행 시점에 바뀔 수 있는 값들을 다룰 때 주로 사용됩니다.

즉 실행 환경에 따라 수시로 변할 수 있는 운영적 요소를 다룰 때 적합합니다.

4. env와 차이점

  env flag
목적 시스템 환경 설정 실행 시점의 옵션 설정
변경 시점 프로그램 실행 전 (파일 불러오기) 프로그램 실행 시
사용 대상 DB,API_KEY 등 민감정보 port, mode 등 운영 옵션

 

외부로 유출되면 안 되는 민감 정보는 .env 파일로 관리
실행 때마다 유연하게 바꾸고 싶은 운영 옵션은 flag로 관리

 

5. 코드 보러 가기

https://github.com/reochoi109/go-handbook/blob/main/flag/basic/main.go

 

go-handbook/flag/basic/main.go at main · reochoi109/go-handbook

A personal handbook of Go patterns and best practices. Lightweight, practical code snippets for real-world backend development. - reochoi109/go-handbook

github.com