Q&A 세션이 끝나고 조던 워크가 무대에서 내려왔을 때, 그를 기다리고 있는 것은 환호와 박수가 아니었다. 그것은 어색한 침묵과 미심쩍은 눈초리들이었다. 몇몇 개발자들이 그에게 다가와 버추얼 DOM의 구현 방식에 대해 기술적인 질문을 던지기도 했지만, 대부분의 대화는 결국 JSX에 대한 의구심으로 귀결되었다.
컨퍼런스 휴식 시간, 로비와 복도는 리액트에 대한 이야기로 술렁였다.
“페이스북 친구가 방금 발표한 거 봤어? 정말 이상하던데.”
“버추얼 DOM은 흥미로웠어. 하지만 JSX라니… 그건 정말 선을 넘은 것 같아. 자바스크립트는 자바스크립트다워야지.”
한쪽에서는 앵귤러JS 개발자들이 모여 리액트의 접근 방식을 비판하고 있었다.
“결국 템플릿에 로직을 넣지 말자면서, 로직에 템플릿을 넣은 꼴이잖아. 말장난이지. 우리 앵귤러는 ng-repeat이나 ng-if 같은 명시적인 디렉티브(directive)로 HTML을 확장하지, 저렇게 언어를 오염시키진 않아.”
그들의 비판은 당시 웹 커뮤니티의 주류 의견을 대변했다. 웹 표준을 존중하고, 각 기술의 역할을 명확히 분리하는 것이 ‘올바른 길’이라는 믿음. JSX는 그 믿음을 정면으로 거스르는 이단적인 존재였다.
리액트 팀원들은 로비 한쪽에서 이 모든 분위기를 착잡한 심정으로 지켜보고 있었다. 그들은 자신들의 아이디어가 세상에 큰 충격을 줄 것이라고는 예상했지만, 이토록 즉각적이고 전면적인 거부감에 부딪힐 줄은 몰랐다.
“우리가 뭔가 잘못 생각한 걸까요?” 맷이 불안한 목소리로 말했다. “어쩌면 JSX는 정말 실수였을지도 모릅니다. 그냥 React.createElement를 쓰라고 했어야 했을까요?”
“아니.” 조던이 단호하게 대답했다. 그의 표정은 담담했지만, 눈빛은 흔들리지 않았다. “그랬다면 사람들의 첫 거부감은 피할 수 있었을지 모르지. 하지만 리액트가 가진 개발 경험의 핵심적인 부분 하나를 포기하는 셈이야. createElement를 중첩해서 쓰는 코드가 얼마나 끔찍하게 보일지는 우리 모두 잘 알잖아.”
그의 말이 맞았다. 복잡한 컴포넌트를 순수한 createElement 호출로만 작성하는 것은 가독성이 극도로 떨어지는, 고통스러운 작업이었다. JSX는 그 고통을 해결하기 위해 반드시 필요한, 타협할 수 없는 선택이었다.
톰이 팀원들을 다독였다.
“모든 혁신은 처음에는 오해와 비판을 받기 마련이야. 사람들이 버추얼 DOM의 성능이나 단방향 데이터 흐름의 안정성보다, 당장 눈에 보이는 이상한 문법에만 집중하는 건 어쩔 수 없어. 시간이 필요할 거야.”
하지만 그 시간 동안, 리액트는 ‘자바스크립트에 HTML을 섞어 쓰는 이상한 라이브러리’라는 오명을 뒤집어써야 할 터였다.
그날 저녁, 트위터와 기술 블로그에는 JSConf의 발표 내용에 대한 후기들이 올라오기 시작했다. 대부분의 반응은 냉소적이었다.
“페이스북의 리액트: 2013년에 만나는 1999년의 기술.”
“관심사의 분리 원칙은 죽었다. 페이스북이 오늘 그것을 죽였다.”
“흥미로운 아이디어 몇 가지를 끔찍한 문법으로 망쳐버렸다.”
JSX는 리액트의 얼굴이 되었지만, 그것은 환영받는 얼굴이 아니었다. 리액트는 세상과의 첫 만남에서, 기술적 논쟁이 아닌 철학적 논쟁의 한복판에 서게 된 것이다. 그리고 이 논쟁은 앞으로 몇 년간 리액트를 끈질기게 따라다니는 주홍글씨가 될 운명이었다.


