본문 바로가기

프로그래밍/golang

[Golang] godotenv을 활용한 .env설정 관리

golang

Go 프로젝트를 진행하면 처음 마주하는 고민은 아마도 프로젝트 설정 정보 관리일 것 입니다.

아직까지도 민감정보들이 Github와 같은 오픈된 환경에 노출되는 문제가 적지 않게 발생하고 있는 만큼,

민감정보인 데이터베이스 비밀번호나 API키를 관리하는것에 특히 신경을 쓸 필요가 있겠습니다.

이번 글은 Go에서 godotenv를 활용하여 설정을 안전하고 유연하게 관리하는 방법을 함께 알아봅시다. 

 

1.  환경변수 (12-Factor-App)

The Twelve-Factor App 방법론에 세 번째 원칙은 "설정(Config)을 환경(Environment)에 저장하라" 입니다.

  • 코드와 설정은 분리되어야 한다.
    코드는 환경에 상관없이 동일해야하며, 설정 값만 교체되면 로컬, 테스트, 운영환경 어디에서든 동일한 바이너리를 실행 할 수 있다.

  • 보안
    중요한 API 키를 소스 코드 내부에 하드코딩 하지 않고 환경 변수로 주입함으로써 유출 위험을 차단한다.

2.  godotenv

Go에서 환경변수를 불러올 때 가장 대중적으로 사용되는 라이브러리가 'godotenv' 입니다.

이 라이브러리는 .env 파일에 작성된 내용을 읽고 프로그램 내에서 os.Getenv로 바로 접근 할 수 있도록 환경변수에 등록해 줍니다.

 

 

2-1. 설치 방법

go get github.com/joho/godotenv



 

2-2. 구현

프로젝트 루트에 .env 파일을 생성합니다.

# .env
DB_HOST=localhost
DB_PORT=5432
API_KEY=my-secret-key-123

 

 

 

이제 Go 코드에서 .env 파일에 작성한 설정 정보들을 로드 하겠습니다.

package main

import (
	"fmt"
	"log"
	"os"

	"github.com/joho/godotenv"
)

func main() {
	// .env 파일을 로드합니다.
	err := godotenv.Load()
	if err != nil {
		log.Println("경고: .env 파일을 찾을 수 없습니다.")
	}

	// 환경변수를 불러옵니다.
	dbHost := os.Getenv("DB_HOST")
	apiKey := os.Getenv("API_KEY")

	fmt.Printf("DB Host: %s\n", dbHost)
	fmt.Printf("API Key: %s\n", apiKey)
}

 

 

 

3.  주의사항

.env 파일은 절대 Git 저장소에 올리면 안됩니다. 

저장소에는 샘플 파일만 공유하고, 실제 정보다 담겨 있는 파일은 공유하지 않습니다.
.gitignore에 .env를 반드시 추가해서 공유되지 않도록 신경써주세요.

 

샘플 파일

# .env.example
DB_HOST=
DB_PORT=
API_KEY=

 

 

 

4. 코드보러가기

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

 

go-handbook/config/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