DB에 연결하기 위해 필요한 host, port, user, password와 같은 정보와 API_KEY 등과 같은 중요한 정보는 코드 상에 있으면 보안의 측면에서 좋지 않습니다. github 레포지토리에 올라갔거나 서버 상에 코드가 존재할 때 유출의 위험이 있기 때문입니다. 따라서, vault, AWS Secrets Manager 등과 같은 키 관리 서비스를 활용해서 각종 키값을 보관하곤 합니다. 그런데 vault 등을 세팅하고 연결하기에 번거로운 경우라면, dotenv를 활용하는 것도 하나의 방법이 될 수 있습니다. pypi.org에서는 python-dotenv에 대해 공식적으로 이렇게 설명하고 있습니다.
"Read key-value pairs from a .env file and set them as environment variables"
일종의 .env 파일을 만들고 그 안에 각종 키 값을 저장하고 그것을 파이썬 코드 상에서 불러와서 사용하는 것입니다. 그리고 github에 push할 때는 이 파일을 .gitignore에 추가해놓는다면, github 상에는 그 파일이 존재하지 않기 때문에 조금이나마 안전하게 키값을 관리할 수 있습니다.
dotenv로 키값 관리하기
dotenv를 사용하려면 먼저 설치해줘야 합니다.
pip install python-dotenv
그 다음에는 프로젝트 폴더 안에 .env 파일을 만들고 다음과 같이 중요한 값을 저장합니다.
import os
from dotenv import load_dotenv
load_dotenv()
username = os.getenv("username")
password = os.getenv("password")
print(".env에서 가져온 username:", username)
print(".env에서 가져온 password:", password)
위 코드를 실행하면 다음과 같은 내용이 콘솔에 출력됩니다.
dev, prod 환경 각각 다른 .env 파일 사용하기
만약, dev 환경, prod 환경에 따라서 다른 .env 파일을 사용하고 싶다면, .env.dev, .env.prod와 같은 파일을 각각 담고 거기에 필요한 키값을 넣어주면 됩니다.
저는 먼저 맥북을 사용중이라 export ZONE=dev 명령으로 ZONE라는 환경변수를 만들고 dev라는 값을 넣었습니다. 윈도우에서는 환경 변수를 세팅할 때 export 대신 set을 쓰면 됩니다. 그 다음에 다음과 같은 코드를 작성하고 실행하면 ZONE 환경변수가 dev인 상황이기 때문에 if문에서 첫번째 조건을 만족하여 .env.dev 파일을 읽어서 거기에 있는 키값을 가져옵니다.
import os
from dotenv import load_dotenv
if os.getenv('ZONE') == 'dev':
load_dotenv('.env.dev')
username = os.getenv("username")
password = os.getenv("password")
print(".env.dev에서 가져온 username:", username)
print(".env.dev에서 가져온 password:", password)
elif os.getenv('ZONE') == 'prod':
load_dotenv('.env.prod')
username = os.getenv("username")
password = os.getenv("password")
print(".env.prod에서 가져온 username:", username)
print(".env.prod에서 가져온 password:", password)
참고자료
[1] https://pyshark.com/manage-environment-variables-using-dotenv-in-python/
[2] https://docs.aws.amazon.com/ko_kr/secretsmanager/latest/userguide/intro.html.
'Dev > python' 카테고리의 다른 글
[python] unittest로 단위 테스트하기(소요 시간 체크도 함께) (0) | 2023.07.17 |
---|---|
[python] 문자열을 어떤 구분자로 분리하여 리스트에 담는 방법, split() 메서드 (0) | 2023.07.16 |
[python] 유용한 파이썬 표준 함수 eval() 활용하기 (0) | 2023.07.14 |
[python] datetime 모듈의 date 객체를 YYYY-MM-DD 형태의 문자열로 변환하는 방법, isoformat(), fromisoformat() 메서드 (0) | 2023.07.13 |
[python] platform 모듈로 운영체제 정보 얻기 (0) | 2023.06.30 |
[python] 모듈, 패키지, 라이브러리, 프레임워크 용어 분명히 이해하기 (0) | 2023.06.18 |
[python] poetry 주요 명령어 정리 (0) | 2023.06.17 |
[python] super().__init__()의 의미 (0) | 2023.06.15 |