• 딱히 프론트나 리액트를 자세히 알지도 좋아하지도 않는 사람의 글 입니다

S3에서 static하게 웹을 서비스하기로 했을 때 한가지 문제점이 있었다.
홈 화면과 각 항목을 눌렀을 때의 페이지를 구현하고 싶은데 static한 웹에서는 이것을 어떻게 redirect해야하나 라는 고민을 하게되었습니다.

물론 이 것을 s3안에 object 이름으로 url을 맞춰서 관리하는 방법도 있지만 뭔가 평범하게 url로 redirect하는 것 처럼 하나의 웹페이지가 가상url을 가지는 것과 같이 구현하고 싶다고 생각했습니다.

그렇게해서 찾게된 것이 "react-router-dom" 라이브러리입니다.

사용 예시 코드부터 보면 다음과 같습니다

import React from 'react';
import Home from './components/home/';
import ShowPage from './components/show'
import "./App.css"
import {
    BrowserRouter as Router,
    Routes,
    Route,
    Navigate,
} from "react-router-dom";

function App() {
return (
        <>
            {/* This is the alias of BrowserRouter i.e. Router */}
            <Router>
                <Routes>
                    <Route
                        exact
                        path="/"
                        element={<Home />}
                    />
                    <Route
                        exact
                        path="/mix/:id"
                        element={<ShowPage />}
                    />
                    <Route
                        path="*"
                        element={<Navigate to="/" />}
                    />
                </Routes>
            </Router>
        </>
    );
}

export default App;

안에 를 두고 로 각 path와 element를 정의합니다.

path의 url로 들어가면 element안에있는 항목이 render되게 되며 마지막에 path="*“의 경우를 사용해 그 외의 경우에는 루트로 돌려보냅니다.

또 여기서 하나 확인할 것은 두 번째 항목에 있는 :id 항목입니다.

이 항목은 ShowPage를 render할 때 parameter로 넘어가게 되어 ShowPage 항목 내에서 다음과 같이 참조할 수 있습니다.

const { id } = useParams();

이 기능들을 사용하여 다음과 같은 사이트가 구현이 가능합니다

아래와 같은 list 페이지에서 각 항목을 클릭하면

다음과 같이 새로운 페이지로 연결된 것처럼 보입니다

다만 s3에서 static website로 이 기능을 운영할 때는 한가지 더 해야 할 일이 있습니다.

bucket -> properties -> Static website hosting 으로 이동하여

Error document를 index.html로 연결해야합니다.

해당 변경을 하지 않으면 404 에러가 발생하게됩니다.

예를 들어 URL/mix/123456을 접속하게 되면 실제 s3 bucket안의 mix/123456파일을 찾으려고 하는데 해당 파일은 존재하지 않기 때문입니다.

이 경우에 Error document를 index.html로하는 것으로 해당 에러를 index.html이 처리하게하여 위의 Router가 작동하게 해줄 수 있습니다.