React, A-gain

422025년 09월 26일3

우레와 같은 박수 소리가 잦아들자, 댄은 무대 중앙에 섰다. 수천 개의 시선이 칠흑 같은 어둠 속에서 오직 그에게로만 향했다. 그의 등 뒤, 거대한 스크린에 발표 제목이 떠올랐다.

React Today and Tomorrow
그리고 그 아래에 작은 부제가 달려 있었다.
and A-gain

‘다시, 또 한 번.’
청중석에서 몇몇이 그 의미심장한 부제를 보고 고개를 갸웃거렸다.

댄은 서두르지 않았다. 그는 새로운 것을 보여주기 전에, 모두가 알고 있는 익숙한 풍경부터 그리기 시작했다. 그의 목소리는 차분했고, 마치 오래된 친구에게 고민을 털어놓는 듯 진솔했다.

“우리는 리액트를 사랑합니다. 리액트는 우리가 복잡한 UI를 선언적으로, 그리고 예측 가능하게 만들 수 있도록 도와주었죠. 하지만 우리 모두, 프로젝트가 커지면서 마주하게 되는 몇 가지 공통적인 문제들이 있습니다.”

그의 첫 번째 슬라이드에는 너무나도 익숙한 코드 한 줄이 나타났다.
this.handleClick = this.handleClick.bind(this);

this 키워드.”
댄이 나지막이 말했다. 객석 곳곳에서 나지막한 신음과 함께 공감의 끄덕임이 보였다.
“우리는 자바스크립트가 어떻게 동작하는지 알아야만 했고, constructor 안에서 이 주문 같은 코드를 반복해서 작성해야만 했습니다. 이것은 수많은 초보 개발자들을 좌절시켰고, 숙련된 개발자들마저 성가시게 만들었죠.”

다음 슬라이드가 나타났다. 화면에는 끝없이 중첩된 컴포넌트 트리가 그려져 있었다.
<Provider><Connect><Router><withTheme>...

“로직을 재사용하기 위해, 우리는 HOC나 렌더 프롭 같은 훌륭한 패턴들을 발명했습니다.”
그의 목소리에는 존중이 담겨 있었다.
“하지만 그 결과, 우리는 종종 ‘래퍼 지옥’이나 ‘콜백의 피라미드’에 갇히곤 했습니다. 데이터가 어디서 오는지 추적하기 어려웠고, 코드의 구조는 우리 자신조차 이해하기 힘든 미로가 되어갔습니다.”

객석은 조용했다. 모두가 자신의 코드베이스에 있는 바로 그 미로를 떠올리고 있었다.

마지막으로, 그는 생명주기 메서드가 뒤섞인 거대한 클래스 컴포넌트의 구조를 보여주었다.
“그리고 가장 큰 문제는 이것이었습니다. 관련 있는 로직은 흩어지고, 관련 없는 로직은 한데 뭉쳐버렸죠.”

그는 componentDidMount에서 데이터를 가져오고, componentWillUnmount에서 그 데이터를 정리하는 코드를 예로 들었다.
“데이터를 가져오는 로직은, 데이터를 가져오는 로직끼리 함께 있어야 합니다. 하지만 클래스는 우리의 코드를 시간의 흐름에 따라 찢어놓도록 강요했습니다.”

댄은 잠시 말을 멈추고, 청중을 둘러보았다. 그는 비난하는 것이 아니었다. 그는 단지, 모두가 겪어온 고통을 명확한 언어로 정의해주고 있을 뿐이었다. 청중은 이제 완벽하게 그의 이야기에 몰입해 있었다.

“리액트 팀은 이 문제들을 오랫동안 지켜봐 왔습니다. 그리고 깨달았습니다. 점진적인 개선만으로는 부족하다고. 우리에겐… 더 나은 방법이 필요했습니다.”

그의 목소리에 실린 미세한 변화를, 청중은 놓치지 않았다.
서론이 끝나고 있었다.
이제 본론이 시작될 터였다.
수천 명의 개발자들이, 숨을 죽인 채 그의 다음 말을 기다렸다. 그가 제시할 ‘더 나은 방법’이란 대체 무엇일까.