나는 고등학교 교사이자 프로그래머로서 학교 안에서 교육, 학습, 그리고 조직을 지원하는 애플리케이션을 개발하는 아주 좋은 일을 할 수 있었다. 학생, 교사, 일반 직원의 요구사항을 매일 직접 들으면서 그들과 함께 계획, 의사소통, 이해 및 놀이를 더욱 쉽게 만드는 직관적인 앱과 도구를 만드는 작업을 할 수 있었다. 자바스크립트로 작성한 퀴즈 앱과 틀린 그림 찾기 게임부터 시작해서 제이쿼리(jQuery)와 템플릿을 활용하는 수업 계획과 자원 예약 앱을 만들었다. 그 이후부터 학교 과학 부서에서는 수업을 위한 도구를 주문하는 방법을 원했고, 리더십 팀은 직원들에게 공지를 전달하는 방법을 원했으며, ICT 기술자들은 직원들이 소프트웨어와 하드웨어 문제를 보고하고 관리하는 방법을 원했다. 학생 좌석 배정 앱, 학교 웹사이트의 뉴스를 위한 콘텐츠 관리 시스템(content management system, CMS), 맞춤형 캘린더, 대화식 당직 배정표, 혹은 스포츠 경기 일지는 어떤가? 이 모든 소프트웨어는 모두 일관된 모양과 느낌(룩앤필look and feel)을 갖고 있었다.
각 프로젝트마다 자체적인 요구사항이 있었지만 많은 부분이 중복됐고, 비슷한 방법을 여러 앱에 사용할 수 있었다. 이를 가속화하기 위해 나는 서버로부터 클라이언트에 이르기까지 노드(Node.js), 익스프레스(Express), 핸들바(Handlebars), 백본(Backbone), 마리오네트(Marionette)를 사용하는 자바스크립트로 전환했다. 대부분은 잘 작동했지만 요구사항이 변할 때 앱을 변경하는 게 까다로울 때도 있었다. 특히 모델(model), 뷰(view), 컨트롤러(controller) 간의 데이터 흐름이 항상 원활한 것은 아니었다. 사용자들은 만족했지만 나는 코드의 기저에 자리 잡은 문제점을 볼 수 있었고, 언젠가는 코드로 돌아가 꼬인 부분을 다시 풀어야 하리라는 사실을 알았다.
그러던 중에 리액트를 접하고 모든 문제가 해결됐다! 물론 모든 문제가 완벽히 해결된 것은 아니지만, 리액트의 컴포넌트, 프롭, 상태, 자동 재렌더링 모델은 다른 라이브러리보다 내 마음에 들었다. 나는 하나씩 기존 앱을 리액트로 변환했다. 변환을 할 때마다 앱이 더 단순하고 이해하기 쉽고 유지 관리하기 쉬워졌다. 공통 컴포넌트를 재사용할 수 있었고, 나는 빠르게 코드를 변경하고 새로운 기능을 자신 있게 추가할 수 있었다. 리액트 광신도는 아니지만(나는 프레임워크 다양성을 존중한다) 개종자임은 확실했으며, 리액트 개발자로서의 경험과 내 리액트 앱에 대한 사용자 반응을 즐겼다.
리액트 훅을 이용하면서 단순성이라는 척도에서 내 코드가 한 번 더 긍정적인 단계를 밟을 수 있었다. 클래스 컴포넌트의 생명 주기 메서드에 분산돼 있던 코드를 함수 컴포넌트 내부나 외부의 커스텀 훅에 한꺼번에 모아둘 수 있다. 문서 제목 설정, 지역 저장소 접근, 컨텍스트 값 관리, 엘리먼트의 화면상 크기 측정, 서비스 구독, 데이터 읽어오기 등 특정 기능에 대한 코드를 쉽게 격리하고 유지보수하며 공유할 수 있다. 그리고 리액트 라우터(React Router), 리덕스(Redux), 리액트 쿼리(React Query), 리액트 스프링(React Spring)과 같은 기존 라이브러리의 기능을 연결하기도 더 쉬워졌다. 리액트 훅을 사용하면 리액트 컴포넌트에 대해 새로운 사고방식을 제공한다. 처음에는 조심해야 할 작은 함정도 있지만, 내가 보기에 이런 사고방식의 변화는 확실히 좋은 것이다.
훅으로의 전환은 앞으로 리액트가 작동하는 방식에 대한 근본적인 변화에 속한다. 동시성 모드(리액트 18에서는 동시성 렌더링)가 새로운 표준이 될 것이고, 렌더링이 주 스레드를 차단하지 않고 다른 컴포넌트가 만들어지는 동안 사용자 입력처럼 우선순위가 더 높은 상태 변화가 즉시 렌더링될 수 있도록 하는 시간 분할 마법을 가능하게 할 것이다. 선택적인 수화(hydration)는 리액트가 사용자 상호작용에 맞춰 꼭 필요한 컴포넌트 코드만 적재할 수 있게 하고, Suspense API는 개발자가 코드와 자원을 적재하는 동안 적재 중 상태를 더 신중하게 지정할 수 있게 해줄 것이다.
리액트 팀은 개발자가 훌륭한 사용자 경험을 만들 수 있는 훌륭한 개발자 경험을 만드는 데 집중하고 있다. 추가적인 변화가 계속 이뤄질 것이며, 베스트 프랙티스가 계속 나타날 것이다. 여러분이 현재의 변화를 확실히 이해하고, 지평선으로 점차 떠오르고 있는 리액트의 변화를 위한 준비를 돕는 데 이 책이 도움이 되기를 바란다.