코딩/리액트

[새싹 성동 2기] React Router 부가 기능(네비게이션, 스타일링, 리다이렉션)

insu90 2024. 12. 6. 19:21

React Router를 사용하면 SPA(Single Page Application) 개발에서 라우팅을 손쉽게 관리할 수 있습니다. 이번 포스팅에서는 React Router의 부가 기능들을 활용하여 페이지 이동, 스타일링, 그리고 리다이렉션을 구현하는 방법을 알아보겠습니다.

1. useNavigate 훅으로 페이지 이동

useNavigate는 Link 컴포넌트를 사용하지 않고 프로그래밍 방식으로 페이지를 이동할 때 사용하는 훅입니다.

예제: 이전 페이지와 정보 페이지로 이동 버튼 추가

아래 코드는 useNavigate 훅을 활용하여 버튼 클릭 시 페이지를 이동시키는 방법을 보여줍니다.

import { Link, Outlet, useNavigate } from "react-router-dom"; 
// Link: 경로 이동을 위한 컴포넌트
// Outlet: 하위 라우트를 렌더링할 위치를 지정
// useNavigate: 프로그래밍 방식으로 경로를 변경하는 훅

export default function Layout() {
    const navigate = useNavigate(); 
    // useNavigate를 통해 경로를 프로그래밍 방식으로 변경할 수 있습니다.

    // 이전 페이지로 이동하는 함수
    const goBack = () => navigate(-1);  
    // navigate(-1): 브라우저의 히스토리 스택에서 이전 페이지로 이동

    // "/info" 페이지로 이동하는 함수
    const goInfo = () => navigate("/info");  
    // navigate("/info"): "/info" 경로로 직접 이동

    return (
        <>
            {/* 헤더 영역: 네비게이션 메뉴 및 추가 버튼 */}
            <header style={{ background: 'lightgray', padding: 16, fontSize: 24 }}>
                {/* Link 컴포넌트를 통해 클릭 시 해당 경로로 이동 */}
                <Link to="/">홈</Link> |
                <Link to="/about">소개</Link> |
                <Link to="/info">정보</Link> |
                <Link to="/profiles">프로파일</Link>
                {/* 버튼을 통해 프로그래밍 방식으로 경로 이동 */}
                <div>
                    <button onClick={goBack}>이전 페이지로 이동</button>
                    {/* 이전 페이지로 이동하는 버튼 */}
                    <button onClick={goInfo}>정보 페이지로 이동</button>
                    {/* "/info" 페이지로 이동하는 버튼 */}
                </div>
            </header>

            {/* 메인 콘텐츠 영역 */}
            <main>
                <Outlet /> 
                {/* 서브 라우트에 해당하는 컴포넌트를 렌더링하는 위치 */}
            </main>

            {/* 푸터 영역 */}
            <footer style={{ background: 'lightgray', padding: 16, fontSize: 16 }}>
                Copyright ....
                {/* 웹사이트의 저작권 정보를 표시 */}
            </footer>
        </>
    );
}

2. NavLink로 현재 페이지 스타일 적용

NavLink는 경로와 현재 URL이 일치할 경우 특정 스타일 또는 클래스를 적용할 수 있는 컴포넌트입니다.

예제: 현재 페이지에 빨간색 스타일 적용

아래 코드는 NavLink의 style 속성을 사용하여 현재 경로와 일치하는 경우 텍스트 색상을 빨간색으로 설정합니다.

import { Link, NavLink, Outlet, useNavigate } from "react-router-dom";
// React Router의 주요 컴포넌트를 가져옴
// - Link: 경로 이동을 위한 간단한 링크
// - NavLink: 현재 경로를 기반으로 스타일을 적용할 수 있는 링크
// - Outlet: 서브 라우트를 렌더링할 위치를 지정
// - useNavigate: 프로그래밍 방식으로 경로를 변경하는 훅

export default function Layout() {
    const navigate = useNavigate(); 
    // useNavigate를 통해 동적으로 경로를 변경할 수 있음

    const goBack = () => navigate(-1);  
    // 이전 페이지로 이동
    // navigate(-1): 브라우저의 히스토리 스택에서 이전 페이지로 이동

    const goInfo = () => navigate("/info");  
    // "/info" 페이지로 이동
    // navigate("/info"): 지정된 경로로 바로 이동

    return (
        <>
            {/* 헤더 영역: 네비게이션 메뉴와 버튼 */}
            <header style={{ background: 'lightgray', padding: 16, fontSize: 24 }}>
                {/* Link: 단순 경로 이동 */}
                <Link to="/">홈</Link> |
                
                {/* NavLink: 현재 경로와 일치할 경우 스타일을 적용 */}
                <NavLink 
                    to="/about" 
                    style={({ isActive }) => isActive ? { color: 'red' } : undefined}
                >
                    소개
                </NavLink> |

                {/* 나머지 Link 요소들 */}
                <Link to="/info">정보</Link> |
                <Link to="/profiles">프로파일</Link>

                {/* 동적 경로 변경 버튼 */}
                <div>
                    <button onClick={goBack}>이전 페이지로 이동</button>
                    {/* 이전 페이지로 이동하는 버튼 */}
                    <button onClick={goInfo}>정보 페이지로 이동</button>
                    {/* "/info" 페이지로 이동하는 버튼 */}
                </div>
            </header>

            {/* 메인 콘텐츠 영역 */}
            <main>
                <Outlet /> 
                {/* 서브 라우트를 렌더링할 위치 */}
            </main>

            {/* 푸터 영역 */}
            <footer style={{ background: 'lightgray', padding: 16, fontSize: 16 }}>
                Copyright ....
                {/* 모든 페이지에 고정적으로 표시될 푸터 */}
            </footer>
        </>
    );
}

 

 

