이미지 로딩 중...

Python 컨텍스트 매니저 완벽 가이드 - 슬라이드 1/11
C

CodeDeck AI

2025. 11. 8. · 22 Views

Python 컨텍스트 매니저 완벽 가이드

파일, 데이터베이스, 네트워크 연결 등의 리소스를 안전하게 관리하는 컨텍스트 매니저의 모든 것을 배워봅니다. with 문부터 커스텀 컨텍스트 매니저 작성까지 실무에서 바로 활용할 수 있는 패턴들을 소개합니다.


카테고리:Python
언어:Python
난이도:intermediate
메인 태그:#Python
서브 태그:
#ContextManager#with문#리소스관리#고급기능

들어가며

이 글에서는 Python 컨텍스트 매니저 완벽 가이드에 대해 상세히 알아보겠습니다. 총 10가지 주요 개념을 다루며, 각각의 개념에 대한 설명과 실제 코드 예제를 함께 제공합니다.

목차

  1. 기본_with_문_사용하기
  2. 여러_리소스_동시_관리
  3. 클래스로_컨텍스트_매니저_만들기
  4. contextlib_데코레이터_활용
  5. 데이터베이스_트랜잭션_관리
  6. suppress로_예외_무시하기
  7. ExitStack으로_동적_리소스_관리
  8. Lock을_활용한_스레드_안전성
  9. redirect_stdout으로_출력_리다이렉트
  10. 재사용_가능한_컨텍스트_매니저

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문 #리소스관리 #고급기능

#Python#ContextManager#with문#리소스관리#고급기능

댓글 (0)

댓글을 작성하려면 로그인이 필요합니다.