파이썬에서 리소스를 다룰 때 필수적인 with 문 뒤에는 '컨텍스트 매니저'라는 강력한 메커니즘이 존재한다.
단순히 파일을 닫는 기능을 넘어, 백엔드 개발의 안정성을 책임지는 이 개념을 정리해보자!

1. 컨텍스트 매니저란?
컨텍스트 매니저는 원하는 시점에 정확하게 리소스를 설정(Setup)하고 해제(Teardown)할 수 있도록 돕는 객체
파이썬의 with 문과 함께 사용되어 코드의 실행 문맥(Context)을 제어함.
2. 컨텍스트 매니저의 두 가지 구현 방식
① 클래스 기반 (Magic Methods)
클래스 내부에 __enter__와 __exit__ 메서드를 정의하는 방식
__enter__: 리소스를 확보하거나 초기화 로직을 수행__exit__: 리소스를 반납하거나 예외를 처리
class MyDatabase:
def __enter__(self):
print("DB 연결 성공")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("DB 연결 종료")
if exc_type:
print(f"에러 발생 처리: {exc_val}")
with MyDatabase() as db:
print("쿼리 실행 중...")
② 함수 기반 (@contextlib.contextmanager)
데코레이터를 사용하여 제너레이터(yield) 형식으로 간단하게 구현할 수 있음. 코드 양이 적어 실무에서 선호된다.
from contextlib import contextmanager
@contextmanager
def temp_file_manager():
print("파일 오픈")
yield # 이 시점에서 with 블록 내부 코드가 실행됨
print("파일 클로즈")
with temp_file_manager():
print("데이터 기록 중...")
3. 백엔드 실무 활용
백엔드 개발에서 컨텍스트 매니저는 '원자성(Atomicity)'과 '안전성'을 보장하는 핵심 도구이다.
데이터베이스 트랜잭션 관리
실무에서는 여러 개의 DB 쓰기 작업이 모두 성공하거나 모두 실패해야 한다.
컨텍스트 매니저를 통해 에러 발생 시 자동으로 롤백(Rollback) 처리를 수행한다.
- 성공 시:
commit()호출 - 실패 시:
__exit__에서rollback()호출
분산 락(Distributed Lock) 구현
Redis 등을 이용해 여러 서버에서 동일한 자원을 수정하지 못하도록 막을 때 사용한다.
with 문을 나가면 어떤 상황에서도 잠금이 해제되도록 설계하여 시스템 교착 상태(Deadlock)를 방지한다.
실행 시간 측정 및 로깅
특정 API 로직의 실행 시간을 측정하는 프로파일러를 만들 때도 유용하다.
with timer("User Update API"):
# 복잡한 비즈니스 로직 실행
update_user_info()
# 블록 종료 시 자동으로 실행 시간 기록(Logging)
컨텍스트 매니저는 with 문을 통해 리소스의 시작과 끝을 관리하는 객체이다.
__enter__와 __exit__를 통해 예외 상황에서도 안전하게 리소스를 해제한다.
백엔드 실무에서는 DB 커넥션, 네트워크 세션, 분산 락 등 자원 관리가 필수적인 영역에서 중추적인 역할을 담당한다.
파이썬다운(Pythonic) 코드를 작성하고 싶다면, 반복되는 try...finally 패턴을 컨텍스트 매니저로 대체해보자!
'ProgrammingLanguages' 카테고리의 다른 글
| [Python/Java] 객체지향, 캡슐화(Encapsulation) (1) | 2025.12.20 |
|---|