Programing Language/Python

키값이나 환경변수를 관리하기

jheaon 2023. 6. 29. 06:33

 

Python 서버를 개발하거나 API을 활용한 스크립트를 작성하다 보면 중요한 설정값(API키, 알려져선 안 되는 데이터)을 관리하게 된다. 특히 API키나 암호키 같은 경우에 어떠한 처리 없이 Github에 올려버리게 된다면 엄청 큰 피해를 볼 수 있다.

 

그의 예시로 웹 드라마에서는 AWS키를 담은 코드를 그냥 Github에 올려 관리하게 된 상황을 연출하고 있는데 해당 설정값을 잘못 다루게 된다면 정말 아래와 같은 일이 일어날지 모른다. 

 

참조 : https://www.youtube.com/watch?v=IkMJeO0Sbk4&t=2s 

 

따라서 이런 설정값들을 잘 관리하여야 할 필요성이 있다. 이번에는 이런 설정값들을 어떤 형태로 관리하면 좋을 지에 대해서 설명 하고자 한다. 

 

 

 

중요값 관리하기

파이썬에서 중요한 값들을 관리하는 방법은 여러가지가 있겠지만, 나는 주로 아래의 형태의 파일을 만들어 관리한다. 

  • .py 파일을 이용하여 관리
  • .env 파일을 이용하여 관리
  • .json 파일을 이용하여 관리

그럼 해당 파일들을 어떻게 관리하는지에 대해 하나씩 살펴보자.

 

 

 

 

.py 파일을 통해서 관리하기

일단 현재 위치한 폴더에서 설정값을 불러와 사용할 main.py 파일과 env 폴더를 만든 다음, env 폴더 안에 settings.py라는 파일을 만든다. 그러면 폴더의 구조는 다음과 같이 구성이 된다. 

 

🗂️ Folder Tree

root
├─ env
│   └─ settings.py
└─ main.py

 

settings.py 안에는 자신이 사용하고자 하는 중요 값들을 딕셔너리 형태로 담아 둔다. 

 

🖥️ env/settings.py

DATABASE_CONFIG = {
    'host': 'localhost',
    'dbname': 'company',
    'user': 'user',
    'password': 'password',
    'port': 3306
}

 

main.py 에서 사용할 때는 from - import 구문을 이용하여 파이썬 파일을 불러드린 뒤 해당 값을 사용하는 형식으로 진행한다. 다음은 그 예시이다. 

 

🖥️ main.py

from env import settings

host = settings.DATABASE_CONFIG['host']
print(host) # host

 

 

 

 

.env 파일을 통해서 관리하기

env파일을 이야기하기 전에 환경변수에 대해서 먼저 알아봐야 한다.

 

환경변수란 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는 동적인 값들의 모임을 의미한다. 쉽게 말하자면 프로그램을 실행시킬 때 참조하기 위한 어떤 값들을 의미하는 것이다. 

 

윈도우 같은 경우에는 시스템 환경 변수 편집이라는 곳에 들어가게 되면 직접적으로 환경 변수를 편집할 수 있다. 

 

window 환경 변수 편집

즉 해당 방법은 우리가 관리하고자 하는 중요값들을 환경변수로 지정 한 뒤 그 값을 가져와 사용하는 방법이다. 환경변수 만드는 방법은 여러 가지 지만 env 파일을 이용하여 환경 변수 추가 하여 사용할 수 있다. 

 

해당 방법을 사용하기 위해서는 다음과 같이 폴더를 구성 한뒤 파이썬 python-dotenv 패키지를 설치한다. 

 

🗂️ Folder Tree

root
├─ env
│   └─ data.env
└─ main.py

🖥️ Terminal

pip install python-dotenv

 

data.env 파일에는 자신이 관리하고자 하는 값을 key=value 순으로 넣는다. 작성할 때는 반드시 key와 value 값이 서로 붙은 채로 작성하여야 한다. 

 

name="정해원" (O) // name = "정해원" (X)

 

