민감한 정보는 git에 올라가면 안 됩니다. 하드 코딩하면 안 된다는 의미인데요. 이를 환경 변수로 관리하는 경우가 많아요. .env 등의 파일에서 환경 변수를 얻는 방법이 있습니다. python-dotenv 패키지를 설치하면 가능합니다.
이 글에서는 python dotenv dotenv_values 함수를 이용해서 민감한 정보를 처리하는 방법을 알아봅니다.
dotenv_values 함수
먼저 함수 설명을 간단하게 보겠습니다.
꽤 많은 인자들이 있는데요. dotenv_path만 보겠습니다. 이 인자는 읽어들일 env 파일의 경로를 의미합니다. 예를 들어 이 path가 “.env”였다고 해 보겠습니다. 이 경우, .env 파일에서 읽어들이게 됩니다. 이 ENV 파일은 아래와 같은 형식으로 이루어져 있어요.
예를 들어 환경변수 파일에 A=3이 있다면 환경변수 A의 값은 3이다라는 정보가 파일에 있는 것입니다. 그리고, 이 함수의 리턴값은 딕셔너리입니다. 이 부분 체크하고 넘어가도록 하겠습니다.
프로젝트 세팅하기
그러면, python dotenv dotenv_values 함수를 사용하는 예제를 보겠습니다. 먼저, 프로젝트의 구조를 보도록 합시다.
main.py가 있고요. 세 env 파일이 있어요. 보통 이 환경변수 파일들은 프로젝트의 root에 있는 경우가 많으니, .gitignore에 *.env를 추가하곤 해요. 3개의 env 파일이 있어요. 이 세 파일은 각각 어떤 역할을 하는지 봅시다.
- base
- 공통으로 정의되는 환경 변수들을 지정합니다.
- 여기에 변수 ENV가 어떤 환경 변수 파일을 읽을지도 저장합니다.
- local
- local 환경 변수들을 저장합니다.
- prod
- production 환경 변수들을 저장합니다.
저는 보통 요래 관리합니다. 즉, base는 공통 환경 변수들을 저장합니다. 그리고, 어떤 파일을 읽을지도 같이 저장해요. 환경에 따라 달라지는 변수들은 local.env와 prod.env로 따로 저장함을 볼 수 있어요. 이를 그림으로 그리면 아래와 같습니다.
이제 환경 변수 파일들을 봅시다.
먼저 base.env입니다. ENV=local이라고 되어 있습니다. 저는 이 ENV 변수를 selector 역할로 할 겁니다. 이게 local이면 local.env를 추가로 읽어들이고, prod면 prod.env를 읽어들이는 식입니다.
local.env입니다. 변수 A의 값이 2라는 정보가 저장되어 있습니다.
다음 prod.env입니다. 변수 A의 값이 3이라는 정보가 저장되어 있습니다.
main.py 보기
이제 main.py를 보겠습니다.
dotenv_values가 읽어들인 환경변수들에 대한 정보를 딕셔너리로 반환한다는 사실을 이용해 봅시다. 그러면, 3번째 줄은 base.env로부터 읽은 환경변수들을 딕셔너리 형태로 가지고 있을 겁니다. 다음에, 4번째 줄에, |= 연산자를 사용하는데요. 딕셔너리에서 |= 연산은 합치는 연산입니다.
고로, 3번째 줄과 4번째 줄은 무슨 의미인가?
- base.env로부터 읽은 환경변수 정보를 config에 추가합니다.
- config에 있는 키가 ENV인 것의 값을 value라고 할 때
- value.env로부터 읽은 환경변수 정보를 config에 추가합니다.
여기까지 복잡하지 않지요? base.env에는 ENV=local이 저장되어 있었으니, local.env에 있는 환경변수도 같이 읽어올 겁니다.
ENV의 값은 local, A의 값은 2로 읽어왔어요.
이제 base.env 파일에서, ENV=prod로 바꿔 보겠습니다. 그러면 어떻게 될까요?
그러면 local.env 대신에 prod.env를 읽어올 겁니다. 이 파일에는 A=3, 즉 A의 값은 3이라는 정보가 저장되어 있습니다.
따라서, ENV는 prod로 읽어오고, A의 값은 local.env가 아닌 prod.env로 읽어오게 됩니다.