리액트 상태관리가 왜 필요할까? Props Drilling부터 이해하기
리액트(React)로 웹 애플리케이션을 개발하다 보면 반드시 마주치는 거대한 장벽이 있습니다. 바로 '리액트 상태관리'입니다. 처음에는 단순히 컴포넌트 내부에서 데이터를 주고받는 것으로 충분해 보이지만, 프로젝트가 조금만 커져도 데이터가 어디서 오고 어디로 가는지 길을 잃기 십상입니다.
웹서비스가 복잡해질수록 관리해야 할 정보와 화면의 변화는 늘어납니다. 이때 데이터의 흐름을 제대로 잡지 못하면 코드는 엉키고 성능은 떨어집니다. 왜 많은 개발자가 상태관리에 대해 고민하는지, 가장 기초적인 문제부터 차근차근 살펴보겠습니다.
데이터 전달의 늪, Props Drilling이란?
리액트는 기본적으로 데이터가 위에서 아래로, 즉 부모 컴포넌트에서 자식 컴포넌트 방향으로만 흐르는 단방향 데이터 흐름을 따릅니다. 이 구조는 데이터의 출처를 쉽게 추적할 수 있도록 돕지만, 때로는 비효율적인 상황을 만들어냅니다. 가장 대표적인 현상이 바로 'Props Drilling(프롭스 드릴링)'입니다.
예를 들어, 가장 최상단에 있는 컴포넌트 A에서 가장 아래에 있는 컴포넌트 Z로 데이터를 보내야 한다고 가정해 보겠습니다. 이 데이터를 전달하기 위해 중간에 위치한 B, C, D 컴포넌트는 해당 데이터가 전혀 필요 없음에도 오직 하위 컴포넌트로 전달하기 위해 매개변수(props)를 받아 아래로 넘겨주어야만 합니다.
마치 아파트 1층에서 10층으로 택배를 배달하는데, 엘리베이터가 없어서 2층부터 9층까지의 주민들이 차례대로 택배 상자를 손에서 손으로 전달하는 것과 같습니다. 중간 단계의 주민들은 택배 내용물에 아무 관심이 없는데도 수고를 들여야 하는 비효율이 발생합니다.
컴포넌트가 무거워질 때 발생하는 문제들
Props Drilling이 깊어지면 단순히 코드 작성이 번거로워지는 것에서 끝나지 않습니다. 코드의 유지보수성이 급격하게 떨어지는 것이 가장 큰 문제입니다. 만약 가장 밑에 있는 컴포넌트가 전달받는 데이터의 이름이나 형식을 바꾸기라도 하면, 그 위에 거쳐 왔던 모든 중간 컴포넌트들의 코드까지 전부 찾아가서 수정해야 합니다.
또한 불필요한 리렌더링(Re-rendering) 문제가 발생하여 성능에 악영향을 줍니다. 리액트 컴포넌트는 전달받는 props가 변경되면 화면을 다시 그리는 특성이 있습니다. 자신은 쓰지도 않는 데이터가 단지 아래로 흘러간다는 이유만으로 중간 컴포넌트들이 매번 쓸데없이 다시 작동하게 됩니다.
이러한 비효율은 개발자의 집중력을 흐트러뜨리고 사소한 코드 수정에도 전체 앱이 멈추는 치명적인 오류로 이어질 수 있습니다. 이러한 한계를 극복하기 위해 등장한 개념이 바로 '전역 상태' 관리입니다.
전역 상태, 해결사의 등장
그렇다면 이 불편한 택배 게임을 어떻게 끝낼 수 있을까요? 해결책은 간단합니다. 모든 컴포넌트가 직접 접근할 수 있는 '공용 보관함'을 만드는 것입니다. 리액트 생태계에서는 이를 '전역 상태(Global State)'라고 부릅니다.
전역 상태 관리를 도입하면 데이터를 최상단 부모 컴포넌트에 가두어 두지 않고, 별도의 독립된 공간에 저장해 둡니다. 이제 데이터를 필요로 하는 최하단 컴포넌트 Z는 중간 과정을 거치지 않고 이 공용 보관함에서 직접 데이터를 꺼내 쓸 수 있습니다.
이를 통해 중간 컴포넌트들은 불필요한 배달원 역할에서 완전히 해방되며, 코드의 가독성이 획기적으로 향상됩니다. 데이터의 흐름이 중앙에서 집중적으로 제어되므로 버그가 생겼을 때 원인을 파악하는 일도 훨씬 수월해집니다.
상태관리 도구, 어떤 것을 선택해야 할까?
전역 상태를 관리하기 위해 최근 개발 생태계에는 다양한 도구들이 활발히 사용되고 있습니다. 가장 먼저 리액트가 자체적으로 제공하는 'Context API'를 떠올릴 수 있습니다. 별도의 외부 설치 없이 가볍게 쓸 수 있어 소규모 프로젝트나 단순한 상태를 다룰 때 아주 유용합니다.
하지만 다루는 데이터가 많아지고 복잡한 화면 전환이 자주 일어난다면 전용 외부 라이브러리를 고려하는 것이 좋습니다. 전통적인 강자인 'Redux(리덕스)'는 엄격한 구조를 제공하여 대규모 프로젝트에서 강력하지만 배워야 할 개념이 다소 많습니다.
최근에는 상대적으로 훨씬 가볍고 직관적으로 쓸 수 있는 'Zustand(주스탠드)', 'Recoil(리코일)', 'Jotai(조타이)' 같은 도구들이 큰 인기를 끌고 있습니다. 처음부터 어렵고 무거운 도구를 도입하기보다, 프로젝트 크기와 상황에 맞는 도구를 차근차근 적용해보는 것을 추천합니다.
결국 리액트 상태관리는 무조건 트렌디한 도구를 쓰는 것이 아니라, Props Drilling과 같은 비효율을 걷어내고 유연한 소프트웨어를 만들기 위한 필수 과정입니다. 지금 여러분이 만드는 컴포넌트들이 불필요한 상자를 전달하고 있지는 않은지 찬찬히 고민해 보시길 바랍니다.