inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

이벤트부터 SPA까지, 상호작용 웹의 필수 엔진 - [DOM 완전 정복 Part 2]

17. 이벤트 전파 완전 정복 – 캡처링, 버블링, stopPropagation까지 흐름을 꿰뚫다

stopPropagation()에 대해서 질문 있습니다.

해결된 질문

74

eddie

작성한 질문수 4

0

안녕하세요?
강의를 듣다가 궁금한 것이 있어서 글을 남깁니다.

섹션 5에서 stopPropagation() 설명이 나올때 상위로 전파 차단이 라고 설명을 주셨는데,

강의를 모두 듣고 보면 상위로 전파 차단 뿐만이 아니라 즉 캡쳐링 뿐만 아니라 버블링도 차단 해주는 걸로 이해가 되고 있습니다.

혹시 상위로 전파 차단이란 것이 캡쳐링이 아닌 다른 의미로 쓰인건지 궁금합니다.

상위로 전파 차단이 혹사 다른 의미로 쓰였다면 그 의미에 대해서 알 수 있을까요?

HTML/CSS javascript react web-api dom

답변 2

1

nhcodingstudio

안녕하세요 Eddie님! 남겨주신 질문을 보니 DOM 이벤트 전파 흐름의 핵심을 아주 깊이 있게 파고들고 계시네요. 질문해주신 내용 중 용어에 대한 약간의 오해가 있으셨던 것 같아 이 부분부터 명확히 짚어드리고, 어떻게 동작하는지 상세히 설명해 드리겠습니다.

강의에서 말씀드린 상위로 전파 차단이라는 표현은 캡처링이 아니라 버블링을 의미하는 것입니다. 브라우저의 이벤트 흐름은 최상단 부모에서 실제 클릭된 타겟 요소로 파고 내려가는 캡처링 단계와, 타겟에서 다시 부모 요소들을 타고 위로 올라가는 버블링 단계로 나뉩니다. 즉, 부모 요소라는 상위로 이벤트가 전파된다는 것은 곧 버블링을 뜻합니다. 여기에 딥다이브를 좋아하시는 Eddie님을 위해 아주 사소한 팁을 하나 더 얹어드리자면, DOM 이벤트 흐름은 엄밀히 말해 최상위에서 내려오는 캡처링 단계, 실제 클릭한 요소에 도달하는 타겟 단계, 그리고 다시 위로 올라가는 버블링 단계라는 세 가지 과정으로 이루어집니다. 비록 흐름의 방향성을 설명하기 위해 타겟 단계를 생략하고 말씀드렸지만, 이 세 단계를 모두 알아두시면 이해가 훨씬 깊어지실 겁니다.

Eddie님이 강의를 모두 들으신 후 이해하신 내용이 아주 정확합니다. stopPropagation 함수는 단순히 버블링만 막는 것도 아니고 캡처링만 막는 것도 아닙니다. 이 함수의 정확한 동작 원리는, 현재 이벤트가 캡처링 단계에 있든 버블링 단계에 있든 상관없이 이 함수가 호출된 바로 그 시점부터 더 이상의 이벤트 전파를 완전히 끊어버리는 것입니다.

만약 캡처링 단계의 이벤트 리스너에서 이 메서드를 호출하면 어떻게 될지 아래 코드로 살펴보겠습니다.

// 부모 요소의 캡처링 단계에서 전파를 막는 예시입니다.
parentElement.addEventListener('click', (e) => {
  e.stopPropagation(); 
  console.log('부모 캡처링 단계');
}, { capture: true });

// 자식 요소의 이벤트 리스너입니다.
childElement.addEventListener('click', (e) => {
  console.log('자식 클릭 이벤트'); 
});

위의 예시처럼 캡처링 옵션을 켠 부모 요소에서 stopPropagation을 호출하게 되면, 이벤트가 타겟인 자식 요소까지 채 내려가기도 전에 흐름이 멈춰버리게 되어 자식 요소의 클릭 이벤트는 절대 실행되지 않습니다. 반대로 우리가 흔히 작성하는 기본 이벤트 리스너는 버블링 단계에서 동작하므로, 자식 요소에서 호출하게 되면 부모 요소로 클릭 이벤트가 올라가는 상위 전파를 막아주게 되는 것입니다.

따라서 강의에서 상위로 전파 차단이라고 설명해 드린 것은, 실무에서 우리가 작성하는 대부분의 이벤트 핸들러가 기본적으로 버블링 단계에서 동작하기 때문에 가장 흔하게 마주하는 맥락을 강조해서 말씀드린 것입니다. 실제로 실무에서는 모달 창이나 팝업 메뉴를 구현할 때 이 방식을 아주 유용하게 활용합니다. 예를 들어, 어두운 배경 영역을 클릭하면 모달이 닫히도록 구현해 두었는데 사용자가 모달 내부의 버튼이나 폼을 클릭했을 때도 이벤트가 배경으로 버블링되어 모달이 의도치 않게 닫혀버리는 문제가 발생할 수 있습니다. 이때 모달 내부 요소에 stopPropagation을 걸어주면, 클릭 이벤트가 배경으로 전파되는 것을 완벽하게 막아주어 이러한 이슈를 깔끔하게 해결할 수 있습니다.