3. Navigate 컴포넌트로 리다이렉션 구현

Navigate는 특정 조건이 충족되었을 때 컴포넌트가 렌더링되자마자 다른 페이지로 이동시킬 수 있는 컴포넌트입니다.

예제: 로그인 상태에 따른 리다이렉션

로그인 상태가 아닌 경우 마이페이지에 접근하면 로그인 페이지로 리다이렉션됩니다.

Login.js

export default function Login() {
    // Login 컴포넌트를 기본 내보내기로 정의
    // 이 컴포넌트는 로그인 페이지 UI를 표시하는 역할을 수행

    return (
        <>
            {/* React 컴포넌트는 JSX 문법을 사용하여 UI를 구성 */}
            <h1>로그인 페이지</h1>
            {/* 로그인 페이지의 제목을 표시 */}
        </>
    );
}

MyPage.js

import { Navigate } from "react-router-dom";

// MyPage 컴포넌트 정의
export default function MyPage() {
    // 로그인 상태를 확인하는 변수. 실제 구현에서는 인증 로직 또는 상태 관리 시스템을 사용할 수 있음.
    const isLogin = false; // 현재 로그인 상태를 false로 설정 (로그인되지 않음)

    // 로그인하지 않은 경우
    if (!isLogin) {
        // Navigate 컴포넌트를 사용해 "/login" 경로로 리다이렉션
        // replace={true}는 히스토리 스택에서 현재 페이지를 대체하여 뒤로 가기 시 이전 페이지로 이동할 수 없게 설정
        return <Navigate to="/login" replace={true} />;
    }

    // 로그인된 경우
    return (
        // 마이 페이지 내용 출력
        <h1>마이 페이지</h1>
    );
}

 

4. App.js에 라우트 추가하기

위에서 구현한 컴포넌트들을 App.js에 등록하여 라우터를 구성합니다.

import { Route, Routes } from "react-router-dom"; // React Router를 사용하여 경로(Route)와 라우트 그룹(Routes)을 구성
import About from "./About"; // About 컴포넌트 임포트
import Home from "./Home"; // Home 컴포넌트 임포트
import Profile from "./Profile"; // Profile 컴포넌트 임포트
import Profiles from "./Profiles"; // Profiles 컴포넌트 임포트
import Layout from "./Layout"; // Layout 컴포넌트 임포트 (공통 레이아웃을 제공)
import Login from "./Login"; // Login 컴포넌트 임포트 (로그인 페이지)
import MyPage from "./MyPage"; // MyPage 컴포넌트 임포트 (마이 페이지)

// App 컴포넌트 정의
const App = () => {
  return (
    <Routes>
      {/* Layout 컴포넌트를 사용하는 라우트 그룹 */}
      <Route element={<Layout />}>
        {/* "/" 경로에 Home 컴포넌트를 연결 */}
        <Route path="/" element={<Home />} />
        {/* "/about" 경로에 About 컴포넌트를 연결 */}
        <Route path="/about" element={<About />} />
        {/* "/info" 경로에 About 컴포넌트를 재사용 */}
        <Route path="/info" element={<About />} />
        {/* "/profiles" 경로에 Profiles 컴포넌트를 연결 */}
        <Route path="/profiles" element={<Profiles />}>
          {/* Profiles의 서브 경로 ":userid"에 Profile 컴포넌트를 연결 */}
          <Route path=":userid" element={<Profile />} />
        </Route>
        {/* "/login" 경로에 Login 컴포넌트를 연결 */}
        <Route path="/login" element={<Login />} />
        {/* "/mypage" 경로에 MyPage 컴포넌트를 연결 */}
        <Route path="/mypage" element={<MyPage />} />
      </Route>
    </Routes>
  );
};

export default App;

 

5. 마이페이지 접근 테스트

테스트 방법

  1. 브라우저에서 마이페이지 경로로 직접 접근:
    http://localhost:3000/mypage
  2. 결과:
    • 로그인 상태가 아니면 로그인 페이지로 리다이렉션됩니다.

 

*생성형 AI 활용한 클라우드&보안 전문가 양성캠프 과정의 교육내용 정리 자료입니다.