예를 들어서 밑에 있는 Route 컴포넌트 코드를 보면 다음과 같다.
import React from "react";
import { BrowserRouter, Route, Routes } from "react-router-dom";
const Router = () => {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<ListComponent />} /> // 1
<Route path="/post/1" element={<FirstPosting/>} /> // 2
<Route path="/post/2" element={<SecondPosting/>} /> // 3
</Routes>
</BrowserRouter>
);
}
export default Router;
- 포스팅 목록들을 볼 수 있는 리스트 페이지
- 첫번째 포스팅 내용을 볼 수 있는 상세 페이지 (post : 1)
- 두번째 포스팅 내용을 볼 수 있는 상세 페이지 (post : 2)
일반적으로 리스트 페이지의 루트를 / 로 설정하고 상세 페이지를 /post/[포스트의 ID]로 정해서 /post/1로 들어가면 post 1번 게시물을 /post/2로 접속하면 post 2번 게시물을 보여주는 방식으로 되어있는데 대체적으로 Route 컴포넌트는 위와 같이 유사한 형태를 띄게 된다.
다만, 포스팅 페이지가 한 두개일경우 크게 문제가 안되지만 포스트 페이지가 점점 늘어나서 만약 10000개의 포스트가 쌓였다면 /post/1~10000의 Route를 Router 컴포넌트에 일일이 설정해줘야 하며, 만약 포스팅 컴포넌트의 Route를 수정하거나 삭제할땐 다시 Router 컴포넌트에서 해당 Route를 삭제해줘야 하는 번거로움이 있다. 결론적으론 정적 라우팅은 Route를 유연하게 정의할 수 없다는 단점을 가지고 있다.
이와 같은 문제를 해결하기 위해서 나온 라우팅의 개념이 동적 라우팅(Dynamic Routing) 이다. 그러면 동적 라우팅이란? 정적 라우팅 처럼 Route를 설정할때 URL의 전체 형태를 미리 정의하는 것이 아니라 특정 규칙을 정의한후 규칙에 부합하는 URL의 경우에는 해당 element를 보여주게 설정하는 방식으로 사용되는것이 동적 라우팅이다. 예를들어 정적 라우팅은 post/1, post/2 처럼 1,2와 같은 숫자까지 포함해서 URL의 전체 형태로 띄웠는데 이제는 /post/ 로 시작하는 모든 URL은 상세페이지로 연결되게 설정하는 방식을 사용하게 된다.
동적 라우팅을 사용하게 되면 post/1, post/100, post/10000 등과 같이/post/ 로 규칙을 만족하는 모든 URL에 대해서 상세페이지로 모두 연결시킬 수 있기 때문에 포스트를 추가하거나 삭제되는 등 변동이 생기더라도 Router 컴포넌트를 직접 수정하지 않아도 된다.
import React from "react";
import { BrowserRouter, Route, Routes } from "react-router-dom";
const Router = () => {
return (
<BrowserRouter>
<Routes>
<Route path="/" element={<ListComponent />} />
<Route path="/post/:id" element={<DetailPageComponent />} />
</Routes>
</BrowserRouter>
);
}
export default Router;
react-router-dom 에서 동적 라우팅을 구현하는 방법은 path prop에 : 기호를 활용하고 그 옆에 각각의 post 페이지마다 부여되는 id를 넣어주면 된다. 경로/:문자열(id) 형태로 path를 설정하면 URL 에서 경로/ 뒤에 무슨 글자든 숫자가 오든 이 Route로 연결되는 것이다. 특히 위에 있는 Router 컴포넌트 예시 코드 처럼 이와 같이 Route를 설정하게 되면 뒤에 어떠한 글자가 와도 모두 상세페이지 컴포넌트를 보여주게 된다. 즉, post/1, post/100, post/10000, post/test 모두 상세페이지 컴포넌트로 연결되어 일일이 Router 컴포넌트에서 수정하거나 삭제하지 않아도 된다는 뜻임을 알 수 있다. 여기서 : 기호 뒤에 id와 같은 문자열이 바로 path parameter 라고 한다.
예를들어 /post/:id 라고 path를 설정했고 그 이름을 id 로 매개변수 이름을 넣었는데 결과적으로 유저가/post/1로 접속하면 이id라는 이름은 1 이라는 값으로 전달된 것이다. 만약에 10000 으로 접속하면 이 id의 값은 10000 이라는 값으로 전달된 것 이다. 이렇게 컴포넌트 안에서 path parameter로 전달된 값을 이용해 특정한 처리를 하는 코드를 작성했다면, 동일한 컴포넌트에서 다양한 UI를 보여줄 수 있게 되는 것이다.
4-1) useParams Hook 사용하기
// useParams 활용 예시
import React from "react";
import { Link, useParams } from "react-router-dom";
const Detail = () => {
const params = useParams();
const id = params.id;
return (
<section>
<h1>This is Detail Page</h1>
<h2>path parameter:{id}</h2>
<Link to="/">Go Back To List Page</Link>
</section>
);
};
export default Detail;
id로 지정을 했기 때문에 post/1로 접속했다면? useParams hook의 return 값은 {id: 1}이 된다.