티스토리 뷰
한눈에 보기
- dotenv란? 코드 밖
.env파일에 설정값을 넣고 앱 시작 시 불러오는 방식 - 왜 쓰나? 비밀키 유출 방지, 환경별 설정 분리, 배포/테스트 자동화에 유리
- 어떻게?
.env작성 → 라이브러리 설치 → 앱 시작 시 로드 →os.environ/process.env로 사용
dotenv가 필요한 이유
- 보안: API 키·DB 비밀번호 같은 비밀값을 코드와 깃에서 분리
- 환경 분리: 개발/스테이징/운영별로 값만 바꾸면 코드 수정 없이 동작
- 배포 자동화: CI/CD, Docker 등에서 값 주입이 쉬움
빠른 시작
Python (python-dotenv)
pip install python-dotenv
# .env
SLACK_BOT_TOKEN=xoxb-xxxxxxxx
PORT=8080
# main.py
from dotenv import load_dotenv
import os
load_dotenv() # 같은 디렉터리의 `.env` 로드
token = os.getenv("SLACK_BOT_TOKEN")
port = int(os.getenv("PORT", "8000"))
if not token:
raise RuntimeError("SLACK_BOT_TOKEN 이(가) 없습니다.")
실전 사례
1) Slack 봇 토큰 안전하게 관리 (Python)
# .env
SLACK_BOT_TOKEN=xoxb-...
SLACK_SIGNING_SECRET=xxxx
# slack_bot.py
from dotenv import load_dotenv
import os
from slack_sdk import WebClient
load_dotenv()
client = WebClient(token=os.environ["SLACK_BOT_TOKEN"])
resp = client.chat_postMessage(channel="#general", text="안녕하세요! 🤖")
print(resp["ok"])
- 포인트: 예외처리를 위해
os.environ["KEY"]로 필수값 보장, 없으면 즉시 실패
베스트 프랙티스
- .gitignore 필수
# .gitignore .env .env.* !.env.example .env.example제공: 팀원이 필요한 키를 알 수 있게 샘플 값/빈 값으로# .env.example SLACK_BOT_TOKEN= SLACK_SIGNING_SECRET= DB_URL=- 필수값 검증
- Python:
pydantic-settings또는 간단한 체크 - Node:
envalid/zod로 타입·필수 여부 검사
- Python:
- 최소 권한·회전: 키는 최소 권한으로 발급, 정기적으로 로테이션
- 프런트엔드 주의: 브라우저 번들에 비밀값 포함 금지
- 운영에선 OS 환경변수 우선: 컨테이너/서버에서
.env없이 주입이 이상적
자주 겪는 오류와 해결
- 값이 안 읽힘: 앱 시작 “이후”가 아니라 “초기”에 로드해야 함
- 파일 경로: 워킹디렉터리 기준. 파일이 다른 폴더면 경로 지정
- 따옴표/공백:
KEY="value with spaces"처럼 감싸기 - 멀티라인: 가능하면 Base64로 인코딩해 한 줄로 관리
- 운영 환경에서 덮어쓰기: 동일 키는 OS 환경변수가
.env보다 우선
Docker·CI와 함께 쓰기
- Docker Compose
services: app: env_file: - .env - GitHub Actions (Secrets)
env: SLACK_BOT_TOKEN: ${{ secrets.SLACK_BOT_TOKEN }}
FAQ
- dotenv와 환경변수의 차이? dotenv는 “파일 → 환경변수로 로드”를 도와주는 도구. 실제 사용은 모두 환경변수.
- 운영에서도
.env를 써야 하나? 보통은 아님. 클라우드/오케스트레이션이 제공하는 “환경변수/시크릿” 기능을 사용 권장. - 여러 파일을 합쳐 쓰고 싶다: Node는
dotenv-flow, Python은 파일을 순서대로load_dotenv호출.
치트시트
- 문법
KEY=value KEY="value with space" # 주석 - Python
from dotenv import load_dotenv load_dotenv() os.getenv("KEY") - Node
node -r dotenv/config app.js # 또는 dotenv -e .env.production -- node app.js
마무리
- 핵심: 비밀과 설정은 코드 밖, 환경변수로. 개발은
.env, 운영은 환경 주입. - 익숙해지면: 예제 파일, 검증 도입, 자동화까지 연결하면 팀 생산성과 보안이 함께 올라갑니다.
'Python' 카테고리의 다른 글
| conda environment도 도커의 Dockerfile처럼 기술할 수 있다! (0) | 2025.10.30 |
|---|---|
| tkinter의 마우스 휠 이벤트 처리 방식은 windows와 ubuntu 서로 다르다. (0) | 2025.02.22 |
| imgdiet 개발 중 주저리 주저리 #2 python decorator 실사용예 (0) | 2025.02.12 |
| imgdiet 개발 중 주저리 주저리 #1 (1) | 2025.02.06 |
| 명령어 한 줄로 anaconda/miniconda/conda 아묻따 모든 env 삭제 (1) | 2025.01.31 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- FairMOT
- 위상 정렬 알고리즘
- 단축키
- LCA
- cosine
- 조합
- 백준 1766
- 백준
- ㅂ
- Lowest Common Ancestor
- 백준 11053
- 가장 긴 증가하는 부분 수열
- 인공지능을 위한 선형대수
- 백준 11437
- MOT
- 자료구조
- 이분탐색
- 파이참
- 순열
- 백트래킹
- 문제집
- C++ Deploy
- PyCharm
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
글 보관함
