Go 에서 환경변수 다루기
목차
Go로 개발할 때 환경변수를 어떻게 관리할 지 한번쯤은 고민을 해보셨을 겁니다
Node.js 나 Python 진영에서 사용하는 방법처럼 .env 파일을 사용해서 읽어오거나
표준 라이브러리인 os.Getenv 를 사용해서 환경변수를 다루시는 분들도 있으실 거에요
저는 개인적으로,
Go에서는 OS(Environment Variable)을 사용하는 것이 더 표준에 가깝다고 생각해요.
.env파일은 편의용으로는 괜찮지만, 운영 표준은 아니라고 봐요.
OS 환경변수를 사용하는 이유 #
Go는 운영체제와 아주 밀접하게 설계된 언어 같아요
파일, 네트워크, 프로세스 같은 것들을 직접 다루는 표준 패키지가 준비되어 있고, 환경변수도 마찬가지로 os 패키지에서 바로 접근할 수 있습니다
port := os.Getenv("PORT")
if port == "" {
port = "8080"
}
fmt.Println("Server running on port:", port)
별도의 설정 파일이나 외부 의존성 없이, 운영체제에서 바로 값을 받아오는 게 가장 단순하고 직관적인 방법이라고 생각해요
OS 환경변수를 표준이라고 볼 수 있나 #
운영 환경에서는 .env 파일을 직접 읽지 않아도 이미 환경변수를 관리할 수 있는 방법이 충분히 준비되어 있습니다.
| 환경 | 설정 방식 |
|---|---|
| systemd | EnvironmentFile |
| Docker | –env, –env-file |
| kubernetes | env, envFrom |
어플리케이션 코드레벨에서 .env 를 직접 읽지 않아도 운영체제나 컨테이너 레벨에서 이미 표준화된 방식으로 주입할 수 있어요.
개발환경을 고려한 환경변수 다루기 #
개발환경에서는 OS환경변수를 일일이 export 하기 번거스러워요
이때는 godotenv 라이브러리를 사용하면 편하게 .env 파일을 읽어서 os.Getenv()로 접근할 수 있어요
package main
import (
"fmt"
"os"
"github.com/joho/godotenv"
)
func main() {
if os.Getenv("APP_STAGE") == "dev" {
_ = godotenv.Load(".env.dev")
}
port := os.Getenv("PORT")
dbURL := os.Getenv("DB_URL")
fmt.Println("PORT:", port)
fmt.Println("DB_URL:", dbURL)
}
모든 변수를 export 하는 것 보다 APP_STAGE=dev go run main.go로 실행하면 되니 훨씬 편해졌어요^^