이 레슨과 관련된 학습 키워드
컴퓨터 과학 & 프로그래밍 — 문제 해결의 도구 → Python 프로그래밍 — 첫 코드에서 실전까지 → Python 프로그래밍 — 첫 코드에서 실전까지 → 중급
파일 I/O, 인코딩, 예외 처리, 커스텀 예외, EAFP, 컨텍스트 매니저, JSON/CSV, pathlib, 로깅
1f = open("data.txt")2data = f.read()3f.close()오늘은 파일, 예외, 컨텍스트 매니저를 왜 배워야 하는지 살펴보겠습니다.
모든 프로덕션 코드는 파일, 네트워크, DB 같은 외부 리소스와 상호작용합니다.
이때 반드시 열기, 사용, 닫기의 세 단계를 거쳐야 합니다.
그림 왼쪽을 보시면 정상 흐름이 그려져 있습니다.
open으로 열고 읽거나 쓴 뒤 close로 닫히면 리소스가 해제됩니다.
그런데 오른쪽을 보시면 상황이 달라집니다.
읽거나 쓰는 도중 예외가 발생하면 close에 아예 도달하지 못합니다.
이것이 바로 리소스 누수입니다.
파일 핸들이나 DB 커넥션이 좀비 상태로 남는 현상이죠.
수도꼭지를 틀고 지진이 나면 잠그는 행위가 보장되지 않는 것과 같습니다.
프로그램도 예외 앞에서는 닫기가 보장되지 않습니다.
그림 가운데 박스를 보시면 실제 프로덕션 장애 세 가지가 나옵니다.
첫 번째는 파일 핸들 누수 사례입니다.
수천 개 로그 파일을 열면서 close를 빠뜨렸습니다.
OS 파일 디스크립터 한도를 초과해 서비스가 전체 다운됐습니다.
두 번째는 인코딩 오류입니다.
유티에프-8로 열었는데 실제 파일은 씨피구사구 인코딩이었습니다.
십만 행 중 구만구천팔백사십칠 번째 행에서 유니코드 디코드 에러가 터졌습니다.
파일이 닫히지 않아 처리한 데이터가 통째로 유실됐습니다.
세 번째는 예측 불가 예외 상황입니다.
키에러로 프로그램이 종료되며 락 파일이 남아 재시작이 불가능해졌습니다.
하단 왼쪽을 보시면 데이터 손실 메커니즘이 단계적으로 나옵니다.
쓰기 버퍼링 중 예외가 발생하면 close와 플러시가 실행되지 않습니다.
결국 데이터가 영구적으로 유실되는 구조입니다.
그렇다면 해결책은 무엇일까요?
하단 오른쪽 세 박스를 보시면 파이썬의 해결 도구가 정리돼 있습니다.
첫째, 트라이 익셉트는 예외 발생 시 복구, 로깅, 재시도를 결정합니다.
둘째, 위드 문은 예외 여부와 무관하게 close를 자동으로 보장합니다.
셋째, 패스립은 OS에 독립적으로 경로를 안전하게 다룹니다.
패스립의 read_text는 내부적으로 위드 오픈을 써서 누수가 원천 차단됩니다.
세 도구를 조합하면 누수 방지, 에러 복구, 안전한 경로 처리를 동시에 잡습니다.