프로그램을 작성하는 궁극적인 목표는 프로덕션 환경에서 프로그램을 실행해 원하는 결과를 얻어내는 것 입니다.
- venv를 쓰면 모든 환경에서 똑같은 파이썬 패키지가 설치되기 할 수 있음
(문제제기) 문제는 프로덕션 환경의 경우 개발 환경에서 재현하기 힘든 외부 가정이 많을 수 있다는 점 입니다.
- (예) 웹 서버 컨테이너 안에서 프로그램을 실행시키되 프로그램이 데이터베이스에 접근할 수 있도록 허용하고 싶다고 하자.
- 이때, 프로그램에서 한 줄만 변경한 뒤 제대로 동작하는지 검증하고 싶을 뿐인데 이 모든 작업을 다시해야 한다면 비용이 너무 비싸다.
이러한 문제를 우회하는 가장 좋은 방법은 프로그램을 시작할 때 프로그램 일부를 오버라이드해서 배포되는 환경에 따라 다른 기능을 제공하도록 만드는 것입니다.
- (예) 프로덕션과 개발 환경에 따라 두가지 __main__ 파일을 사용할 수도 있음
# dev_main.py
TESTING = TRUE
import db_connection
db = db_connection.Database()
# prod_main.py
TESTING = False
import db_connection
db = db_connection.Database()
-> 두 파일의 차이는 TESTING 상수의 값이 다르다는 것 뿐.
-> 프로그램의 다른 모듈들은 __main__모듈을 임포트해서 TESTING의 값에 따라 자신이 정의하는 애트리뷰트 값을 결정할 수 있다는 것이다.
# db_connection.py
import __main__
class TestingDatabase:
...
class RealDatabase:
...
if __main__.TESTING:
Database = TestingDatabase
else:
Database = RealDatabase
여기서 if문을 모듈 수준에서 사용하면 모듈 안에서 이름이 정의되는 방식을 결정할 수 있습니다.
배포 환경 설정이 복잡해지면 파이썬의 제약 사항(TESTING 등)을 전용 설정 파일로 옮겨야함
- configparser 내장 모듈 같은 도구를 사용하면, 프로덕션 설정을 코드로부터 분리해 유지 보수할 수 있음
이런 접근 방법은 외부 환경에 대한 가정을 우회하기 위한 것 이상의 용도로 사용될 수 있음
- (예) 프로그램이 호스트 플랫폼에 따라 다르게 작동해야 한다는 사실을 안다면, 최상위 요소들을 정의하기 전에 sys 모듈을 살펴보면 됩니다.
# db_connection.py
import sys
class Win32Database:
...
class PosixDatabase:
...
if sys.platform.startswith('win32'):
Database = Win32Database
else:
Database = PosixDatabase
비슷한 방식으로 os.environ에서 얻은 환경 변수를 모듈 정의에 참조할 수도 있습니다.
### 기억해야할 내용 ###
- 고유한 가정과 설정이 있는 다양한 배포 환경에서 프로그램을 실행해야 하는 경우가 많다.
- 모듈 영역에서 일반적인 파이썬 문을 사용하면 각 배포 환경에 맞게 모듈의 내용을 조정할 수 있다.
- 모듈 내용은 모든 외부 조건에 따라 달라질 수 있는 결과물이다. 외부 조건에는 sys나 os 모듈을 사용해 알아낸 호스트 인트로스펙션 정보가 포함된다.
'파이썬 코딩의 기술' 카테고리의 다른 글
파이썬코딩의기술 - BW88 : 순환 의존성을 깨는 방법을 알아두라 (0) | 2023.04.19 |
---|---|
파이썬코딩의기술 - BW87 : 호출자를 API로부터 보호하기 위해 최상위 Exception을 정의하라 (0) | 2023.04.15 |
파이썬코딩의기술 - BW78 : 목을 사용해 의존 관계가 복잡한 코드를 테스트 하라 (0) | 2023.04.12 |
파이썬코딩의기술 - BW77 : setUp, tearDown, setUpModule, tearDownModule을 사용해 각각의 테스트를 격리하라 (0) | 2023.04.12 |
파이썬코딩의기술 - BW55 : Queue를 사용해 스레드 사이의 작업을 조율하라 (0) | 2023.03.28 |