[TOOL-009][중급] 환경변수와 설정 파일 나눠 쓰기 > IT 기술 공유

본문 바로가기
사이트 내 전체검색

IT 기술 공유

[TOOL-009][중급] 환경변수와 설정 파일 나눠 쓰기

페이지 정보

profile_image
작성자 기술팀장
댓글 0건 조회 122회 작성일 26-09-03 22:34

본문

[이번 수업]

같은 코드도 개발용과 운영용에서 실행 모드나 기능 설정이 다릅니다. 값을 코드에 박지 않고 환경변수와 설정 파일로 나누는 방법을 배웁니다. 환경변수는 운영체제가 프로그램에 전달하는 이름과 문자열 값이고, 설정 파일은 사람이 읽고 고칠 값을 파일에 정리한 것입니다.

[선수지식]

터미널에서 Python 파일을 실행하고 텍스트 파일을 만들 수 있어야 합니다. TOOL-002와 PY-006을 먼저 보면 더 쉽습니다.

[학습목표]

1. 환경변수와 설정 파일의 차이를 설명합니다.
2. 기본값, 설정 파일, 환경변수의 적용 순서를 정합니다.
3. 운영체제별로 환경변수를 넣어 프로그램을 실행합니다.

[핵심개념]

환경변수 값은 문자열이며 시작된 프로그램은 부모 프로세스의 환경을 물려받습니다. 코드 수정 없이 실행 값을 바꾸기 좋지만, 현재 터미널에만 적용되는지 사용자·시스템 전체에 남는지 범위를 구분해야 합니다. macOS와 Linux에서는 이름의 대소문자도 구분합니다.

설정 파일은 여러 값을 섹션과 키로 묶기에 편합니다. Python 표준 라이브러리 ConfigParser가 읽는 INI 형식은 `[app]` 섹션 아래에 `mode = development`처럼 적습니다. 값은 기본적으로 문자열이므로 불리언은 `getboolean`처럼 알맞은 변환 함수를 씁니다.

값이 여러 곳에 있으면 우선순위를 문서로 정합니다. 이 예제는 `환경변수 > 설정 파일 > 코드 기본값` 순서입니다. 실행할 때 바꿀 값은 환경변수로 덮고, 함께 공유할 일반 설정은 파일에 둡니다.

[따라하기]

같은 폴더에 settings.ini를 만듭니다.

```ini
[app]
mode = development
debug = no
```

이어서 config_demo.py를 만듭니다. 외부 패키지는 필요 없습니다.

```python
import configparser
import os

config = configparser.ConfigParser()
loaded = config.read("settings.ini", encoding="utf-8")
if not loaded:
    raise FileNotFoundError("settings.ini not found")

file_mode = config.get("app", "mode", fallback="development")
env_mode = os.getenv("APP_MODE")
mode = env_mode if env_mode is not None else file_mode
source = "environment" if env_mode is not None else "config"
debug = config.getboolean("app", "debug", fallback=False)

print(f"mode={mode}")
print(f"source={source}")
print(f"debug={debug}")
```

Windows는 `py config_demo.py`, macOS와 Linux는 `python3 config_demo.py`로 실행합니다. 예상 결과입니다.

```text
mode=development
source=config
debug=False
```

환경변수로 파일 값을 덮습니다. Windows PowerShell에서는 다음처럼 실행합니다.

```powershell
$env:APP_MODE = "production"
py config_demo.py
$env:APP_MODE = $null
```

macOS와 Linux의 bash·zsh에서는 한 명령에만 적용할 수 있습니다.

```sh
APP_MODE=production python3 config_demo.py
```

두 환경 모두 `mode=production`, `source=environment`, `debug=False`가 나옵니다. PowerShell의 마지막 줄은 현재 세션에서 실습 변수를 제거합니다.

[흔한 실수]

환경변수를 넣은 터미널과 프로그램을 실행한 터미널이 다르면 값이 전달되지 않습니다. 숫자나 `false`도 문자열이므로 값이 있다는 사실만으로 참·거짓을 판단하면 안 됩니다. 설정 파일을 현재 폴더에서만 찾게 만들면 다른 위치에서 실행할 때 실패할 수 있습니다. 우선순위를 정하지 않으면 값의 출처도 추적하기 어렵습니다.

[보안 주의]

환경변수와 설정 파일은 비밀 저장소가 아닙니다. 비밀번호·토큰을 예제 파일에 넣거나 Git에 커밋하지 말고, 환경 전체나 config 객체를 로그에 출력하지 않습니다. 실제 비밀은 접근 권한, 교체, 감사 기능을 갖춘 전용 관리 수단을 사용합니다. 본인 소유의 로컬 환경에서 공개 가능한 값으로만 실습하세요.

[직접 해볼 과제]

settings.ini에 `port = 8000`을 추가하고 `getint`로 읽어 출력하세요. 이어서 APP_MODE가 빈 문자열이면 오류를 내도록 검증합니다. 기본 실행과 환경변수 실행 결과에서 값과 출처가 달라지는지 기록하세요.

[확인문제]

1. 환경변수 값은 프로그램에서 기본적으로 어떤 자료형으로 읽히나요?
2. APP_MODE와 settings.ini의 mode가 모두 있으면 무엇이 선택되나요?
3. 환경변수나 설정 파일 전체를 로그에 남기면 왜 위험한가요?

[다음 학습]

다음은 PY-009 이터레이터·제너레이터·컨텍스트 관리자입니다. 데이터를 순서대로 처리하고 자원을 안전하게 정리하는 방법을 배웁니다.

[공식 참고 자료]

Python os.environ 공식 문서
https://docs.python.org/3/library/os.html#os.environ

Python ConfigParser 공식 문서
https://docs.python.org/3/library/configparser.html

PowerShell 환경변수 공식 문서
https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_environment_variables

OWASP 비밀정보 관리 지침
https://cheatsheetseries.owasp.org/cheatsheets/Secrets_Management_Cheat_Sheet.html

댓글목록

등록된 댓글이 없습니다.

회원로그인

회원가입

사이트 정보

회사명 : 회사명 / 대표 : 대표자명
주소 : OO도 OO시 OO구 OO동 123-45
사업자 등록번호 : 123-45-67890
전화 : 02-123-4567 팩스 : 02-123-4568
통신판매업신고번호 : 제 OO구 - 123호
개인정보관리책임자 : 정보책임자명

접속자집계

오늘
4,308
어제
6,862
최대
16,772
전체
770,259
Copyright © 소유하신 도메인. All rights reserved.