🖥️ data.env

name="정해원"
age=26

 

그런 다음 환경 변수를 불러오기 위해서 python-dotenv 패키지와 os 모듈을 사용한다. 아래는 그 예시 코드이다.

 

🖥️ main.py

import os
from dotenv import load_dotenv

load_dotenv('env/data.env')
print(os.getenv('name')) # 정해원

코드를 간단히 설명하자면 dotenv 패키지에 있는 load_dotenv을 통해 data.env에 있는 변수들을 환경 변수로 만들어 등록한다. 그 뒤 os 모듈을 통해서 환경 변수로 저장되어 있는 name의 값을 가져와 출력하는 코드이다. 

 

📢 참고로 해당 방법을 사용하기 위해 고려해야 할 점이 있는데, 예전 파이썬 프로젝트를 진행하는 와중에 패키지 설치 문제가 있었다. 에러 이유는 해당 파이썬 버전(3.6)을 지원하지 않는 것이었고 찾아보니 해당 패키지는 현재 Python3.8 버전보다 낮으면 실행이 안된다는 것이었다. 이를 참고하여 사용하시길 권장드린다.

 

 

 

 

 

 

 

.json 파일을 통해서 관리하기

json 파일은 javascript object notation의 줄임말로 javascript 객체 문법으로 구조화된 데이터를 표현한 파일을 의미한다. javascript 문법으로 만들어졌기 때문에 프론트와 백이 데이터 교류를 진행할 때 표준으로 많이 사용하곤 한다. 

 

해당 방법을 사용하기 위해서 아래와 같이 폴더를 구성한다. 

 

🗂️ Folder Tree

root
├─ env
│   └─ data.json
└─ main.py

 

🖥️ data.json

{
    "name": "정해원",
    "age": 26,
    "male": true
}

 

파이썬에서 json 파일을 읽기 위해서는 with-open 구문으로 파일을 연 뒤 해당 내용을 파이썬 내장 함수인 json을 이용하여

직렬화 과정을 해주면 된다. 

 

 

🖥️ main.py

import json

with open('env/data.json', 'r', encoding='utf8') as f:
    data = json.load(f)
    print(data)

 

추가적으로 해당 json 모듈은 불러 읽는 것만이 아닌 .json 파일을 생성 할 수도 있는데 방법은 다음과 같다. 

 

🖥️ main.py

import json

dict_case = {'A':1, 'B':2, 'C':3}
with open(".json", "w") as f:
	f.write(json.dumps(dict_case))

 

🖥️ .json

{
    "A": 1, 
    "B": 2, 
    "C": 3
}

 

 

 

 

 

Gitignore

이때까지 여러 파일로 중요키를 분리하여 관리하는 방법에 대해 알아봤다 중요한 점은 이렇게 관리를 해도 이런 파일들을 다 같이 깃허브에 호스팅 해버리면 분리를 한 이유가 없다는 것이다. 

 

즉 프로젝트를 푸시할 때 내가 중요한 값을 저장한 파일이 깃허브에 올라가지 않도록 따로 관리를 해야 하는 데 이를 도와주는 것이 gitignore파일이다.

 

리포지토리랑 연결되어 있는 폴더에서 .gitignore 파일을 생성 한 뒤, 깃허브로 올리고 싶지 않는 파일이나 폴더의 이름만 적어 준다면 코드가 깃허브로 올라가는 것을 방지 할 수 있다. 

 

🖥️ .gitignore

# 주로 중요한 값이 있는 파일들을 env 파일에 모아 뒀기 때문에 
# env 폴더 안에 있는 코드는 깃허브에 올리지 않도록 한다. 

env/


# 혹은 따로 깃허브로 올리고 싶지 않은 파일이 있다면 추가적으로 설정이 가능하다. 
# 다음은 그 예이다. 

*.pyc
__pycache__
sqlite3.db

 

'Programing Language/Python'의 다른글

  • 현재글 키값이나 환경변수를 관리하기

관련글