Hello Kitty Eyes Shut
๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๐Ÿ’ป๊ณต๋ถ€ ๊ธฐ๋ก/๐Ÿ“Œ Frontend

[Frontend] React Router๋กœ SPA์—์„œ ํŽ˜์ด์ง€ ์ด๋™ ๊ตฌํ˜„ํ•˜๊ธฐ

๋ฐ˜์‘ํ˜•

 

 

 

๐Ÿงฉ  React Router๋Š” ์™œ ํ•„์š”ํ• ๊นŒ?

โœ… SPA๋ž€

SPA (Single Page Application)๋Š” ๋ง ๊ทธ๋Œ€๋กœ

ํ•˜๋‚˜์˜ HTML ํŒŒ์ผ๋กœ ๊ตฌ์„ฑ๋œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์˜๋ฏธํ•œ๋‹ค.

 

ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•ด๋„, ์‹ค์ œ๋กœ๋Š” ์ƒˆ HTML ํŒŒ์ผ์„ ๋ฐ›์•„์˜ค๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ,

๊ธฐ์กด HTML ์•ˆ์—์„œ JavaScript๋กœ ํ™”๋ฉด์„ ๋ฐ”๊ฟ”์ฃผ๋Š” ๋ฐฉ์‹์ธ ๊ฒƒ์ด๋‹ค.

 

์ฆ‰, ์œ ์ € ์ž…์žฅ์—์„œ๋Š” 'ํŽ˜์ด์ง€๊ฐ€ ์ด๋™ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ' ๋ณด์ด์ง€๋งŒ,
์‹ค์ œ๋กœ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ ๋ถˆ๋Ÿฌ์˜ค์ง€๋Š” ์•Š๋Š”๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด ์œ ์ €๊ฐ€ www.example.com/login์— ์— ์ ‘์†ํ•˜๋ฉด,

๊ธฐ์กด ๋ฐฉ์‹ (MPA, Multi Page Application)์—์„œ๋Š” ์„œ๋ฒ„๊ฐ€ login.html์„ ์ƒˆ๋กœ ๋ณด๋‚ด์คฌ์ง€๋งŒ,

SPA์—์„œ๋Š” ์ด๋ฏธ ๋กœ๋”ฉ๋œ index.html ์•ˆ์—์„œ React๊ฐ€ LoginPage ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด์—ฌ์ค€๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์„ ์ œ์–ดํ•˜๋Š” ๊ฒŒ ๋ฐ”๋กœ React Router ์ด๋‹ค.

 

 

๐Ÿ›ฃ๏ธ React Router๊ฐ€ ํ•˜๋Š” ์ผ

React Router๋Š” ํ˜„์žฌ ๋ธŒ๋ผ์šฐ์ € ์ฃผ์†Œ(URL)์— ๋”ฐ๋ผ์„œ

์–ด๋–ค React ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณด์—ฌ์ค„์ง€ ๊ฒฐ์ •ํ•ด์ค€๋‹ค.

 

๐Ÿ‘‡ ์ด๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜๋ฉด ์‰ฝ๋‹ค.

URL ์ฃผ์†Œ ๋ณด์—ฌ์ค„ React ์ปดํฌ๋„ŒํŠธ
/ <MainPage />
/login <LoginPage />
/products/11 <ProductDetail />

 

์ด๊ฒƒ์„ ์ง์ ‘ ์ œ์–ดํ•˜๋Š” ๊ฒŒ <Route> ์ปดํฌ๋„ŒํŠธ์ด๊ณ ,

์ด ์ „์ฒด ๊ธฐ๋Šฅ์„ ๋™์ž‘ํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ <BrowserRouter>์ด๋‹ค.

 

 

๐Ÿš€ React Router๊ฐ€ ์—†์œผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

React Router ์—†์ด ๋‹จ์ˆœํžˆ HTML์˜ <a href="/login">๋กœ๊ทธ์ธ</a> ์ฒ˜๋Ÿผ ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

๐Ÿ‘‰ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ง„์งœ๋กœ ์„œ๋ฒ„์— /login ๊ฒฝ๋กœ์˜ HTML ํŒŒ์ผ์„ ์š”์ฒญํ•˜๊ฒŒ ๋œ๋‹ค.

 

ํ•˜์ง€๋งŒ ์ด ๋ฐฉ์‹์€ ํŽ˜์ด์ง€ ์ „์ฒด๊ฐ€ ์ƒˆ๋กœ๊ณ ์นจ๋˜๋ฉด์„œ,

React ๋‚ด๋ถ€์˜ ์ƒํƒœ๋‚˜ ๋ผ์šฐํŒ… ์ •๋ณด๊ฐ€ ๋ชจ๋‘ ์ดˆ๊ธฐํ™”๋˜๊ธฐ ๋•Œ๋ฌธ์—

React ์•ฑ์ด ์ง€ํ–ฅํ•˜๋Š” SPA ๊ตฌ์กฐ์™€๋Š” ๋งž์ง€ ์•Š๋Š”๋‹ค.

 

 

โœ… ๊ฒฐ๋ก 

React Router๋Š” SPA ๊ตฌ์กฐ์—์„œ

์ฃผ์†Œ๋Š” ๋ฐ”๋€Œ์ง€๋งŒ ํŽ˜์ด์ง€ ์ „์ฒด๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜์ง€ ์•Š๊ณ ,

ํ™”๋ฉด๋งŒ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ „ํ™˜๋˜๋Š” ๋ถ€๋“œ๋Ÿฌ์šด ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ํ•ต์‹ฌ ๋„๊ตฌ์ด๋‹ค.

 

 

๐Ÿ”ง ์‹ค์ œ ๋ผ์šฐํŒ… ์ฝ”๋“œ ์˜ˆ์ œ

import React from 'react';
import { BrowserRouter, Routes, Route } from 'react-router-dom';

import MainPage from '@/pages/main/MainPage';
import LoginPage from '@/pages/login/LoginPage';

const App = () => {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<MainPage />} />
        <Route path="/login" element={<LoginPage />} />
      </Routes>
    </BrowserRouter>
  );
};

export default App;

 

1๏ธโƒฃ <BrowserRouter>

๋ธŒ๋ผ์šฐ์ €์˜ ์ฃผ์†Œ(URL)๋ฅผ ๊ฐ์ง€ํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ์ปจํ…Œ์ด๋„ˆ์ด๋‹ค.

์ „์ฒด ์•ฑ์„ ๊ฐ์‹ธ์„œ React Router ๊ธฐ๋Šฅ์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

 

2๏ธโƒฃ <Routes>

์—ฌ๋Ÿฌ ๊ฐœ์˜ <Route> ๋“ค์„ ๊ทธ๋ฃน์œผ๋กœ ๋ฌถ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

3๏ธโƒฃ <Route path="/" element={<MainPage />} />

path="/"๋Š” ๋ฃจํŠธ ๊ฒฝ๋กœ, ์ฆ‰ http://localhost:3000/์— ํ•ด๋‹นํ•˜๋ฉฐ,

element={<MainPage />}๋Š” ํ•ด๋‹น ๊ฒฝ๋กœ์ผ ๋•Œ ๋ณด์—ฌ์ค„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ง€์ •ํ•œ๋‹ค.

 

 

์ฆ‰, ๊ตฌ์กฐ์ ์œผ๋กœ ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

URL ์ฃผ์†Œ ๋ Œ๋”๋ง ๋˜๋Š” ์ปดํฌ๋„ŒํŠธ
/ MainPage
/login LoginPage

 

๋ฐ˜์‘ํ˜•