[리액트] 좋은 상태관리란?
상태(State)란?
상태는 리액트 컴포넌트의 데이터를 의미합니다. 이 데이터는 시간이 지나면서 변할 수 있으며, 컴포넌트의 렌더링에 직접적인 영향을 미칩니다. 예를 들어, 웹 페이지 내에서 사용자의 입력값, 서버로부터 받아오는 데이터 등이 상태에 해당할 수 있습니다. 리액트에서는 이러한 상태를 JavaScript 객체로 관리하며, 상태가 변하면 해당 컴포넌트는 자동으로 다시 렌더링됩니다.
상태 관리의 중요성
상태 관리는 리액트 애플리케이션의 핵심입니다. 이는 애플리케이션의 동작을 결정하며, 사용자 인터페이스를 동적으로 업데이트하는 데 필수적인 역할을 합니다. 상태 관리를 통해 애플리케이션의 다양한 부분이 서로 일관되게 데이터를 공유하고, 사용자의 상호작용에 반응할 수 있습니다. 따라서, 효과적인 상태 관리는 애플리케이션의 성능과 유지보수성을 크게 향상시킬 수 있습니다.
리액트에서의 상태 관리 방법
로컬 상태(Local State):
특정 컴포넌트 내에서만 관리되는 상태입니다. 예를 들어, 사용자의 입력값을 관리하는 경우 등이 이에 해당합니다.
전역 상태(Global State):
애플리케이션 전체에서 공유되는 상태입니다. 여러 컴포넌트 간에 데이터를 공유해야 할 때 사용됩니다.
컴포넌트 간 상태(Cross Component State):
여러 컴포넌트에서 공유되는 상태이지만, 전역 상태보다는 좁은 범위에서 사용됩니다. 예를 들어, 모달창의 상태 관리가 이에 해당할 수 있습니다.
Props Drilling 이란?

Props Drilling은 컴포넌트 트리에서 상위 컴포넌트의 상태를 하위 컴포넌트로 전달할 때, 중간에 위치한 여러 컴포넌트를 거쳐 상태를 전달하는 과정을 말합니다. 이 과정에서 중간 컴포넌트들은 해당 상태를 직접 사용하지 않음에도 불구하고, 상태를 전달하는 역할만 수행하게 됩니다.
Props Drilling 의 문제점
코드의 복잡성 증가: 상태를 전달하는 과정이 많아질수록, 코드를 추적하고 이해하는 데 어려움이 따릅니다.
유지 보수의 어려움: 상태의 형태나 전달 경로가 변경될 경우, 많은 컴포넌트를 수정해야 합니다.
성능 저하: 불필요한 컴포넌트들의 리렌더링이 발생하여 애플리케이션의 성능에 부정적인 영향을 줄 수 있습니다.
Props Drilling 해결 방법
Context API 사용: React의 Context API를 활용하여 컴포넌트 트리 전체에 걸쳐 상태를 공유할 수 있습니다. 이를 통해 중간 컴포넌트를 거치지 않고도 상태를 전달할 수 있습니다.
상태 관리 라이브러리 사용: Redux, MobX 등의 상태 관리 라이브러리를 사용하면 애플리케이션의 상태를 중앙에서 효과적으로 관리할 수 있습니다. 이를 통해 복잡한 상태 전달 구조를 단순화할 수 있습니다.
Custom Hooks 사용: 관련된 로직과 상태 관리를 커스텀 훅으로 추상화하여, 필요한 곳에서 쉽게 재사용할 수 있습니다.
좋은 리액트 상태 관리란 무엇인가?
리액트 애플리케이션을 개발하면서 효율적인 상태 관리는 애플리케이션의 성능과 유지 보수성을 크게 향상시킬 수 있습니다.
상태의 최소화와 명확성: 가능한 한 적은 수의 상태를 유지하고, 각 상태가 명확한 목적을 가지도록 합니다. 이는 애플리케이션의 복잡성을 줄이고, 상태 관리를 더 쉽게 만듭니다.
상태와 컴포넌트의 근접성(State Colocation): 상태는 그것을 사용하는 컴포넌트와 최대한 가까운 곳에 위치해야 합니다. 이는 불필요한 리렌더링을 방지하고, 애플리케이션의 성능을 향상시키는 데 도움이 됩니다.
상태의 적절한 분리: 관심사에 따라 상태를 적절히 분리함으로써, 코드의 재사용성을 높이고, 사이드 이펙트를 최소화할 수 있습니다. 이는 또한 코드의 가독성과 유지 보수성을 향상시킵니다.
Props Drilling 해결: Props Drilling 문제는 Context API, 상태 관리 라이브러리(예: Redux, MobX), Custom Hooks를 사용하여 해결할 수 있습니다. 이러한 방법들은 중간 컴포넌트를 거치지 않고도 상태를 효율적으로 전달할 수 있게 해 줍니다.
서버 데이터와의 동기화: 서버로부터 받아오는 데이터를 전역 상태에 저장할 때는, 언제 데이터를 새로 고침해야 하는지 명확한 전략을 갖는 것이 중요합니다. React-Query, SWR 같은 라이브러리를 활용하여, 데이터의 동기화와 캐싱을 효율적으로 관리할 수 있습니다.
효과적인 상태 변화 관리: 상태 변화는 예측 가능하고 관리하기 쉬워야 합니다. 이를 위해 Immutable 데이터 패턴을 사용하거나, 상태 업데이트 로직을 단순화하는 것이 좋습니다.
성능 최적화 고려: 상태 관리 전략을 선택할 때는 애플리케이션의 성능에 미칠 영향을 고려해야 합니다. 불필요한 상태 업데이트나 리렌더링을 방지하기 위한 최적화 기법을 적용하는 것이 중요합니다.
상태 관리는 애플리케이션의 구조와 성능에 직접적인 영향을 미치므로, 이를 위한 최선의 전략을 선택하는 것이 중요합니다!!
