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