React는 흔히 SPA(Single Page Application)라이브러리이다. 하나의 HTML를 통해서 페이지 전환관 다양한 콘텐츠를 제공하는데 이번 포스팅에서는 React에서 제공하는 Router기능과 Router를 정의하는 방법에 대해서 간단하게 알아보자.
웹 사이트를 방문하면 일반적으로 도메인 이름 뒤에 경로를 첨부할 수 있다.
https://localhost:8000/welcome
위 예시에서는 "welcome"페이지를 로딩한다.
또 여기서 url경로의 "welcome"을 "info"로 변경하면 "info" 페이지가 로딩된다.
위와같은 경로를 바꾸면 다른 페이지를 로딩하는 과정이 라우팅이 하는 역할이다.
다만 위와같이 한다면 항상 새 콘텐츠를 가져와야 한다는 단점이 있다.
"경로를 전환할 때 새로운 콘텐츠를 가져오는건 당연한게 아니야?"라는 생각을 할 수 있다. 다만 새로운 요청을 보내고 새로운 응답을 받는 과정에서 사용자의 흐름이 중단될 수 있다는 단점이 있는 것이다.
즉, 지연이 발생하고 웹 사이트가 느려질 수 있다.
그래서 더 복잡한 페이지를 만들때는 SPA를 선호하게 된다.
SPA는 최초 "HTML요청"을 하나만 전송하고 HTML파일과 많은 추가적인 JS파일이 다운로드 되고 그 다음에 클라이언트에서 실행되는 추가 JS코드는 사용자가 화면에서 직접 조절 할 수 있다.
1. React에서 Router를 정의하기 위해서는 react-router-dom
패키지를 설치해줘야 한다.
npm i react-router-dom
해당 패키지를 통해서 URL변경을 감시하고 다양한 콘텐츠를 로딩할 수 있게 된다.
React에서 Router를 정의하는 방법은 여러가지가 있지만 이번 포스팅에서는 createBrowserRouter
에 대해서 살펴보자.
2. 최상단 컴포넌트인 "App"컴포넌트에 cretaeBrowserRouter
함수를 import시켜준다.
import { createBrowserRouter } from "react-router-dom";
import "./App.css";
function App() {
return <div className="App"></div>;
}
export default App;
3. createBrowserRouter
함수 안에는 라우터 정의 객체로 된 배열을 넣어준다.
import { createBrowserRouter } from "react-router-dom";
import "./App.css";
createBrowserRouter([{}, {}, {}]);
function App() {
return <div className="App"></div>;
}
export default App;
배열에는 객체원소들이 들어가고 객체들은 각각 하나의 Route
를 나타낸다.
4. Route
객체들을 활성화 하기 위해서는 몇 가지 속성을 정의해야 한다.
createBrowserRouter([
{
path: "",
},
{},
{},
]);
그 중, 항상 추가할 속성은 path
속성이다.
path
속성은 Route
가 작동해야 하는 경로를 정의한다.
참고로 경로는 도메인 뒤에 있는 경로를 의미한다. ex ) example.com/products
도메인 뒤에 아무것도 없다면 해당 path
속성을 가진 객체는 시작페이지가 활성화 되는 Route
이다.
createBrowserRouter([
{
path: "/",
},
{},
{},
]);
두번째로 객체에 넣어야 할 속성으로는 해당 Route
객체가 활성화 되었을 때 로딩되어야 하는 컴포넌트에 대한 정보인 element
속성이다.
createBrowserRouter([
{
path: "/",
element: "",
},
{},
{},
]);
element
속성은 이름에서 알 수 있듯 우리가 요소를 정의할 때 사용하는 속성이다.
import { createBrowserRouter } from "react-router-dom";
import "./App.css";
import HomePage from "./Pages/HomePage";
createBrowserRouter([
{
path: "/",
element: <HomePage />,
},
{},
{},
]);
위와같이 element
속성에 페이지 컴포넌트를 지정해주면 해당 Route가 활성화 될 때 element
속성으로 지정된 페이지 컴포넌트를 렌더링 하게 된다.
여기까지가 첫번째 단계이다!
5. 이제 정의한 Router를 사용하기 위해 먼저 createBrowserRouter
함수에서 리턴된 값을 변수나 상수에 저장해야 한다.
import { createBrowserRouter } from "react-router-dom";
import "./App.css";
import HomePage from "./Pages/HomePage";
const router = createBrowserRouter([
{
path: "/",
element: <HomePage />,
},
{},
{},
]);
function App() {
return <div className="App"></div>;
}
export default App;
즉, 우리는 Router를 화면에 렌더링 해야 한다너간 또는 그 Router를 로딩해야 하고 적절한 페이지를 화면에 렌더링 해야 한다고 React에게 알려주기 위해서 반환된 값을 받을 상수가 필요한 것이다.
6. 반환된 Router정의를 사용하기 위해서는 RouterProvider
제공자 컴포넌트를 react-router-dom
에서 import해줘야 한다.
import { createBrowserRouter, RouterProvider } from "react-router-dom";
import "./App.css";
import HomePage from "./Pages/HomePage";
const router = createBrowserRouter([
{
path: "/",
element: <HomePage />,
},
{},
{},
]);
function App() {
return <div className="App"></div>;
}
export default App;
해당 컴포넌트는 JSX코드에서 사용할 수 있는 컴포넌트이다.
해당 컴포넌트는 우리가 설정해야 하는 특수한 속성이 있다.
바로 router
속성이다.
import { createBrowserRouter, RouterProvider } from "react-router-dom";
import "./App.css";
import HomePage from "./Pages/HomePage";
const router = createBrowserRouter([
{
path: "/",
element: <HomePage />,
},
{},
{},
]);
function App() {
return (
<>
<RouterProvider router={router} />
</>
);
}
export default App;
router
속성에 넣는 값은 createBrowserRouter
로 생성한 Router를 넣어줘야 한다.
위 과정까지 마쳤다면 Router정의에 컴포넌트를 연결시키고 렌더링 하여서 활성화 시킬 준비가 끝났다.
import { createBrowserRouter, RouterProvider } from "react-router-dom";
import "./App.css";
import HomePage from "./Pages/HomePage";
import InfoPage from "./Pages/InfoPage";
const router = createBrowserRouter([
{
path: "/",
element: <HomePage />,
},
{
path: "/info",
element: <InfoPage />,
},
{},
]);
function App() {
return (
<div className="App">
<RouterProvider router={router} />
</div>
);
}
export default App;
"info" 더미페이지까지 만들어서 테스트해보면 위와같이 Router가 제대로 작동하는걸 확인할 수 있다.
Router
를 정의하는 또 다른 방법은 createRoutesFromElements
함수를 import시켜준다.
import {
createBrowserRouter,
RouterProvider,
createRoutesFromElements, //createRoutesFromElements import
} from "react-router-dom";
두번째로 Route
컴포넌트도 import시켜주고 createRoutersFromElements
함수를 이용하면 함수 내부에 컴포넌트를 추가해서 element
로부터 Route를 정의할 수 있다.
import {
createBrowserRouter,
RouterProvider,
createRoutesFromElements,
Route,
} from "react-router-dom";
import "./App.css";
import HomePage from "./Pages/HomePage";
import InfoPage from "./Pages/InfoPage";
const rootDefinition = createRoutesFromElements(<Route></Route>);
Route
컴포넌트 안에 중첩 Route
를 선언해주고 속성으로 path
, element
를 추가하여 경로와 Route에 접근할 때 어떤 컴포넌트를 렌더링 시켜줄 것인지 정의해준다.
import {
createBrowserRouter,
RouterProvider,
createRoutesFromElements,
Route,
} from "react-router-dom";
import "./App.css";
import HomePage from "./Pages/HomePage";
import InfoPage from "./Pages/InfoPage";
const rootDefinition = createRoutesFromElements(
<Route>
<Route path="/" element={<HomePage />}></Route>
<Route path="/info" element={<InfoPage />}></Route>
</Route>
);
위와같이 해주면 createBrowserRouter
로 만든 route
정의를 이용해서 만든 "rootDefinition"을 Router
로 이용할 수 있다.
import {
createBrowserRouter,
RouterProvider,
createRoutesFromElements,
Route,
} from "react-router-dom";
import "./App.css";
import HomePage from "./Pages/HomePage";
import InfoPage from "./Pages/InfoPage";
const routeDefinition = createRoutesFromElements(
<Route>
<Route path="/" element={<HomePage />}></Route>
<Route path="/info" element={<InfoPage />}></Route>
</Route>
);
const router = createBrowserRouter(routeDefinition);
위와같이 앞선방법과 동일하게 동작하는걸 확인할 수 있다.
두 방법중 아무거나 선택해도 상관없다!
이번 포스팅에서는 React가 SPA를 어떻게 구성하고 페이지간의 경로전환 방법에 대해서 알아봤다.
위 개념들은 SPA를 구성하기 위해서는 React에서 필수적인 개념이며 SPA단계로 가기위한 첫번째 관문이다.
다음 포스팅에서는 url을 직접 입력해서 페이지를 전환하는게 React에서 제공하는 기능인 Link
, NavLink
컴포넌트에 대해서 알아보자.
https://www.udemy.com/course/best-react/learn/lecture/36126020#overview