[javascript] 리액트 라우터의 라우팅 디자인과 패턴

리액트 라우터(React Router)는 싱글 페이지 애플리케이션(Single Page Application)에서 라우팅을 관리하기 위해 사용되는 라이브러리입니다. 리액트 라우터를 통해 사용자가 다른 URL로 이동할 때 컴포넌트를 동적으로 로드하여 라우터를 관리할 수 있습니다.

리액트 라우터의 라우팅 디자인과 패턴은 애플리케이션의 구조와 사용자 경험에 중요한 영향을 미칩니다. 따라서 올바른 라우팅 디자인과 패턴을 선택하고 사용하는 것은 애플리케이션의 성능과 유지 보수성을 향상시키는 데 도움이 됩니다.

1. 중첩 라우팅 (Nested Routing)

중첩 라우팅은 여러 레벨의 URL을 사용하여 애플리케이션을 구성하는 방법입니다. 이 패턴은 대규모 애플리케이션에서 주로 사용되며, 각 레벨의 URL에 해당하는 컴포넌트를 로드하여 화면을 구성하는 방식입니다.

예를 들어, /users URL은 사용자 목록을 보여주는 컴포넌트를 로드하고, /users/:userId URL은 특정 사용자의 상세 정보를 보여주는 컴포넌트를 로드한다고 가정해봅시다. 이러한 구조를 중첩 라우팅을 통해 구현할 수 있습니다.

import { BrowserRouter as Router, Switch, Route } from 'react-router-dom';

const App = () => {
  return (
    <Router>
      <Switch>
        <Route exact path="/users" component={UserList} />
        <Route path="/users/:userId" component={UserDetail} />
      </Switch>
    </Router>
  );
};

2. 동적 라우팅 (Dynamic Routing)

동적 라우팅은 URL에 동적으로 변경되는 값(parameter)을 포함하는 방식입니다. 이 패턴은 사용자가 다른 리소스를 요청할 때마다 해당 리소스에 대한 정보를 동적으로 로드하는 데 사용됩니다.

예를 들어, /products/:productId URL은 특정 상품의 상세 정보를 보여주는 컴포넌트를 로드한다고 가정해봅시다. 이러한 경우에는 동적 라우팅을 통해 URL의 :productId 부분에 해당하는 값을 가져와서 상세 정보를 로드할 수 있습니다.

import { BrowserRouter as Router, Switch, Route } from 'react-router-dom';

const App = () => {
  return (
    <Router>
      <Switch>
        <Route path="/products/:productId" component={ProductDetail} />
      </Switch>
    </Router>
  );
};

3. 보호된 라우팅 (Protected Routing)

보호된 라우팅은 인증이 필요한 페이지에 대한 접근을 제어하는 방식입니다. 이 패턴은 로그인이 필요한 페이지를 구현하는 데 사용됩니다. 사용자가 로그인하지 않은 상태로 보호된 페이지에 접근하려고 할 때는 로그인 페이지로 리디렉션됩니다.


// AuthProvider.js
import React, { createContext, useState } from 'react';

export const AuthContext = createContext();

export const AuthProvider = ({ children }) => {
  const [isLoggedIn, setIsLoggedIn] = useState(false);

  return (
    <AuthContext.Provider value={{ isLoggedIn, setIsLoggedIn }}>
      {children}
    </AuthContext.Provider>
  );
};

// ProtectedRoute.js
import { Route, Redirect } from 'react-router-dom';
import { AuthContext } from './AuthProvider';

const ProtectedRoute = ({ component: Component, ...rest }) => {
  const { isLoggedIn } = useContext(AuthContext);

  return (
    <Route
      {...rest}
      render={(props) =>
        isLoggedIn ? <Component {...props} /> : <Redirect to="/login" />
      }
    />
  );
};

// App.js
import { BrowserRouter as Router, Switch } from 'react-router-dom';
import { AuthProvider } from './AuthProvider';
import ProtectedRoute from './ProtectedRoute';

const App = () => {
  return (
    <AuthProvider>
      <Router>
        <Switch>
          <ProtectedRoute path="/protected" component={ProtectedPage} />
        </Switch>
      </Router>
    </AuthProvider>
  );
};

결론

리액트 라우터의 라우팅 디자인과 패턴은 애플리케이션의 구조와 사용자 경험에 큰 영향을 미칩니다. 중첩 라우팅, 동적 라우팅, 보호된 라우팅 등 다양한 패턴을 사용하여 애플리케이션의 요구사항에 맞게 라우팅을 구현할 수 있습니다. 적절한 라우팅 패턴을 선택하고 사용하여 리액트 라우터를 효과적으로 활용해보세요.