
웹 개발에서 자주 마주치는 개념 중 하나가 바로 이벤트 전파(event propagation)입니다. 이 글에서는 이벤트 전파의 원리와 실전 활용법을 쉽고 명확하게 설명합니다.
이벤트 전파는 DOM(Document Object Model)에서 이벤트가 발생했을 때, 그 이벤트가 어떤 경로로 전달되는지를 설명하는 개념입니다. 이 메커니즘을 이해하면, 복잡한 사용자 인터페이스에서 효율적으로 이벤트를 제어할 수 있습니다.
이벤트 전파는 다음과 같은 세 단계로 이루어집니다:
| 단계 | 설명 |
|---|---|
| 캡처링 | 이벤트가 최상위 요소(document)에서 시작해 타깃 요소로 내려감 |
| 타겟 | 이벤트가 실제로 발생한 요소(타깃)에 도달 |
| 버블링 | 타깃 요소에서 다시 상위 요소로 이벤트가 전파되며 올라감 |
캡처링(Capturing) 단계
이벤트가 DOM 트리의 최상위 요소에서 시작해, 이벤트가 발생한 타깃 요소로 내려갑니다. 이 과정에서 상위 요소에 등록된 리스너가 실행될 수 있습니다.
타겟(Target) 단계
이벤트가 실제로 발생한 요소에 도달합니다. 이때 타깃 요소에 등록된 이벤트 리스너가 실행됩니다.
버블링(Bubbling) 단계
이벤트가 타깃 요소에서 다시 상위 요소로 전파되며 올라갑니다. 상위 요소에 등록된 리스너가 실행될 수 있습니다.
이벤트 전파를 건물의 경비 시스템에 비유할 수 있습니다:
// HTML 구조 예시
// <div id="parent">
// <button id="child">Click me</button>
// </div>
const parent = document.getElementById('parent');
const child = document.getElementById('child');
// 캡처링 단계에서 이벤트 리스너 등록
parent.addEventListener('click', () => {
console.log('Parent - Capturing');
}, { capture: true });
// 버블링 단계에서 이벤트 리스너 등록 (기본값)
parent.addEventListener('click', () => {
console.log('Parent - Bubbling');
});
child.addEventListener('click', () => {
console.log('Child - Target');
});
addEventListener의 세 번째 인자에 { capture: true }를 전달하면 캡처링 단계에서 이벤트를 처리할 수 있습니다.event.stopPropagation()을 사용하면 특정 단계에서 이벤트 전파를 중단할 수 있습니다.child.addEventListener('click', (event) => {
event.stopPropagation(); // 이후 상위 요소로 이벤트가 전파되지 않음
console.log('Child - Target & Stop Propagation');
});
이벤트 전파는 DOM 구조에서 이벤트가 어떻게 상위와 하위 요소 간에 전달되는지를 정의하는 핵심 메커니즘입니다. 이를 이해하면 복잡한 사용자 상호작용을 효율적으로 관리할 수 있으며, 버그 없는 프론트엔드 코드를 작성하는 데 큰 도움이 됩니다.