๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Programming/Django

๐Ÿ’ก getenv๋ž€? ํ™˜๊ฒฝ ๋ณ€์ˆ˜์™€ Django ์„ค์ •์˜ ์—ฐ๊ฒฐ๊ณ ๋ฆฌ

by Mandy's 2025. 7. 30.

๐Ÿงฉ 1. getenv๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

from os import getenv

getenv()๋Š” ์šด์˜์ฒด์ œ์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜(environment variable) ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.
์ฆ‰, ์„œ๋ฒ„๋‚˜ ์šด์˜์ฒด์ œ์— ์ €์žฅ๋œ ์„ค์ • ๊ฐ’์„ Python ์ฝ”๋“œ์—์„œ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๊ธฐ๋Šฅ์„ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ:

export DEBUG=True
from os import getenv
print(getenv("DEBUG"))  # "True"

ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” .env ํŒŒ์ผ์ด๋‚˜ ํด๋ผ์šฐ๋“œ ์„œ๋ฒ„ ์„ค์ •, CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๋“ฑ์—์„œ๋„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”!


๐Ÿ› ๏ธ 2. ์™œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์จ์•ผ ํ• ๊นŒ์š”?

ํ•˜๋“œ์ฝ”๋”ฉ๋œ ๋ฏผ๊ฐ ์ •๋ณด(์˜ˆ: SECRET_KEY, DB ๋น„๋ฐ€๋ฒˆํ˜ธ)๋Š” ๊นƒํ—ˆ๋ธŒ์— ํ‘ธ์‹œ๋˜๋ฉด ๋ณด์•ˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋Š” ์ฝ”๋“œ์™€ ๋ถ„๋ฆฌ๋œ ์™ธ๋ถ€ ์„ค์ •์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค:

ํ•ญ๋ชฉ ํ•˜๋“œ์ฝ”๋”ฉ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์‚ฌ์šฉ

ํ•ญ๋ชฉ ํ•˜๋“œ์ฝ”๋”ฉ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์‚ฌ์šฉ
๋ณด์•ˆ โŒ ํ‚ค ์œ ์ถœ ์œ„ํ—˜ โœ… ๋น„๊ณต๊ฐœ ์œ ์ง€
์œ ์—ฐ์„ฑ โŒ ๊ฐœ๋ฐœ/๋ฐฐํฌ ๋ถ„๋ฆฌ ์–ด๋ ค์›€ โœ… ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ์ž๋™ ์„ค์ •
๊ด€๋ฆฌ โŒ ์ˆ˜๋™ ์ˆ˜์ • โœ… ์„ค์ • ํŒŒ์ผ(.env)๋กœ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ

๐Ÿง‘‍๐Ÿ’ป 3. Django์—์„œ getenv ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

โœ… ๊ธฐ๋ณธ ์‚ฌ์šฉ

from os import getenv

SECRET_KEY = getenv("DJANGO_SECRET_KEY", "default-dev-key")
DEBUG = getenv("DEBUG", "False") == "True"
ALLOWED_HOSTS = getenv("APP_HOSTS", "localhost").split(",")
  • getenv("KEY", "๊ธฐ๋ณธ๊ฐ’"): ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ ์—†์„ ๊ฒฝ์šฐ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋Œ€์ฒด
  • DEBUG๋Š” ๋ฌธ์ž์—ด์ด๋ฏ€๋กœ, ๋ฐ˜๋“œ์‹œ "True" ๋ฌธ์ž์—ด๊ณผ ๋น„๊ตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • split(",")์„ ์‚ฌ์šฉํ•˜๋ฉด ์—ฌ๋Ÿฌ ํ˜ธ์ŠคํŠธ๋ฅผ ์ฝค๋งˆ๋กœ ๊ตฌ๋ถ„ํ•ด ๋“ฑ๋ก ๊ฐ€๋Šฅํ•ด์š”.

๐Ÿ—‚๏ธ 4. .env ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ์“ฐ๊ธฐ (์ถ”์ฒœ ๋ฐฉ๋ฒ•)

getenv()๋Š” ์šด์˜์ฒด์ œ์—์„œ ์ฝ์ง€๋งŒ, .env ํŒŒ์ผ์„ ์“ฐ๋ฉด ๊ฐœ๋ฐœ/์šด์˜ ํ™˜๊ฒฝ์„ ์‰ฝ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”.

๐Ÿ”ง ์„ค์น˜ ๋ฐฉ๋ฒ• (python-dotenv ์‚ฌ์šฉ)

pip install python-dotenv

๐Ÿ” ์„ค์ • ์ฝ”๋“œ

from dotenv import load_dotenv
from os import getenv
import os

load_dotenv()  # .env ํŒŒ์ผ์„ ์ž๋™์œผ๋กœ ์ฝ์Œ

SECRET_KEY = getenv("DJANGO_SECRET_KEY")
DEBUG = getenv("DEBUG", "False") == "True"

๐Ÿ“ .env ์˜ˆ์‹œ

DJANGO_SECRET_KEY=your-secret-key
DEBUG=True
APP_HOSTS=127.0.0.1,localhost

๐Ÿ“ฆ 5. ์‹ค์ œ settings.py ์ ์šฉ ์˜ˆ์‹œ

from pathlib import Path
from dotenv import load_dotenv
from os import getenv
import os

load_dotenv()

BASE_DIR = Path(__file__).resolve().parent.parent

SECRET_KEY = getenv("DJANGO_SECRET_KEY", "fallback-secret")
DEBUG = getenv("DEBUG", "False") == "True"
ALLOWED_HOSTS = getenv("APP_HOSTS", "127.0.0.1").split(",")

์ด๋ ‡๊ฒŒ ์„ค์ •ํ•˜๋ฉด settings.py๋ฅผ ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ ๋„ ํ™˜๊ฒฝ๋งˆ๋‹ค ์„ค์ •์„ ๋‹ค๋ฅด๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์–ด์š”!


๐Ÿ“Œ ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ

getenv() ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๋Š” ํ•จ์ˆ˜
์žฅ์  ๋ณด์•ˆ, ์œ ์—ฐ์„ฑ, ์œ ์ง€๋ณด์ˆ˜ ํŽธ๋ฆฌ
์ถ”์ฒœ ์‚ฌ์šฉ๋ฒ• python-dotenv + .env ํŒŒ์ผ
Django ์ ์šฉ settings.py์—์„œ ์„ค์ •๊ฐ’ ์ฝ๊ธฐ

๐Ÿ–ผ๏ธ ์ฐธ๊ณ  ๋‹ค์ด์–ด๊ทธ๋žจ: Django ์„ค์ •๊ณผ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ํ๋ฆ„