현대의 복잡한 웹 애플리케이션은 여러 페이지로 구성되면서도 일관된 사용자 경험을 제공해야 합니다. 이를 위해 React Router와 Redux, Context API 등의 상태 관리 도구를 통합하여 사용하는 경우가 많습니다.
이 글에서는 페이지 전환 시 전역 상태를 유지하는 방법, 라우트별 상태 초기화, 그리고 데이터 공유와 관련된 모범 사례를 중심으로, 효율적인 애플리케이션 구조를 설계하는 전략에 대해 자세히 살펴보겠습니다.
단일 페이지 애플리케이션(SPA)은 React Router를 통해 URL 기반의 페이지 전환을 구현합니다. 그러나 페이지 간 전환이 발생할 때에도 사용자가 로그인 정보, 쇼핑카트, 테마 설정 등 전역 상태를 유지해야 하는 경우가 많습니다. 이때 Redux나 Context API와 같은 상태 관리 도구를 사용하면, 애플리케이션 전반에 걸쳐 데이터를 효율적으로 공유하고 관리할 수 있습니다.
React Router와 상태 관리 도구(Redux, Context API 등)의 통합은 크게 두 가지 측면에서 이루어집니다. 첫 번째는 전역 상태를 관리하여 페이지 전환 간에도 데이터를 유지하는 것이고, 두 번째는 특정 라우트로 전환될 때 해당 페이지에 필요한 상태를 초기화하거나, 공유하는 방식입니다.
2-1. Redux와의 통합
Redux는 복잡한 애플리케이션에서 전역 상태를 관리하기 위한 대표적인 라이브러리입니다. React Router와 함께 사용할 때는 보통 Redux Provider를 최상위 컴포넌트(예: index.js 또는 App.js)에서 감싸고, 라우터 내부의 각 컴포넌트가 필요로 하는 상태에 접근하도록 구성합니다.
예를 들어, index.js 파일에서 Redux와 React Router를 함께 설정하는 코드는 다음과 같습니다.
// index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom';
import { Provider } from 'react-redux';
import store from './store';
import App from './App';
ReactDOM.render(
<Provider store={store}>
<BrowserRouter>
<App />
</BrowserRouter>
</Provider>,
document.getElementById('root')
);
이와 같이 구성하면, App 컴포넌트와 그 하위 라우트들에서 Redux의 전역 상태에 접근할 수 있게 됩니다. Redux의 액션과 리듀서를 통해 상태를 업데이트하고, 각 페이지에서 이를 반영할 수 있습니다.
2-2. Context API와의 통합
Context API는 Redux보다 간단한 전역 상태 관리 솔루션으로, 규모가 작은 프로젝트나 단순한 상태 관리를 요구하는 경우에 유용합니다. Context Provider를 최상위에 배치하여 모든 라우트에서 공통 상태를 사용할 수 있도록 합니다.
예를 들어, AuthContext를 통해 사용자 인증 상태를 관리하는 방법은 다음과 같습니다.
// AuthContext.js
import React, { createContext, useState } from 'react';
export const AuthContext = createContext();
export const AuthProvider = ({ children }) => {
const [isAuthenticated, setIsAuthenticated] = useState(false);
const login = () => setIsAuthenticated(true);
const logout = () => setIsAuthenticated(false);
return (
<AuthContext.Provider value={{ isAuthenticated, login, logout }}>
{children}
</AuthContext.Provider>
);
};
이제 index.js에서 AuthProvider로 앱을 감싸고, 각 라우트에서 인증 상태에 따른 접근 제어나 데이터 공유를 구현할 수 있습니다.
// index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom';
import { AuthProvider } from './AuthContext';
import App from './App';
ReactDOM.render(
<AuthProvider>
<BrowserRouter>
<App />
</BrowserRouter>
</AuthProvider>,
document.getElementById('root')
);
상태 관리 도구를 사용하면 페이지 전환 간에도 중요한 데이터를 유지할 수 있습니다. 그러나 때때로 특정 라우트에서는 전역 상태 외에도 라우트 별로 초기화해야 하는 데이터가 있을 수 있습니다.
이러한 전략을 통해 전역 상태와 라우트별 상태를 적절히 분리하고, 사용자 경험을 극대화할 수 있습니다.
상태 관리 도구를 통합할 때 고려해야 할 모범 사례는 다음과 같습니다.
아래는 Context API를 활용하여 전역 인증 상태를 관리하고, React Router와 통합하여 보호된 라우트를 구현하는 예제입니다.
AuthContext.js
import React, { createContext, useState } from 'react';
export const AuthContext = createContext();
export const AuthProvider = ({ children }) => {
const [isAuthenticated, setIsAuthenticated] = useState(false);
const login = () => setIsAuthenticated(true);
const logout = () => setIsAuthenticated(false);
return (
<AuthContext.Provider value={{ isAuthenticated, login, logout }}>
{children}
</AuthContext.Provider>
);
};
PrivateRoute.js
import React, { useContext } from 'react';
import { Navigate } from 'react-router-dom';
import { AuthContext } from './AuthContext';
const PrivateRoute = ({ children }) => {
const { isAuthenticated } = useContext(AuthContext);
return isAuthenticated ? children : <Navigate to="/login" />;
};
export default PrivateRoute;
App.js
import React from 'react';
import { Routes, Route } from 'react-router-dom';
import Home from './Home';
import Dashboard from './Dashboard';
import Login from './Login';
import PrivateRoute from './PrivateRoute';
const App = () => {
return (
<Routes>
<Route path="/" element={<Home />} />
<Route path="/login" element={<Login />} />
<Route path="/dashboard" element={
<PrivateRoute>
<Dashboard />
</PrivateRoute>
} />
</Routes>
);
};
export default App;
index.js
import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom';
import { AuthProvider } from './AuthContext';
import App from './App';
ReactDOM.render(
<AuthProvider>
<BrowserRouter>
<App />
</BrowserRouter>
</AuthProvider>,
document.getElementById('root')
);
위 예제는 전역 상태를 활용해 사용자의 로그인 상태를 관리하고, 보호된 라우트(대시보드)에 접근할 때 인증 여부를 확인하는 과정을 보여줍니다. 이처럼 상태 관리 도구와 React Router를 통합하면, 페이지 전환 시에도 필요한 전역 상태를 손쉽게 유지하면서 사용자에게 안전한 접근 제어를 제공할 수 있습니다.
React Router와 Redux, Context API와 같은 상태 관리 도구의 통합은 복잡한 웹 애플리케이션에서 중요한 데이터와 인증 상태를 효과적으로 관리할 수 있게 해줍니다. 전역 상태와 라우트별 상태를 명확히 구분하여 관리하고, 모듈화된 컴포넌트와 보호된 라우트를 활용함으로써, 유지보수성과 확장성이 뛰어난 애플리케이션 구조를 설계할 수 있습니다.
이번 포스팅에서는 전역 상태 유지, 라우트별 상태 초기화, 데이터 공유 및 모범 사례에 대해 살펴보았습니다. 이러한 전략을 통해 페이지 전환 시에도 일관된 사용자 경험을 제공하고, 복잡한 데이터 흐름을 효과적으로 관리할 수 있습니다. 여러분의 프로젝트에 맞는 최적의 상태 관리와 라우팅 통합 방식을 적극 도입하여, 보다 효율적이고 안정적인 애플리케이션을 구축하시길 바랍니다.
DeepSeek-R1: 강화학습으로 스스로 진화하는 추론 특화 언어모델 DeepSeek-R1은 순수 강화학습(RL)과 소량의 Cold-start 데이터를 결합한 다단계…
TensorFlow Extended(TFX): 프로덕션 레벨의 E2E 기계학습 파이프라인 플랫폼 TensorFlow Extended(TFX)는 구글에서 자체 머신러닝 제품을 안정적으로…
AutoML-Zero: ‘zero’에서부터 스스로 진화하는 기계학습 알고리즘 기계학습 알고리즘 설계의 혁신, AutoML-Zero 단 몇 줄의 코드도…
TensorFlow Lite: 모바일 & IoT 디바이스를 위한 딥러닝 프레임워크 엣지 인텔리전스를 향한 경량화된 딥러닝 TensorFlow…
Graph Convolutional Networks(GCN) 개념 정리 최근 비정형 데이터의 대표격인 그래프(graph)를 처리하기 위한 딥러닝 기법으로 Graph…
Graph Neural Networks(그래프 뉴럴 네트워크) 기초 개념 정리 딥러닝은 이미지·음성·텍스트와 같은 격자(grid) 형태 데이터에서 뛰어난…