React 19 프로젝트가 내부적으로 성숙해 갈 무렵, 팀의 시선은 React 생태계 너머, 더 넓은 웹 표준의 세계로 향했다. 그들의 눈에 들어온 것은 바로 ‘웹 컴포넌트(Web Components)’였다.
웹 컴포넌트는 특정 프레임워크에 종속되지 않고, 바닐라 자바스크립트, HTML, CSS만으로 재사용 가능한 캡슐화된 커스텀 HTML 태그를 만드는 웹 표준 기술이다. <custom-video-player>, <fancy-button>처럼, 개발자가 자신만의 HTML 태그를 만들 수 있게 해주는 강력한 기능이었다.
하지만 오랫동안 React와 웹 컴포넌트의 관계는 다소 껄끄러웠다. React는 자신만의 컴포넌트 모델과 가상 DOM(Virtual DOM) 시스템을 가지고 있었기 때문에, 외부 기술인 웹 컴포넌트를 통합하는 과정이 매끄럽지 않았다. 데이터를 전달하는 방식, 이벤트를 처리하는 방식 등에서 사소한 비호환성 문제들이 계속해서 발생했다.
개발자들은 이 두 기술을 함께 사용하기 위해 ref를 사용하거나 별도의 래퍼(wrapper) 컴포넌트를 만드는 등 번거로운 작업을 감수해야만 했다.
“우리는 더 이상 웹 컴포넌트를 외부 기술로 배척해서는 안 됩니다.”
팀 회의에서 한 엔지니어가 목소리를 높였다. “웹 컴포넌트는 이제 명백한 웹 표준입니다. React는 웹 생태계의 좋은 시민으로서, 이 표준을 완벽하게 지원해야 할 의무가 있습니다.”
그의 주장은 팀 전체의 공감을 얻었다. React가 아무리 강력하더라도, 웹 표준이라는 거대한 흐름을 거스를 수는 없었다. 오히려 그 흐름을 적극적으로 포용하고 존중할 때, React의 가치는 더욱 빛날 수 있었다.
React 19 개발의 일환으로, 웹 컴포넌트와의 통합을 개선하기 위한 태스크 포스가 꾸려졌다. 그들의 목표는 명확했다. 개발자가 React 컴포넌트를 사용하듯, 웹 컴포넌트도 아무런 이질감 없이 사용할 수 있게 만드는 것이었다.
팀은 React의 핵심 렌더링 로직을 수정하여, 웹 컴포넌트의 커스텀 프로퍼티와 이벤트를 더 잘 이해하고 처리할 수 있도록 만들었다.
- 프로퍼티 전달: 이전에는 문자열만 전달할 수 있었던 속성(attribute)에, 이제 객체나 배열 같은 복잡한 데이터도
prop처럼 자연스럽게 전달할 수 있게 되었다. - 커스텀 이벤트 처리: 웹 컴포넌트가 발생시키는 커스텀 이벤트(custom event)를 React의
on이벤트 핸들러가 직접 수신하고 처리할 수 있도록 호환성이 개선되었다.
이러한 개선 작업이 완료되자, React 안에서 웹 컴포넌트를 사용하는 코드는 놀라울 정도로 간결해졌다.
// Before (with wrapper)
function MyVideoPlayer({ src }) {
const ref = useRef(null);
useEffect(() => { /* ref를 이용한 복잡한 이벤트 리스너 연결 */ }, []);
return <custom-video-player ref={ref}></custom-video-player>;
}
// After (React 19)
function MyVideoPlayer({ src, onPlay }) {
// prop과 이벤트 핸들러를 직접 전달!
return <custom-video-player srcObject={src} onCustomPlayEvent={onPlay} />;
}
더 이상 번거로운 래퍼 컴포넌트나 ref 조작이 필요 없었다. 웹 컴포넌트는 이제 React 컴포넌트 트리의 일등 시민으로 당당하게 자리 잡게 되었다.
이것은 단순한 기술적 호환성 개선 이상의 의미를 가졌다. 그것은 React가 특정 기술 생태계에 갇히지 않고, 더 넓은 웹 표준의 세계와 조화를 이루며 발전하겠다는 성숙한 의지의 표명이었다. React 개발자들은 이제 프레임워크의 경계를 넘어, 웹 플랫폼이 제공하는 모든 강력한 기능들을 자유롭게 활용할 수 있는 더 넓은 운동장을 갖게 된 것이다.


