Skip to content

Commit 3e38db2

Browse files
committed
better way 86 정리
1 parent 487f3dd commit 3e38db2

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -127,4 +127,5 @@
127127
[83. 가상 환경을 사용해 의존 관계를 격리하고 반복 생성할 수 있게 하라](./summary/BetterWay83.md)
128128
[84. 모든 함수, 클래스, 모듈에 독스트링을 작성하라](./summary/BetterWay84.md)
129129
[85. 패키지를 사용해 모듈을 체계화하고 안정적인 API를 제공하라](./summary/BetterWay85.md)
130+
[86. 배포 환경을 설정하기 위해 모듈 영역의 코드를 사용하라](./summary/BetterWay86.md)
130131

summary/BetterWay86.md

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
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

Comments
 (0)