본문 바로가기
프로그래밍언어/파이썬[중급]

[파이썬][중급] Chapter08. contextlib와 with문 커스터마이징

by about_IT 2025. 5. 18.
728x90

파이썬의 with문은 자원 관리를 보다 명확하고 안전하게 처리할 수 있도록 도와주는 문법입니다. 파일 열기와 같이 자원을 열고 닫는 작업에 자주 사용되며, contextlib 모듈을 활용하면 이러한 with문의 동작을 커스터마이징할 수 있습니다.


● with문의 기본 구조

with문은 컨텍스트 매니저(Context Manager)를 기반으로 동작하며, __enter____exit__ 메서드를 구현한 객체를 통해 자원 할당과 해제를 자동으로 수행합니다.

with open("test.txt", "r") as f:
    data = f.read()

이 코드는 파일을 열고 읽은 뒤 자동으로 파일을 닫습니다. 수동으로 close()를 호출할 필요가 없습니다.


● 사용자 정의 컨텍스트 매니저

클래스에 __enter____exit__ 메서드를 구현하면 직접 with문에서 사용할 수 있는 객체를 만들 수 있습니다.

class CustomContext:
    def __enter__(self):
        print("자원 획득")
        return self

    def __exit__(self, exc_type, exc_value, traceback):
        print("자원 해제")

with CustomContext():
    print("작업 중")

출력 결과는 "자원 획득 → 작업 중 → 자원 해제" 순서로 동작합니다.


● contextlib.contextmanager 사용

contextlib.contextmanager 데코레이터를 사용하면 클래스를 만들지 않고도 함수 기반으로 컨텍스트 매니저를 쉽게 정의할 수 있습니다.

from contextlib import contextmanager

@contextmanager
def custom_open(path):
    f = open(path, "r")
    try:
        yield f
    finally:
        f.close()

with custom_open("test.txt") as f:
    print(f.read())

이 방식은 자원 해제를 finally에서 보장하기 때문에 매우 안전합니다.


● 마무리

컨텍스트 매니저는 자원 관리가 필요한 모든 상황에서 유용하게 쓰입니다. 특히 contextlib을 활용하면 반복적인 자원 처리 코드를 깔끔하게 리팩토링할 수 있습니다. 파일, 네트워크, 데이터베이스 등 다양한 영역에서 응용할 수 있으므로 꼭 익혀두시기 바랍니다.

728x90