하지만 Eddie님이 파악하신 것처럼 이벤트의 위아래 방향에 국한되지 않고, 이벤트 흐름 자체를 그 자리에서 정지시킨다는 것이 이 메서드에 대한 가장 완벽한 이해입니다. 이렇게 꼼꼼하게 강의를 수강하시고 핵심을 꿰뚫는 좋은 질문 남겨주셔서 진심으로 감사드립니다. 추가로 우리동네코딩스튜디오에서 관심 있는 강의가 있으시다면 jeony0535@naver.com 이메일로 연락해 주시면 할인 쿠폰을 전달해 드리겠습니다!

1

eddie

질문 드릴때 상위전파를 캡쳐링이라고 잘못 이해하고 있었네요;;
이 부분 잡아주셔서 감사합니다!
강의에서 addEventListener(type, handler) 의 handler가 기본 적으로 버블링 단계에서 호출 된 다는 부분은 놓치고 질문을 드렸네요. 이 부분도 짚어 주셔서 감사합니다.

말씀 주신 사항들 모두 이해했습니다!

다시한 번 친절하게 설명 주셔서 감사합니다!

1

인프런 AI 인턴

안녕하세요, 인프런 AI 인턴입니다. eddie님.

stopPropagation() 메서드에 대해 질문해 주셨군요. 이 메서드는 이벤트가 발생할 때 이벤트 전파를 중단시키는 역할을 합니다. 기본적으로 DOM 이벤트는 두 가지 방식으로 전파됩니다: 캡처링(capturing phase)과 버블링(bubbling phase)입니다.

이벤트 전파

  1. 캡처링 단계: 이벤트가 최상위 루트에서 목표 요소에 도달하는 상향식 전파 과정입니다.
  2. 버블링 단계: 반대 방향으로 목표 요소에서 최상위 루트로 전파되는 하향식 과정입니다.
  3. stopPropagation(): 현재 이벤트의 전파를 중단시켜, 캡처링과 버블링의 나머지 과정을 멈춥니다.

주의할 점

  • stopPropagation()을 사용하면 이벤트는 현재 요소까지만 처리되고, 더 이상 상위 요소로 전파되지 않습니다. 즉, 캡처링과 버블링 모두 차단됩니다.
  • 따라서 “상위로의 전파 차단”이라는 설명은 보다 정확하게는 이벤트가 현재 단계(캡처링 또는 버블링)에서 더 이상 상위 요소로 전파되지 않음을 의미합니다.

관련하여 더 이해하기 쉽게 설명된 자료를 원하시면, 다음의 유사한 질문에 대한 답변을 참고하시는 것도 좋을 것 같습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏

추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

자료집 관련

0

4

1

13. (App 2) 기본기 훈련 에서

0

12

1

챌린지 시작일 문의

0

15

0

17강 강의에 목데이터 첨부파일이 없습니다.

1

13

1

2. 어떤 도구를 사용하는 것이 가장 유리할까? 강의 중

0

15

1

줄바꿈 시 \ 필수인가요?

0

17

2

11차시 Antigravity IDE 설치 후

0

17

1

2605 이후 최신 클로드코드 강의 추가 부탁드립니다.

0

13

2

처음 에이전트 설정을 잘못 했을 경우 수정 하는 방법

0

15

1

5,6,7,8 내용이 없어요

0

14

1

커리큘럼 문서 제공받을 수 있을까요?

0

19

1

ThemeProvider를 이용해서 NextThemeProvider를 따로 생성하여 Layout.tsx에 적용하는 이유는 뭘까요?

0

13

1

mission 09-01 을 수행할 수 없어요

0

20

1

outputStyle 설정하는데 어디서 문제일까요?

0

22

3

test.txt파일 삭제시 rm명령어이니 클로드의 질문이 있어야 한다고 하셨는데

0

14

2

검은화면

0

25

3

강의교환링크안열려요.....

0

23

2

영상재생에러 [확인부탁드려요!!!]

0

21

2

클로드 채팅에서 코드로 넘어가기

0

37

2

푸터에 있는 카테고리 폰트 컬러 어떻게 바꾸나요?

0

26

1

Context API vs Zustand 그리고 Auth

0

34

2

110강부터 따라가기가 힘듭니다...

0

50

2

커서에서 붙여넣기

0

35

2

11강 내용과 12강 내용이 충돌하는 것 같아요.

0

119

2