파이썬 monkey-patch (몽키 패치)¶
남이 만든 라이브러리 코드를 직접 수정하지 않고, 그 라이브러리의 동작을 밖에서 바꿔치기하는 기법. 2026-05-14 우리집 카페 자동 포스팅 작업하면서 정리.
비유¶
화장품 가게가 "립스틱은 빨간색" 이라고 미리 정해놓고 가게를 차렸다. 근데 손님이 "내 가게에선 핑크색으로 보이게 해줘" 하고 싶다.
선택지 두 가지: 1. 가게 본사 가서 빨간색 → 핑크색으로 라벨 변경 요청 (영구적, 다른 가게도 영향) 2. 내 가게로 들여올 때만 핑크색 라벨로 살짝 바꿔치기 (지금 이 작업만)
monkey-patch는 2번 방식이다. 라이브러리 코드는 그대로 두고, 내 스크립트에서만 동작을 바꾼다.
실제 사건¶
C:\Projects\my-skills\_shared\cafe-upload\cafe_core.py에 이런 게 박혀 있었다.
# cafe_core.py (라이브러리)
CAFE_ID = '29810237' # 민티 개인 카페용
class CafeWriter:
def open_editor(self, title):
# 이 메서드 안에서 CAFE_ID를 참조해서 카페 URL 만듦
url = f'https://cafe.naver.com/ca-fe/cafes/{CAFE_ID}/articles/write'
...
근데 우리집 카페(개원공간)는 ID가 31159112. 다른 카페다. cafe_core.py 자체를 수정하면 다른 모든 카페 작업이 영향받음.
해결: monkey-patch¶
# publish_cafe.py (내 스크립트)
import cafe_core
cafe_core.CAFE_ID = '31159112' # 이 스크립트 실행 중만 바꿔치기
from cafe_core import CafeWriter
writer = CafeWriter(...)
writer.open_editor("제목")
# → open_editor 안에서 CAFE_ID 읽을 때 31159112 값 사용
cafe_core.CAFE_ID = '...' 한 줄로 모듈의 글로벌 상수를 외부에서 덮어썼다.
이 스크립트가 끝나면 메모리에서 사라지고, 다른 스크립트는 여전히 원래 값(29810237)을 본다.
왜 동작하는가?¶
파이썬에서 모듈은 import할 때 객체 한 개가 메모리에 만들어진다. 그 모듈의 상수/함수는 그 객체의 속성이다.
import cafe_core # cafe_core 모듈 객체 1개 생성
print(cafe_core.CAFE_ID) # '29810237'
cafe_core.CAFE_ID = '31159112' # 그 객체의 속성을 바꿈
print(cafe_core.CAFE_ID) # '31159112'
open_editor 같은 메서드는 호출될 때마다 CAFE_ID를 다시 읽는다. 즉 메서드 실행 시점에 모듈 객체에서 최신값을 가져옴. 그래서 import 한 후에 값 바꿔도 반영된다.
⚠️ 주의: from cafe_core import CAFE_ID 식으로 변수 이름을 직접 import하면 monkey-patch 안 됨. 그건 import 시점의 값을 복사해버리니까. 항상 모듈 자체를 import 하고 점(.)으로 접근해야 한다.
# ❌ monkey-patch 무효
from cafe_core import CAFE_ID
CAFE_ID = '31159112' # 내 변수만 바뀜, cafe_core.CAFE_ID는 그대로
# ✅ monkey-patch 됨
import cafe_core
cafe_core.CAFE_ID = '31159112'
언제 쓰면 좋은가¶
- 남이 만든 라이브러리의 설정값을 바꾸고 싶을 때 (CAFE_ID, API_URL, TIMEOUT 같은 모듈 상수)
- 테스트할 때 (실제 API 안 쏘고 mock 함수로 바꿔치기)
- 버그 우회 (라이브러리 함수에 버그 있는데 PR 보내고 머지될 때까지 임시 패치)
- 다른 카페/계정/환경에 같은 라이브러리 재사용
언제 쓰면 안 되는가¶
- 라이브러리 메인 클래스/함수의 핵심 로직을 통째로 바꿔치기 → 그건 그냥 fork 떠서 수정하는 게 낫다
- 팀 코드에서 다른 사람이 모르게 monkey-patch → 디버깅 지옥. 주석 꼭 박을 것
실전 예시 (우리집 작업)¶
# D:\woorijipinterior\blog\260508_병원인테리어책출간\publish_cafe.py
import cafe_core
cafe_core.CAFE_ID = '31159112' # 개원공간 카페로 override
cafe_core.DEFAULT_LOGIN_BAT = r'D:\chrome-profiles\login-woori.bat'
from cafe_core import CafeWriter
writer = CafeWriter(
profile_dir=r'D:\chrome-profiles\naver-woori',
menu_id='225',
)
cafe_core.py 한 줄도 안 건드리고, 우리집 카페용으로 동작 변경 완료.
핵심 교훈¶
- 라이브러리 코드 직접 수정 = 마지막 선택지. 일단 monkey-patch로 가능한지 살펴보기
- 모듈 자체를 import 하고 점으로 접근.
from X import Y안 함 - monkey-patch 한 줄 옆에 항상 주석. 다른 사람(미래의 나)이 왜 이러는지 알아야
- 글로벌 상수 / 함수 둘 다 바꿔치기 가능. 함수도
module.func = my_new_func식