| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
- AI
- 머신러닝
- onnx
- 파이썬
- 생성형AI
- 딥러닝
- Python
- comfyui
- Vision AI
- yolo11
- stable diffusion
- 산업적용
- 시스템관리
- 인공지능
- 리눅스
- 파이썬 클래스
- 프로그래밍
- 딥러닝 추론 최적화
- tensorRT
- 비전AI
- C++ 기초
- 스마트팩토리
- 오픈소스
- github
- git
- 앱테크
- YOLO
- pytorch
- 생성형 AI
- Windows
- Today
- Total
너도 할 수 있는, 너도밤나무 코딩
[Python] 컨텍스트 매니저(Context Manager) 완전 정복 본문
파이썬에서 컨텍스트 매니저(Context Manager)는 파일, 네트워크 연결, 데이터베이스 세션 등 리소스를 안전하고 깔끔하게 관리할 수 있게 해주는 강력한 기능입니다. 특히 with 문과 함께 사용하면 리소스를 자동으로 열고 닫을 수 있어 코드 가독성과 안정성이 크게 향상됩니다.
이번 글에서는 기본 개념, with 문 사용법, 사용자 정의 컨텍스트 매니저 구현, 실전 예제, 설계 팁까지 깊이 있게 살펴봅니다.
1. 컨텍스트 매니저란?

컨텍스트 매니저는 리소스의 초기화와 정리를 담당하는 객체입니다. 파일을 열었으면 반드시 닫아야 하고, 데이터베이스 연결을 맺었다면 반드시 해제해야 하죠. 이런 반복적인 리소스 관리 코드를 자동으로 처리해주는 것이 컨텍스트 매니저의 역할입니다.
가장 흔히 사용하는 예는 파일 입출력입니다.
# 일반적인 파일 열기/닫기
f = open('data.txt', 'r')
try:
content = f.read()
finally:
f.close()
# with 문으로 더 간결하게
with open('data.txt', 'r') as f:
content = f.read()
with 문을 쓰면 f.close()를 따로 호출할 필요가 없습니다. 블록이 끝나면 자동으로 리소스가 해제됩니다.
2. 컨텍스트 매니저의 동작 원리
컨텍스트 매니저는 두 가지 메서드를 구현해야 합니다.
__enter__(self): 리소스를 초기화하고 반환__exit__(self, exc_type, exc_value, traceback): 블록 종료 시 호출되어 리소스를 정리
간단한 예제를 통해 확인해봅시다.
class MyContext:
def __enter__(self):
print("리소스 획득")
return "데이터"
def __exit__(self, exc_type, exc_value, traceback):
print("리소스 해제")
with MyContext() as value:
print("블록 안에서:", value)
출력 결과:
리소스 획득
블록 안에서: 데이터
리소스 해제
블록이 끝나면 자동으로 __exit__가 호출되므로, 사용자는 안전하게 리소스를 사용할 수 있습니다.
3. 예외 처리와 컨텍스트 매니저
컨텍스트 매니저는 블록 내부에서 예외가 발생해도 반드시 __exit__ 메서드를 실행합니다. 따라서 안정적인 리소스 정리가 보장됩니다.
class SafeContext:
def __enter__(self):
print("리소스 준비")
return self
def __exit__(self, exc_type, exc_value, traceback):
print("리소스 정리")
if exc_type:
print(f"예외 발생: {exc_value}")
return True # 예외를 무시하고 진행
with SafeContext():
print("작업 중...")
raise ValueError("문제가 발생했습니다!")
print("이 부분은 실행되지 않음")
출력:
리소스 준비
작업 중...
리소스 정리
예외 발생: 문제가 발생했습니다!
__exit__가 True를 반환하면 예외가 상위로 전파되지 않습니다. 일반적으로는 False를 반환해 예외를 호출자에게 알리는 것이 권장됩니다.
4. contextlib 모듈 활용하기
파이썬 표준 라이브러리에는 컨텍스트 매니저 작성을 도와주는 contextlib 모듈이 있습니다.
1) contextmanager 데코레이터
from contextlib import contextmanager
@contextmanager
def open_file(path, mode):
f = open(path, mode)
try:
yield f
finally:
f.close()
with open_file('data.txt', 'w') as f:
f.write("Hello, world!")
yield 앞 코드는 __enter__, yield 뒤 코드는 __exit__ 역할을 합니다.
2) closing 유틸리티
__enter__와 __exit__를 구현하지 않은 객체라도 closing을 사용하면 컨텍스트 매니저처럼 쓸 수 있습니다.
from contextlib import closing
import urllib.request
with closing(urllib.request.urlopen('https://www.python.org')) as page:
print(page.read(100))
5. 실전 예제
1) 데이터베이스 연결 관리
import sqlite3
class DatabaseConnection:
def __init__(self, db_name):
self.db_name = db_name
self.conn = None
def __enter__(self):
self.conn = sqlite3.connect(self.db_name)
return self.conn.cursor()
def __exit__(self, exc_type, exc_value, traceback):
if self.conn:
self.conn.commit()
self.conn.close()
with DatabaseConnection('test.db') as cursor:
cursor.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY, name TEXT)")
cursor.execute("INSERT INTO users (name) VALUES (?)", ("철수",))
데이터베이스 연결과 종료를 자동으로 관리할 수 있습니다.
2) 실행 시간 측정
import time
class Timer:
def __enter__(self):
self.start = time.time()
return self
def __exit__(self, exc_type, exc_value, traceback):
end = time.time()
print(f"실행 시간: {end - self.start:.4f}초")
with Timer():
total = 0
for i in range(1, 1000000):
total += i
실행 시간이 자동으로 출력됩니다.
6. 설계 팁
- 리소스 정리를 보장해야 하는 경우 무조건 컨텍스트 매니저 사용
- 파일, 소켓, DB 연결 등은 반드시 닫아야 함
__exit__에서 예외 처리 전략을 명확히- 예외를 삼킬지(
True반환), 전달할지(False반환) 결정
- 예외를 삼킬지(
contextlib적극 활용- 간단한 리소스 관리라면
@contextmanager가 훨씬 간단함
- 간단한 리소스 관리라면
- 가독성 향상
with문을 사용하면 코드 블록이 명확해져 협업 시에도 유리
7. 결론
- 컨텍스트 매니저는 리소스를 안정적으로 관리할 수 있는 필수 도구입니다.
__enter__,__exit__메서드를 통해 직접 구현하거나,contextlib모듈을 활용하면 간단히 작성할 수 있습니다.- 실무에서는 파일, 데이터베이스, 네트워크 연결, 타이머 등 다양한 곳에 적용할 수 있어, 반드시 익혀야 하는 파이썬 심화 문법 중 하나입니다.