본문 바로가기

파이썬 코딩의 기술

파이썬코딩의기술 - BW 86 : 배포 환경을 설정하기 위해 모듈 영역의 코드를 사용하라

프로그램을 작성하는 궁극적인 목표프로덕션 환경에서 프로그램을 실행해 원하는 결과를 얻어내는 것 입니다.

- 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 모듈을 사용해 알아낸 호스트 인트로스펙션 정보가 포함된다.