React 17 업그레이드 후 이벤트 위임 변경사항 정리
배경
레거시 프로젝트를 React 17로 업그레이드했다. 기능상 큰 변화는 없지만, 이벤트 시스템이 내부적으로 변경되어 정리가 필요했다.
변경된 이벤트 위임 방식
React 16까지는 모든 이벤트 핸들러가 document 레벨에 등록되었다. React 17부터는 React 트리가 렌더링되는 root DOM 노드에 등록된다.
// React 16
document.addEventListener(...)
// React 17
rootNode.addEventListener(...)
실제 문제 해결
우리 프로젝트는 일부 레거시 jQuery 코드가 남아있었다. 기존에는 e.stopPropagation()을 해도 document 레벨에서 이벤트가 겹치는 문제가 있었다.
// jQuery 코드
$(document).on('click', '.legacy-modal', function(e) {
e.stopPropagation();
// React 컴포넌트의 클릭 이벤트도 함께 발생하는 버그
});
React 17 업그레이드 후 이 문제가 자연스럽게 해결되었다. 이벤트 위임 레벨이 분리되면서 propagation이 의도대로 동작했다.
Breaking Changes 체크리스트
실제로는 breaking change가 거의 없었다:
onScroll이벤트가 더 이상 버블링되지 않음 (원래 DOM 스펙대로)onBlur,onFocus가 네이티브focusin,focusout으로 변경- Capture phase 이벤트 리스너가 실제 브라우저 capture phase 사용
우리 코드베이스에서는 영향받는 부분이 없었다.
마이그레이션
npm install [email protected] [email protected]
테스트 돌려보고 배포 완료. 체감상 차이는 없지만 향후 React 18 업그레이드를 위한 준비 단계로 의미가 있다.