본문 바로가기

React/Router - React

[React] React Router : 기본 세팅

1. 설치 진행

yarn add react-router-dom

2. BrowserRouter 최상단 컴포넌트 감싸주기

BrowserRouter 란?

HTML5 의 History api 를 사용하여 페이지를 새로 고침하지 않고도 url 변경을 통해 특정 경로에 route 돼있는 리액트 컴포넌트를 불러와 사용할 수 있게 해준다.

 

내 블로그 내 History api 간단 설명 url :

 

src/index.js

import React from 'react';
import ReactDOM from 'react-dom/client';
import App from './App';
import { BrowserRouter } from 'react-router-dom';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <BrowserRouter>
      <App />
    </BrowserRouter>
  </React.StrictMode>
);

3. FirstPage, SecondPage, ThirdPage 컴포넌트 생성.

src/page/FirstPage.js

import React from 'react';

const FirstPage = () => {
    return (
        <div> 
            <h1>This is the First Page</h1>
            <h2>This page can be recognised as Main Page</h2>
        </div>
    );
};

export default FirstPage;

 

src/page/SecondPage.js

import React from 'react';

const SecondPage = () => {
    return (
        <div> 
            <h1>This is the Second Page</h1>
        </div>
    );
};

export default SecondPage;

 

src/page/ThirdPage.js

import React from 'react';

const ThirdPage = () => {
    return (
        <div> 
            <h1>This is the Third Page</h1>
        </div>
    );
};

export default ThirdPage;

 

4. App.js 에 <Routes /> 와 <Route> 로 세팅해주기.

import React from 'react';
import { Route, Routes } from 'react-router-dom';
import FirstPage from './page/FirstPage';
import SecondPage from './page/SecondPage';
import ThirdPage from './page/ThirdPage';

function App() {

  return (
    <Routes>
        <Route path='/' element={<FirstPage />} />
        <Route path='/second' element={<SecondPage />} />
        <Route path='/third' element={<ThirdPage />} />
    </Routes>

  );
}

export default App;

맨 첫번째 Route 에 path ' / ' 에 의미는 url 에서 path 입력 없이 도메인만 입력했을 시 또는 path 를 ' / ' 만 입력 시 접속 페이지를 <FirstPage /> 로 하겠다는 뜻이다. 즉 메인 페이지를  <FirstPage /> 로 지정한 것이다.

 

React 를 실행한 후 아래 이미지와 같이 url 에 접속해보면 각각 Route 된 컴포넌트들이 불러와진다.

5. useNaviage() 테스트

useNavigate() 와 Link 를 사용하여 각 Route 돼있는 컴포넌트로 버튼 또는 이벤트를 통해 이동 처리를 해보자.

 

각각의 컴포넌트들에 useNavigate() 를 호출한 후 버튼을 생성하여 아래와같이 onClick 속성을 추가했다.

 

src/page/FirstPage.js

const FirstPage = () => {
    const navigate = useNavigate();
    return (
        <div> 
            <h1>This is First Page</h1>
            <h2>This page can be recognised as Main Page</h2>
            <button onClick={() => navigate('/second')}>move to second Page</button>
        </div>
    );
};

 

src/page/SecondPage.js

const SecondPage = () => {
    const navigate = useNavigate();
    return (
        <div> 
            <h1>This is Second Page</h1>
            <button onClick={() => navigate('/third')}>move to Third Page</button>
        </div>
    );
};

 

src/page/ThirdPage.js

const ThirdPage = () => {
    const navigate = useNavigate();
    return (
        <div> 
            <h1>This is Third Page</h1>
            <button onClick={() => navigate('/')}>move to First Page</button>
        </div>
    );
};

 

그 다음 새로 랜더링된 페이지들을 확인해보면 버튼이 추가돼 있다.

 

클릭을 해보면 정상적으로 페이지가 이동된다.

 

SPA 의 특성상 첫 실행시 모든 페이지를 다 불러온다. 그다음 url 의 변경을 통해 이미 불러와진 페이지(컴포넌트) 를 위로 덮어써 가져오는 형태 이다. 그래서 페이지 새로고침 없이 화면이 빠르게 전환 되는 것이다.

6. Link 테스트

useNavigate 에 이어 Link 기능 또한 테스트 해보자.

메인 페이지에 Link 를 추가해 Thrid Page 로 한번에 이동할 수 있도록 기능 추가해보겠다.

const FirstPage = () => {
    const navigate = useNavigate();
    return (
        <div> 
            <h1>This is First Page</h1>
            <h2>This page can be recognised as Main Page</h2>
            <ul>
                <li>
                    <Link to={'/third'}>Third Page</Link>
                </li>
            </ul>
            <button onClick={() => navigate('/second')}>move to second Page</button>
        </div>
    );
};

 

그럼 아래 이미지와 같이 링크가 하나 추가된다.

그리고 클릭해보면 Third Page 로 이동한다.

7. Not Found 페이지 추가

유저가 실수로 Route 돼있지 않은 url 로 접속을 할 수도 있다. 그것이 악의적은 의도던 실수던 우리는 그에 따른 대응을 해줘야 한다. 

Route 돼있지 않은 path 들은 모두 Not Found 페이지로 처리를 해줄것이다.

간단하다.

 

먼저 Not Found 컴포넌트를 만들어주자.

 

src/page/NotFound.js

import React from 'react';

const NotFound = () => {
    return (
        <div>
            <h2>This is Not Found Page</h2>
            <br/>
            <p>Sorry, Something went wrong.</p>
            <p>please, contact to the page manager.</p>
        </div>
    );
};

export default NotFound;

 

그다음 App.js 로 가서 Route 등록을 해준다.

import React from 'react';
import { Route, Routes } from 'react-router-dom';
import FirstPage from './page/FirstPage';
import SecondPage from './page/SecondPage';
import ThirdPage from './page/ThirdPage';
import NotFound from './page/NotFound';

function App() {

  return (
    <Routes>
        <Route path='/' element={<FirstPage />} />
        <Route path='/second' element={<SecondPage />} />
        <Route path='/third' element={<ThirdPage />} />

        <Route path='*' element={<NotFound />} />
    </Routes>

  );
}

export default App;

새로 등록된 Route 에 path 를 보면 ' * ' 로 지정됐다. 이 뜻은 '모든' 이라는 뜻을 가지고 있다. 즉 위에 지정된 path 를 제외한 다른 모든 path 들은 <NotFound /> 로 Route 할 것이라는 뜻이다.

 

 

React 를 실행한 후 url path 에 지정하지 않은 path 를 입력 후 접속을 해보면 아래와 같이 NotFound 페이지로 라우트 해준다.

 

 

Reference

https://velog.io/@velopert/react-router-v6-tutorial

 

React Router v6 튜토리얼

리액트 라우터 v6를 새로 접하시는 분들을 위한 튜토리얼을 작성했습니다. 리액트 라우터 v6 의 기본적인 사용법, 그리고 이 라이브러리에서 제공하는 다양한 유용한 기능들에 대해서 알아봅시

velog.io

https://developer.mozilla.org/ko/docs/Web/API/History_API

 

History API - Web API | MDN

DOM의 Window 객체는 history 객체를 통해 브라우저의 세션 기록에 접근할 수 있는 방법을 제공합니다. history는 사용자를 자신의 방문 기록 앞과 뒤로 보내고 기록 스택의 콘텐츠도 조작할 수 있는,

developer.mozilla.org