|
| 1 | +# 86. 배포 환경을 설정하기 위해 모듈 영역의 코드를 사용하라 |
| 2 | + |
| 3 | +## 1. 배포 환경에서 발생 가능한 문제 |
| 4 | + |
| 5 | +- 프로그램을 작성하는 궁극적인 목표 |
| 6 | + - 프로덕션 환경에서 프로그램을 실행해 원하는 결과를 얻는 것 |
| 7 | +- 개발 환경은 프로덕션 환경과 아주 많이 다를 수 있음 |
| 8 | +- `venv` 같은 도구를 쓰면 모든 환경에 똑같은 파이선 패키지 설치 가능 |
| 9 | +- 문제 |
| 10 | + - 프로덕션 환경의 경우 개발 환경에서 재현하기 힘든 외부 가정이 많이 있을 수 있음 |
| 11 | + - 웹 서버 컨테이너 안에서 프로그램을 실행시키되 프로그램이 DB 에 접근할 수 있도록 하용하고 싶다고 가정 |
| 12 | + - 프로그램 코드를 변경할 때마다 서버 컨테이너를 실행, DB 스키마 적절히 갱신 필요 |
| 13 | + - DB 접근에 필요한 암호를 프로그램이 알아야 함 |
| 14 | + - 프로그램에서 한 줄만 변경한 뒤 제대로 동작하는 검증하는데 이 모든 작업을 다시 해야 한다면 비용이 너무 비쌈 |
| 15 | + |
| 16 | +## 2. 배포 환경을 고려한 방법 |
| 17 | + |
| 18 | +- 프로그램 일부를 오버라이드하여 배포되는 환경에 따라 다른 기능을 제공 |
| 19 | + - 두 파일의 차이 |
| 20 | + - `TESTING` 상수 값이 다르다는 것 |
| 21 | + - 다른 모듈은 `__main__` 모듈을 임포트해서 `TESTING` 값에 따라 자신이 정의하는 애트리뷰트 값 결정 |
| 22 | + |
| 23 | +```python |
| 24 | +# dev_main.py |
| 25 | +TESTING = True |
| 26 | + |
| 27 | +import db_connection |
| 28 | + |
| 29 | +db = db_connection.Database() |
| 30 | + |
| 31 | +# prod_main.py |
| 32 | +TESTING = False |
| 33 | + |
| 34 | +import db_connection |
| 35 | + |
| 36 | +db = db_connection.Database() |
| 37 | +``` |
| 38 | + |
| 39 | +```python |
| 40 | +# db_connection.py |
| 41 | +import __main__ |
| 42 | + |
| 43 | +class TestingDatabase: |
| 44 | + ... |
| 45 | + |
| 46 | +class RealDatabase: |
| 47 | + ... |
| 48 | + |
| 49 | +if __main__.TESTING: |
| 50 | + Database = TestingDatabase |
| 51 | +else: |
| 52 | + Database = RealDatabase |
| 53 | +``` |
| 54 | + |
| 55 | +- 모듈 영역에서 실행되는 코드는 파이선 코드만 존재 |
| 56 | +- `if` 문을 모듈 수준에서 사용하면 모듈 안에서 이름이 정의되는 방식 결정 가능 |
| 57 | + - 다양한 배포 환경에 맞춰 모듈 구성 가능 |
| 58 | + - DB 설정과 같이 비용이 많이 드는 가정이 불필요한 배포 환경에서 설정 가능 |
| 59 | +- 이런 접근 방법은 외부 환경에 대한 가정을 우회하기 위한 용도 이상으로 사용될 수 있음 |
| 60 | + - 프로그램이 호스트 플랫폼에 따라 다르게 작동되야 한다고 가정 |
| 61 | + - 최상위 요소 정의 전 `sys` 모듈 사용하여 나눠보기 |
| 62 | + - 비슷한 방식으로 `os.environ` 에서 얻은 환경 변수를 모듈 정의에 참조 가능 |
| 63 | + |
| 64 | + ```python |
| 65 | + # db_connection.py |
| 66 | + import sys |
| 67 | + |
| 68 | + class Win32Database: |
| 69 | + ... |
| 70 | + |
| 71 | + class PosixDatabase: |
| 72 | + ... |
| 73 | + |
| 74 | + if sys.platform.startswith('win32'): |
| 75 | + Database = Win32Database |
| 76 | + else: |
| 77 | + Database = PosixDatabase |
| 78 | + ``` |
0 commit comments