- 과거
기존에는 사용자가 다른 페이지로 이동할 때마다 서버로부터 새로운 html을 받아오는 방식을 사용하였다. 하지만 이제는 웹에서 제공되는 정보가 매우 많아짐에 따라서 서버 측에서 모든 View를 준비하면 성능상의 문제가 발생한다.- 현재
따라서 React와 같은 라이브러리, 혹은 프레임워크는 View 렌더링을 사용자의 브라우저가 담당하도록 하고, 우선 애플리케이션을 브라우저에 불러와서 실행시킨 후, 사용자와의 인터렉션이 발생하면 필요한 부분만 JS를 사용해 업데이트 하는 방식으로 바뀌었다. 만약 새로운 데이터가 필요하다면, 서버 API를 호출하여 필요한 데이터만 불러온다.
Single Page Application (싱글 페이지 애플리케이션)의 약어로써, 말 그대로 한 개의 페이지로 이루어진 애플리케이션이다.
하지만 '싱글 페이지' 라고 해서 화면이 한 종류는 아닐 것이다. 예를 들어 블로그를 개발한다면 홈, 포스트 목록, 포스트, 글쓰기 등의 화면이 존재할 것이고, 해당 페이지에서 로딩된 JS와 현재 사용자 브라우저의 주소 상태에 따라 다양한 화면을 보여줘야 할 것이다.
따라서 다른 주소에 다른 화면을 보여주는 것을 라우팅이라고 한다. React 라이브러리 자체에 이 기능이 내장되어 있지는 않다. 그 대신, 브라우저의 API를 직접 사용하여 이를 관리하거나, 라이브러리 (React-router, Reach-router, Next.js) 를 사용하여 이를 간편히 구현할 수 있다.
이중 나는, React-Router를 사용할 것이고, 클라이언트 사이드에서 이루어지는 라우팅을 아주 간단하게 구현할 수 있도록 해준다.
이러한 문제들을 서버 사이드 렌더링을 통해 모두 해결할 수 있다.
yarn create react-app blog-frontend
yarn add react-router-dom
총 다섯 개의 페이지를 만들 것이고, 라우트와 관련된 컴포넌트 들은 src/pages 디렉터리에 만든다.
그 후, 프로젝트 엔트리 파일인 index.js에서
BrowserRouter로 App컴포넌트를 감싼다.
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import {BrowserRouter} from 'react-router-dom';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<BrowserRouter>
<App />
</BrowserRouter>
);
// If you want to start measuring performance in your app, pass a function
// to log results (for example: reportWebVitals(console.log))
// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
reportWebVitals();
import React from 'react';
import { Route, Routes } from 'react-router-dom';
import './App.css';
import PostListPage from './pages/PostListPage';
import LoginPage from './pages/LoginPage';
import RegisterPage from './pages/RegisterPage';
import WritePage from './pages/WritePage';
import PostPage from './pages/PostPage';
function App() {
return (
<>
<Routes>
<Route element = {<PostListPage/>} path="/:username" exact/>
<Route element = {<PostListPage/>} path="/" exact/>
<Route element = {<LoginPage/>} path="/login"/>
<Route element = {<RegisterPage/>} path ="/register"/>
<Route element = {<WritePage/>} path = "/write"/>
<Route element = {<PostPage/>} path = "/:username/:postId"/>
</Routes>
</>
);
}
export default App;