
hook:
특정 S/W나 framework의 실행 중간 과정에
사용자가 만든 코드를 끼워 넣어 실행하게 하는 디자인 패턴임.
참고로, 음악에서의 hook는 노래에서 청취자의 귀를 사로잡아 기억에 남도록 만드는 짧은 구절 또는 후렴구 를 의미함. 청취자의 관심과 귀를 사로잡는다는 개념에서 hook이 사용됨.
1. 비유: '갈고리'
일상의 '갈고리(hook)'에 비유하면 개념을 이해하기 쉬움.
- 벽: 핵심 기능을 하는 소프트웨어 또는 framework.
- 갈고리(hook): 소프트웨어가 "여기에 무언가 걸 수 있음"이라고 약속하고 만들어 둔 지점.
- 옷, 모자 등: 우리가 갈고리에 거는 것. 즉, 사용자가 직접 만든 추가 기능임.
벽 자체를 수정할 필요 없이, 이미 있는 '갈고리'에 원하는 것을 걸면 됨. 프로그래밍의 'hook'도 이와 동일한 원리로 작동함.
2. hook의 핵심 개념
hook: 특정 소프트웨어나 framework의 실행 중간 과정에 사용자가 만든 코드를 끼워 넣어 실행하게 하는 장치임.
핵심 시스템은 정해진 흐름(lifecycle)에 따라 동작함.
예를 들어 "파일 저장" 기능은 (1) 저장 시작 → (2) 데이터 쓰기 → (3) 저장 완료의 흐름을 가짐.
이때 시스템 개발자가 각 단계에 'hook'을 만들어 두면, 핵심 코드를 직접 수정하지 않고도 원하는 기능 추가가 가능함.
- "저장 시작 전 (
pre-savehook) 파일 내용을 자동으로 검사." - "저장 완료 후 (
post-savehook) 다른 사람에게 알림 전송."
즉, hook은 '이벤트 발생 시 자동으로 호출되는 함수(콜백)'를 등록 가능한 지점임.
3. hook과 event handler의 관계
hook은 'event handler'와 매우 유사하며 같은 원리를 공유함.
- 공통점: 둘 다 "이벤트(Event) 발생 시, 정해진 함수를 실행(Handling)"하는 이벤트 기반(Event-driven) 구조를 가짐.
- 사용자의 버튼 클릭(
click이벤트)에 반응하는 함수(onClick핸들러)나, - 코드 커밋(
commit이벤트)에 반응하는 함수(pre-commithook)는 근본적으로 동일한 패턴임.
- 사용자의 버튼 클릭(
- 차이점 (용어의 사용 맥락):
- event handler: 주로 사용자 인터페이스(UI)나 입출력(I/O)과 같이, 시스템 외부에서 발생하는 비동기적 사건에 대한 반응을 처리할 때 주로 사용됨.
- (예:
onClick,onKeyPress,onLoad)
- (예:
- hook: framework나 라이브러리 같은 시스템의 내부 동작 흐름에 끼어들 때 더 많이 사용되는 용어임.
- 외부 사건보다는 시스템의 정해진 생명주기(Lifecycle)나 처리 단계(Pipeline)가 '이벤트'가 됨.
- (예:
before_save,after_render,pre-commit)
- event handler: 주로 사용자 인터페이스(UI)나 입출력(I/O)과 같이, 시스템 외부에서 발생하는 비동기적 사건에 대한 반응을 처리할 때 주로 사용됨.
결론적으로, event handler는 hook의 한 종류로 볼 수 있음.
하지만 일반적으로 'hook'이라고 할 때는 시스템의 내부 동작을 확장하고 제어하는 더 넓은 의미의 '연결 지점'을 가리키는 경우가 많음.
참고로, event handler나 hook 모두 callback 함수를 이용하여 구현된다는 공통점을 가짐.
2023.07.13 - [Python] - [Python] Callback function
[Python] Callback function
Callback Functioncallback function란 다음 두가지에 해당하는 function을 의미한다.다른 function의 argument로 전달되어 특정 event가 발생시 호출이 이루어지는 function을 가르킨다 (사용자가 명시적으로 호출하
ds31x.tistory.com
4. hook의 장점
- 확장성 (Extensibility):
- 핵심 코드(Core code) 변경 없이 시스템 기능 확장 및 동작 변경이 가능함.
- 이는 플러그인(Plugin) 아키텍처의 기반이 됨.
- 유연성 (Flexibility): 사용자는 자신의 필요에 맞게 시스템의 동작을 쉽게 커스터마이징 가능함.
- 관심사의 분리 (Separation of Concerns): 핵심 시스템은 주된 역할에만 집중하고, 부가 기능은 hook에 연결된 외부 코드에 위임함.
- 이로 인해 코드가 더 깔끔해지고 유지보수가 용이해짐.
5. hook의 대표적인 예시
- 라이브러리 (yt_dlp):
- youtube의 컨텐츠를 다운로드하게 해주는 open source
yt_dlp라이브러리 의 경우, 동영상 다운로드 중간 과정을 외부에 알리기 위해'progress_hooks'라는 'hook'을 인자로 제공함. - 사용자는
progress_hook이라는 자신만의 함수(진행률 바 표시 기능)를 만들어 이 '갈고리'에 걸었음. ('progress_hooks': [progress_hook]) - 결과적으로
yt_dlp라이브러리 코드를 직접 수정하지 않고도, 다운로드 진행률 표시라는 새로운 기능을 추가할 수 있었음.
- youtube의 컨텐츠를 다운로드하게 해주는 open source
- Git s:
pre-commit: 커밋 메시지를 작성하기 전 자동으로 코드 스타일 검사(lint)를 실행함.pre-push: 원격 저장소로 코드를 푸시하기 전 자동으로 테스트 코드를 실행함.
- 웹 framework (React, Vue.js):
- React의
useEffect,useState등은 컴포넌트의 생명주기(생성, 업데이트, 소멸)의 특정 시점에 코드를 실행하게 해주는 hook임.useEffect는 "컴포넌트가 렌더링된 후에 이 코드를 실행"하라는 의미를 가짐.
- React의
- 플러그인 시스템 (WordPress, VS Code):
- 워드프레스에서 글을 화면에 표시하기 전 내용을 변경하거나(
the_contenthook), VS Code에서 파일 저장 시 특정 동작을 수행하는(onDidSaveTextDocumenthook) 확장 기능들은 모두 hook 기반으로 만들어짐.
- 워드프레스에서 글을 화면에 표시하기 전 내용을 변경하거나(
- 웹hook (Webhook):
- 원리는 비슷함. 특정 이벤트(예: GitHub 푸시) 발생 시 외부 서비스의 URL을 호출하는 방식임. 이벤트 기반으로 코드를 실행한다는 점에서 hook의 개념과 연결됨.
PyTorch 등에서도 forward 및 backwoard 과정에 여러 hook을 지원하고 있음.
2025.04.10 - [Python] - [DL] PyTorch-Hook
[DL] PyTorch-Hook
PyTorch의 hook은Neural Network 내부의 계산 과정을 관찰하거나,특정 시점에서 개입할 수 있도록 해주는 기능 (사실은 function 또는 instance method임).을 제공함. 이를 통해 forward 중간 출력 및 backward 에서
ds31x.tistory.com
다음은 Python의 urllib.request 모듈의 rulretrieve 함수에서 hook인 reporthook 인자의 사용법을 보여줌:
https://ds31x.tistory.com/537#urlretrieve
[urllib] request 모듈
urllib은 Python의 표준 라이브러리로, URL 작업을 위한 여러 모듈을 제공함.이 중에서 urllib.request 모듈은 HTTP/HTTPS 요청 처리를 위한 것임. 참고로 urllib 라이브러리의 주요 구성 모듈은 다음과 같음:ur
ds31x.tistory.com
6. 결론
hook은 잘 만들어진 소프트웨어를 더욱 강력하고 유연하게 만드는 핵심 디자인 패턴임.
"정해진 시점에 나만의 코드를 끼워 넣을 수 있는 연결고리"로 hook을 이해하고, 사용하는 라이브러리 등에서 제공하는 hook 들을 기억하면 효과적인 프로그래밍이 가능.
같이보면 좋은 자료
s00 Event Handling Mechanism
Event별로 처리하는 ***Event Handler (실제로 widget의 method)*** 들은 해당 Event가 발생한 Widget의 특정 메서드로서 미리 ***메서드…
wikidocs.net
'Python' 카테고리의 다른 글
| Python Data Model (+ Metaclass) (0) | 2026.02.25 |
|---|---|
| Python Class Definition and Object Model (0) | 2025.12.24 |
| PyPI에 wheel을 업로드하기 (0) | 2025.12.21 |
| 개발 디렉토리를 pip package로 설치하기 - pip install -e . (0) | 2025.12.21 |
| Typing: dynamic vs. static and strong vs. weak (0) | 2025.12.09 |