기본 콘텐츠로 건너뛰기

라벨이 yield인 게시물 표시

Python에서 context manager를 커스텀하게 만드는 법

파이썬으로 코딩하다 보면, with 문을 엄청 자주 쓰게 되잖아요? 파일 열고 닫을 때, 데이터베이스 연결할 때, 잠깐 써야 하는 자원을 관리할 때 정말 유용하죠. 이게 바로 context manager 덕분인데, 표준 라이브러리에 있는 것만으로는 부족할 때가 있더라고요. 그래서 직접 만들어 써야 할 때가 생기는데, 어떻게 하는 건지 궁금하셨죠? 제가 직접 경험하면서 깨달은 내용을 공유해 드릴게요! 파이썬에서 context manager를 직접 만드는 방법은 크게 두 가지가 있어요. 하나는 클래스를 이용하는 방법이고, 다른 하나는 contextlib.contextmanager 라는 데코레이터를 쓰는 방법이죠. 먼저, 클래스를 이용하는 방법부터 알려드릴게요. 이 방법은 좀 더 복잡하지만, 복잡한 로직을 구현할 때 유용해요. 핵심은 __enter__ 와 __exit__ 라는 두 개의 특별한 메서드를 클래스 안에 정의하는 거예요. __enter__ 는 with 문이 시작될 때 실행되고, __exit__ 는 with 문이 끝나거나 예외가 발생했을 때 실행됩니다. 제가 처음 이걸 봤을 때는 좀 헷갈렸는데, 실제로 코드를 짜보면서 감을 잡았어요. 예를 들어, 데이터베이스 연결을 관리하는 context manager를 만들어 볼게요. __enter__ 메서드에서는 데이터베이스에 연결하고, __exit__ 메서드에서는 연결을 끊는 코드를 작성하면 되죠. 그리고 __exit__ 메서드에는 예외 처리를 위한 세 개의 매개변수가 있는데, 이걸 이용해서 예외가 발생했을 때도 연결을 깔끔하게 끊을 수 있어요. 이 부분은 꼭 기억해 두세요! 예외 처리를 제대로 안 하면, 자원이 제대로 해제되지 않아서 프로그램이 뻗어버리는 경우도 있거든요. 제가 한 번 그랬거든요… ㅠㅠ 다음은 contextlib.contextmanager 데코레이터를 이용하는 방법이에요. 이 방법은 클래스를 이용하는 방법보다 ...