1What — 현실 프로그램은 외부 세계와 대화한다
2- 모든 프로덕션 코드는 외부 리소스(파일, 네트워크, DB)와 상호작용한다
3- 이 과정에서 반드시 관리해야 할 3가지: 열기 → 사용 → 닫기
4- Python은 이를 위해 세 가지 언어 기능을 제공한다: \texttt{with}, \texttt{try/except}, \texttt{pathlib}
5Why — '쓰고 닫는다'가 왜 어려운가
6- 비유: 수도꼭지를 틀고 손을 씻는 건 쉽다. 하지만 지진이 나면? 정전이 되면? 닫는 행위가 보장되지 않는다
7- 프로그램도 마찬가지다 — 파일을 열고 처리하는 도중 예외가 발생하면 close()가 호출되지 않는다
8- 이것이 리소스 누수(resource leak)이며, 장시간 실행되는 서버에서는 치명적 장애로 이어진다 (Beazley & Jones, 2013)
9Why — 프로덕션 장애의 3가지 실제 사례
101. 로그 분석기 — 파일 핸들 누수
11 - 수천 개 로그 파일을 순회하며 \texttt{open()} 후 \texttt{close()}를 빠뜨림
12 - OS 파일 디스크립터 한도(ulimit) 초과 → OSError: Too many open files
13 - 서버가 새 연결을 수락하지 못해 전체 서비스 다운
142. 데이터 파이프라인 — 인코딩 오류
15 - CSV 파일을 \texttt{utf-8}로 열었으나 실제는 \texttt{cp949} 인코딩
16 - 10만 행 중 99,847행째에서 \texttt{UnicodeDecodeError} 발생
17 - 이미 처리한 데이터는 중간 파일에 기록되었으나 파일이 닫히지 않아 flush 안 됨 → 데이터 유실
183. 설정 파일 로더 — 예측 불가 예외
19 - JSON 설정 파일 로드 중 \texttt{KeyError} 발생 (필드 누락)
20 - 예외 처리 없이 프로그램 종료 → 열려 있던 DB 커넥션, 임시 파일 모두 좀비 상태
21 - 다음 실행 시 lock 파일이 남아 있어 재시작 불가
22Why — 단순한 open/close로는 부족한 이유
23- 아래 코드의 문제를 보자: