배포 환경은 프로그램이 실행될 설정을 뜻하고 보통 모든 프로그램에는 배포 환경이 적어도 하나는 있는데 그것을 프로덕션 환경이라고 한다.
프로그램을 작성하는 궁국적인 목표는 프로덕션 환경에서 프로그램을 실행해 원하는 결과를 얻어내는 것이다.
프로그램에서 한 줄만 변경한 뒤 제대로 동작하는지 검증하고 싶을지라도 모든 작업을 다시 해야하기에 비용이 너무 비싸다
이러한 문제를 우회하는 가장 좋은 방식은 프로그램을 시작할 때 프로그램 일부를 오버라이드해서 배포되는 환경에 따라서 다른 기능을 제공하도록 만드는 것이다.
#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 = RealDatabas
모듈 영역에서 실행되는 코드가 일반적인 파이썬 코드이기에 if문을 모듈 수준에서 사용하면 모듈 안에서 이름이 정의되는 방식을 결정할 수 있어서 더 쉽게 다양한 배포 환경에 맞춰서 모듈을 구성하고 데이터베이스 설정저처럼 비용이 많이 드는 가정이 불필요한 배포 환경이라면 아예 이런 설정을 제외시킬 수 있다.
대화식 개발을 편하게 도와주는 로컬 구현이나 가짜 구현을 주입할 수 있고, 테스트를 위해서 목을 사용할 수도 있다.
위와 같은 접근 방법이 외부 환경에 대한 가정을 우회하기 위한 것 이상의 용도로 사용될 수 있다.
#db_connection.py
import sys
class Win32Database:
...
class PosixDatabase:
...
if sys.platform.startswith('win32'):
Database = Win32Database
else:
Database = PosixDatabase
#비슷한 방식으로 os.environ에서 얻은 환경 변수를 모듈 정의에 참조할 수 있다.
고유한 가정과 설정이있는 다양한 배포 환경에서 프로그램을 실행해야하는 경우가 많다.
모듈 영역에서 일반적인 파이썬 문을 사용하면 각 배포 환경에 맞게 모듈 내용의 조정을 할 수 있다.
모듈 내용은 모두 외부 조건에 따라서 달라질 수 있는 결과물이다.
외부 조건에는 sys나 os 모듈을 사용해서 알아낸 호스트 인트로스팩션 정보가 포함된다.