이미지 로딩 중...
CodeDeck AI
2025. 11. 8. · 22 Views
Python 컨텍스트 매니저 완벽 가이드
파일, 데이터베이스, 네트워크 연결 등의 리소스를 안전하게 관리하는 컨텍스트 매니저의 모든 것을 배워봅니다. with 문부터 커스텀 컨텍스트 매니저 작성까지 실무에서 바로 활용할 수 있는 패턴들을 소개합니다.
들어가며
이 글에서는 Python 컨텍스트 매니저 완벽 가이드에 대해 상세히 알아보겠습니다. 총 10가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.
목차
- 기본_with_문_사용하기
- 여러_리소스_동시_관리
- 클래스로_컨텍스트_매니저_만들기
- contextlib_데코레이터_활용
- 데이터베이스_트랜잭션_관리
- suppress로_예외_무시하기
- ExitStack으로_동적_리소스_관리
- Lock을_활용한_스레드_안전성
- redirect_stdout으로_출력_리다이렉트
- 재사용_가능한_컨텍스트_매니저
1. 기본_with_문_사용하기
개요
with 문은 파일이나 리소스를 자동으로 열고 닫아줍니다. 예외가 발생해도 안전하게 리소스가 정리됩니다.
코드 예제
with open('data.txt', 'r') as file:
content = file.read()
print(content)
# 파일이 자동으로 닫힘
설명
with 블록이 끝나면 자동으로 file.close()가 호출되어 파일이 안전하게 닫힙니다.
2. 여러_리소스_동시_관리
개요
여러 개의 컨텍스트 매니저를 한 번에 사용할 수 있습니다. 각각의 리소스가 독립적으로 관리됩니다.
코드 예제
with open('input.txt', 'r') as infile, \
open('output.txt', 'w') as outfile:
data = infile.read()
outfile.write(data.upper())
설명
두 파일을 동시에 열어 입력 파일의 내용을 읽고, 대문자로 변환하여 출력 파일에 씁니다.
3. 클래스로_컨텍스트_매니저_만들기
개요
__enter__와 exit 메서드를 구현하여 커스텀 컨텍스트 매니저를 만들 수 있습니다.
코드 예제
class Timer:
def __enter__(self):
self.start = time.time()
return self
def __exit__(self, *args):
print(f"실행 시간: {time.time() - self.start}초")
설명
with Timer(): 블록 안의 코드 실행 시간을 자동으로 측정하고 출력합니다.
4. contextlib_데코레이터_활용
개요
@contextmanager 데코레이터를 사용하면 간단하게 컨텍스트 매니저를 만들 수 있습니다.
코드 예제
from contextlib import contextmanager
@contextmanager
def temp_change_dir(path):
old_dir = os.getcwd()
os.chdir(path)
yield
os.chdir(old_dir)
설명
yield 전에 설정 작업을, yield 후에 정리 작업을 수행합니다. 임시로 디렉토리를 변경했다가 원래대로 되돌립니다.
5. 데이터베이스_트랜잭션_관리
개요
컨텍스트 매니저로 데이터베이스 트랜잭션을 안전하게 관리할 수 있습니다.
코드 예제
@contextmanager
def transaction(connection):
try:
yield connection
connection.commit()
except Exception:
connection.rollback()
raise
설명
with transaction(conn): 블록 안에서 오류가 발생하면 rollback하고, 성공하면 commit을 자동으로 처리합니다.
6. suppress로_예외_무시하기
개요
contextlib.suppress를 사용하면 특정 예외를 조용히 무시할 수 있습니다.
코드 예제
from contextlib import suppress
with suppress(FileNotFoundError):
os.remove('temp_file.txt')
# 파일이 없어도 에러 없이 계속 진행
설명
FileNotFoundError가 발생해도 프로그램이 중단되지 않고 계속 실행됩니다.
7. ExitStack으로_동적_리소스_관리
개요
실행 시점에 결정되는 여러 개의 컨텍스트 매니저를 동적으로 관리할 수 있습니다.
코드 예제
from contextlib import ExitStack
with ExitStack() as stack:
files = [stack.enter_context(open(f))
for f in file_list]
# 모든 파일 사용
설명
파일 개수를 미리 알 수 없을 때 유용합니다. 모든 파일이 자동으로 닫힙니다.
8. Lock을_활용한_스레드_안전성
개요
threading.Lock을 컨텍스트 매니저로 사용하여 멀티스레드 환경에서 안전하게 작업할 수 있습니다.
코드 예제
import threading
lock = threading.Lock()
with lock:
shared_resource += 1
# 다른 스레드의 접근 차단
설명
with 블록 안에서만 lock이 유지되고, 블록을 벗어나면 자동으로 해제됩니다.
9. redirect_stdout으로_출력_리다이렉트
개요
표준 출력을 일시적으로 파일이나 다른 스트림으로 리다이렉트할 수 있습니다.
코드 예제
from contextlib import redirect_stdout
with open('output.txt', 'w') as f:
with redirect_stdout(f):
print('파일에 저장됩니다')
# 콘솔 대신 파일로 출력
설명
with 블록 안의 모든 print 출력이 파일로 리다이렉트되고, 블록이 끝나면 원래대로 돌아옵니다.
10. 재사용_가능한_컨텍스트_매니저
개요
한 번만 사용할 수 있는 일반 컨텍스트 매니저와 달리, 재사용 가능한 컨텍스트 매니저를 만들 수 있습니다.
코드 예제
class ReusableContext:
def __init__(self, name):
self.name = name
def __enter__(self):
print(f'{self.name} 시작')
return self
def __exit__(self, *args):
print(f'{self.name} 종료')
설명
같은 인스턴스를 여러 번 with 문에서 사용할 수 있어 반복적인 작업에 유용합니다.
마치며
이번 글에서는 Python 컨텍스트 매니저 완벽 가이드에 대해 알아보았습니다. 총 10가지 개념을 다루었으며, 각각의 사용법과 예제를 살펴보았습니다.
관련 태그
#Python #ContextManager #with문 #리소스관리 #고급기능