본 콘텐츠의 이미지 및 내용은 AI로 생성되었습니다.
본 콘텐츠의 이미지 및 내용을 무단으로 복제, 배포, 수정하여 사용할 경우 저작권법에 의해 법적 제재를 받을 수 있습니다.
이미지 로딩 중...
CodeDeck AI
2025. 11. 8. · 63 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문 #리소스관리 #고급기능
댓글 (0)
함께 보면 좋은 카드 뉴스
에이전트 클래식 패러다임 구현 완벽 가이드
ReAct, Plan-and-Solve, Reflection 등 AI 에이전트의 핵심 클래식 패러다임을 원리부터 실전 구현까지 체계적으로 학습합니다. 초보 개발자도 이해할 수 있도록 비유와 스토리로 풀어냅니다.
에이전트 발전사 기호주의에서 LLM까지
AI 에이전트의 기원부터 LLM 기반 에이전트까지 발전 과정을 이북 스타일로 살펴봅니다. 초보 개발자도 쉽게 이해할 수 있도록 비유와 스토리텔링으로 풀어냅니다.
Value Embeddings 완벽 분석 ResFormer 아키텍처
AutoResearch 프로젝트의 train.py에 구현된 Value Embeddings(ResFormer) 아키텍처를 심도 있게 분석합니다.
Flash Attention 3과 Rotary Embeddings 완벽 분석
AutoResearch 프로젝트의 train.py에 구현된 Flash Attention 3 커널 선택 로직, Rotary Position Embeddings(RoPE)의 수학적 원리와 구현, 그리고 Sliding Window Attention 패턴을 심도 있게 분석합니다.
GPT 모델 아키텍처 완벽 분석 - CausalSelfAttention부터 GPT까지
AutoResearch의 train.py에 구현된 GPT 모델 아키텍처를 상세 분석합니다. GPTConfig 데이터클래스부터 CausalSelfAttention, MLP, Block, GPT 클래스까지 전체 구조와 가중치 초기화 전략을 다룹니다.