생태계의 태동 - Flux와 라우터
제27화
발행일: 2025년 05월 04일
개척자들의 용감한 발걸음은 리액트라는 황무지에 희미한 길을 내기 시작했다. 그 길 위에는 "리액트, 괜찮은데?"라는 작은 팻말들이 하나둘씩 세워지고 있었다. 하지만 그 길을 따라 더 깊숙이 들어가려는 개발자들은 곧 거대한 두 개의 협곡과 마주하게 되었다.
바로 '상태 관리(State Management)' 와 '라우팅(Routing)' 이라는 이름의 협곡이었다.
리액트는 UI 렌더링이라는 '엔진'은 제공했지만, 자동차를 완성하기 위한 필수 부품 두 가지, 즉 데이터를 효율적으로 관리하고 전달하는 '연료 시스템(상태 관리)'과 원하는 목적지로 길을 안내하는 '내비게이션(라우팅)'은 제공하지 않았다. 'Just the V' 철학의 이면이었다.
"컴포넌트 몇 개 만들 때는 좋았는데… 앱이 커지니까 상태 관리가 지옥이네요!"
"Props Drilling 때문에 코드가 너무 지저분해져요. 전역 상태 관리 같은 거 없나요?"
"페이지 이동은 어떻게 구현해야 하죠? 리액트에는 라우터 기능이 없잖아요!"
개척자들이 각자 나름의 방식으로 이 문제들을 해결하려 애썼지만(이벤트 이미터, 직접 만든 라우터 등), 이는 마치 임시방편으로 엉성하게 엮은 뗏목과 같았다. 더 크고 복잡한 애플리케이션이라는 거친 강물을 건너기에는 역부족이었고, 표준화되지 않은 각자의 방식은 오히려 혼란을 가중시켰다.
"이대로는 안 돼… 리액트가 진짜 날아오르려면, 이 두 날개가 필요해."
조던 워크와 페이스북 팀은 이 문제를 심각하게 인지하고 있었다. 그들은 리액트의 성공이 단순히 뷰 라이브러리 자체의 우수성뿐만 아니라, 이를 뒷받침하는 강력한 '생태계' 구축에 달려있음을 깨달았다. 특히 상태 관리 문제는 플럭스(Flux) 아키텍처라는 개념적 해답을 제시했지만, 개발자들이 쉽게 가져다 쓸 수 있는 '구현체'가 절실했다.
바로 그때, 마치 가뭄 속 단비처럼, 커뮤니티에서 이 두 협곡을 메우려는 움직임들이 본격적으로 나타나기 시작했다.
첫 번째 돌파구: Flux 구현체들의 등장
페이스북이 제시한 플럭스 아키텍처는 '개념'이었지, 특정 라이브러리가 아니었다. 이 개념에 영감을 받은 개발자들이 각자의 방식으로 플럭스 패턴을 구현한 라이브러리들을 만들기 시작했다.
- Fluxxor, RefluxJS, Fluxiny… 다양한 이름의 플럭스 구현체들이 깃허브에 등장했다. 각 라이브러리는 조금씩 다른 API와 특징을 가지고 있었지만, 공통적으로 '액션-디스패처-스토어-뷰'라는 단방향 데이터 흐름을 따르려 노력했다.
개발자들은 이 라이브러리들을 사용해보며 플럭스 패턴의 장점을 체감하기 시작했다. 예측 가능한 데이터 흐름, 쉬워진 디버깅, 명확한 상태 관리… 리액트 개발의 고질적인 문제였던 상태 관리의 어려움이 서서히 해결될 기미를 보였다.
"오! 이 플럭스 라이브러리 쓰니까 Props Drilling 문제가 해결됐어요!"
"상태 변경 로직이 스토어에 모여 있으니 코드가 훨씬 깔끔해지네요."
물론 여러 구현체가 난립하면서 어떤 것을 선택해야 할지에 대한 혼란도 있었지만, 이것은 생태계가 태동하는 과정에서 나타나는 자연스러운 현상이었다. 중요한 것은 플럭스라는 '질서'가 리액트 커뮤니티에 뿌리내리기 시작했다는 사실이었다. (그리고 이 혼란은 훗날 등장할 'Redux'라는 강력한 존재에 의해 상당 부분 정리될 운명이었다.)
두 번째 돌파구: React Router의 탄생
상태 관리만큼이나 시급했던 문제는 라우팅이었다. 웹 애플리케이션에서 사용자가 주소(URL)를 통해 특정 페이지로 이동하고, 그 상태를 관리하는 것은 필수적인 기능이었다. 하지만 리액트에는 이 기능이 없었다.
이때, 라이언 플로렌스(Ryan Florence)와 마이클 잭슨(Michael Jackson)이라는 두 명의 뛰어난 개발자가 나타났다. (팝스타와는 동명이인이다!) 그들은 리액트 커뮤니티의 고충을 해결하기 위해 의기투합하여 '리액트 라우터(React Router)'라는 이름의 라이브러리를 개발하기 시작했다.
리액트 라우터는 리액트의 컴포넌트 모델과 자연스럽게 통합되면서도, 선언적인 방식으로 라우팅 규칙을 정의할 수 있게 설계되었다.
// React Router 사용 예시 (개념)
import { BrowserRouter, Routes, Route, Link } from 'react-router-dom';
function App() {
return (
<BrowserRouter>
<nav>
<Link to="/">Home</Link> | <Link to="/about">About</Link>
</nav>
<Routes>
<Route path="/" element={<HomePage />} />
<Route path="/about" element={<AboutPage />} />
</Routes>
</BrowserRouter>
);
}
"이거다! 드디어 리액트로 제대로 된 싱글 페이지 애플리케이션(SPA)을 만들 수 있겠어!"
리액트 라우터의 등장은 개발자들에게 가뭄의 단비와 같았다. 더 이상 어설픈 자체 라우팅 로직을 만들 필요 없이, 잘 설계된 표준 라이브러리를 통해 쉽고 강력하게 라우팅 기능을 구현할 수 있게 된 것이다. 리액트 라우터는 순식간에 리액트 생태계의 '사실상 표준(De facto standard)' 라우터로 자리매김했다.
생태계, 날개를 달다
플럭스 구현체들과 리액트 라우터의 등장은 리액트 생태계 발전에 결정적인 전환점이 되었다. 엔진(리액트)만 있던 자동차에 강력한 연료 시스템(상태 관리)과 내비게이션(라우팅)이 장착된 셈이었다. 이제 개발자들은 리액트를 사용하여 훨씬 더 복잡하고 완성도 높은 웹 애플리케이션을 구축할 수 있는 강력한 기반을 갖추게 되었다.
황무지에 길이 나고, 그 길 옆으로 필수적인 기반 시설들이 들어서기 시작한 것이다. 리액트 생태계는 마침내 태동기를 지나, 본격적인 성장기로 나아갈 준비를 마쳤다. 그리고 이 성장은 웹 개발 전체의 패러다임을 뒤흔드는 거대한 변화의 시작을 알리는 신호탄이 될 터였다.