
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
'프로그래밍 > golang' 카테고리의 다른 글
| [Golang] Slog를 활용한 로그 샘플링 구현하기 (0) | 2026.03.18 |
|---|---|
| [Golang] Slog를 활용한 마스킹 핸들러 구현 (0) | 2026.03.18 |
| [Golang] 표준 로깅 라이브러리 Slog (0) | 2026.03.18 |
| [Golang] logrus로 구조화된 로깅 구현 (0) | 2026.03.18 |
| [Golang] godotenv을 활용한 .env설정 관리 (0) | 2026.03.18 |