본문 바로가기
Backend/Python

[FastAPI] Project Levup - .env (dotenv) 적용하기

by 천우산__ 2023. 11. 30.

프로젝트 버전을 저장 및 다른 기기에서 이어서 작업을 할 수 있도록 github에서 작업을 진행하는데

DB 연결 정보가 있다보니 commit 을 하기 전 비밀번호를 실제와 다른 것으로 저장한 후에 진행했다.

지금은 가려야 하는 것은 DB 정보 밖에 해당하지 않아서 번거롭기는 하지만 잊어버리지 않을 정도는 되지만

민감 정보가 많아지고, DB 연결이 더 많아지는 경우에 하나 하나 관리하기 어려워 진다는 문제가 있다.

이를 위해서 민감 정보를 모아두는 파일을 따로 만들고 그곳에 민감 정보를 저장, gitignore 파일에 포함시켜 commit에서 제외시킨다.

먼저, .env 파일을 불러올 수 있도록 패키지를 설치한다

python3 -m pip install python-dotenv

 

그 후 프로젝트 폴더 내 .env 파일을 만들어준다.

# 프로젝트 구조
-app
    -controller
    -model
    -routers
        -memo.py

    main.py
    .env #생성

 

.env 파일 안에 DB 주소를 입력한다. "DB_ADDRESS" 텍스트는 실제 사용할 DB 주소를 입력한다.

#.env
DB_ADDRESS = "DB_ADDRESS"

 

DB를 사용할 파일로 이동한 후 BASE_DIR 변수에 .env 가 포함된 디렉터리를 지정한다.

그 다음, load_env로 .env 파일을 불러온 다음 os.environ["DB_ADDRESS"] 처럼 .env 에 저장한 변수를 불러온다.

# memo.py

from dotenv import load_dotenv
import os

router = APIRouter(prefix = "/api/memo", tags = ["memo"])
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
load_dotenv(os.path.join(BASE_DIR, ".env"))

ca = certifi.where()
client = MongoClient(os.environ["db_address"], tlsCAFile=ca)
db = client.collection

위 코드의 경우, os.path.abspath 로 현재 파일 위치를 파악하고 

os.path.dirname 으로 현재 파일의 디렉토리 (router)를 지정, 다시 os.path.dirname 으로 상위 디렉토리 (app)를 지정한다.

다음으로 os.path.join 을 통해 현재 폴더 위지 + 파일명을 지정하여 app 디렉토리의 .env 파일을 찾아서 로드하는 과정이다.

테스트 결과, 정상적으로 작동하는 것을 확인했다.