๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
TIL -์ผ๊ฐ„ํ•™์Šต๊ธฐ๋ก/React

4W_JS_React Route

by ___Jin 2021. 12. 3.

์‹œ๊ฐ„์ด ์ง„์งœ ์™œ์ด๋ ‡๊ฒŒ ๋นจ๋ฆฌ๊ฐ€๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ๋‹ค.

๋ฉ”์„œ๋“œ ๊ณต๋ถ€ํ•˜๋‹ค ๊ฐ‘์ž๊ธฐ ๋ฆฌ์•กํŠธ๋กœ ๋Œ์•„์˜จ ๋ธ”๋กœ๊ทธ..

๊ทธ์‚ฌ์ด์— ๊ต‰์žฅํžˆ ๋งŽ์€ ํ•™์Šต์ด ์ด๋ฃจ์–ด์กŒ์ง€๋งŒ, ์–ด์ œ ์˜ค๋Š˜ ๋ฆฌ์•กํŠธ ์ˆ˜์—…๋“ฃ๊ณ  ๊นจ๋‹ฌ์•˜๋‹ค.

 

"..์•„! ์—ฌ๊ธฐ๊นŒ์ง€ ์˜จ๊ฒƒ์€ ๋‹ค ๋ฆฌ์•กํŠธ ๋ฐฐ์šฐ๋ ค๊ณ  ์˜จ๊ฑฐ๊ตฌ๋‚˜!! "

 

๊ทธ๋ž˜์„œ ๋งˆ์Œ์ด ํŽธํ•ด์กŒ๋‹ค. ๋’ค๋กœ ๊ตฌ๋ฅด๋“  ์˜†์œผ๋กœ ๊ตฌ๋ฅด๋“  ์–ด์จ‹๋“  ํ”„๋ก ํŠธ์—”๋“œ์˜ ๊ฝƒ, ๋ฆฌ์•กํŠธ๋งŒ ์ž˜ํ•ด๋„ ๋ฐ˜์€๊ฐ€๊ฒ ๊ตฌ๋‚˜..!

(๋ฌผ๋ก  ๋ฆฌ์•กํŠธ ์ž˜ํ•˜๋ ค๋ฉด ์•ž์— ๋ฐฐ์šด๊ฑฐ ๋‹ค์ž˜ํ•ด์•ผํ•จ)

 

์—ฌํ•˜ํŠผ ์–ด์ œ์˜ ๊ธฐ๋ณธ๋ฌธ๋ฒ•์— ์ด์–ด ์˜ค๋Š˜์€ ๋ผ์šฐํ„ฐ๋ฅผ ๊ณต๋ถ€ํ–ˆ๊ณ ,

 

๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ์˜ ์ฃผ์š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐฐ์šด๊ฒƒ ์œ„์ฃผ๋กœ ์ •๋ฆฌํ•ด๋ณด๋ คํ•œ๋‹ค.

 

๋จผ์ € ๋ผ์šฐํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์ „์— ๋ผ์šฐํ„ฐ ๋ชจ๋“ˆ์ด ๋“ค์–ด์žˆ๋Š” ๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ ๋”์„ ์„ค์น˜ํ•˜์—ฌ์•ผํ•œ๋‹ค.<์ž‘์—… ํŒŒ์ผ ์—ด์–ด์„œ ํ„ฐ๋ฏธ๋„์—>

npm install react-router-dom@5.3.0

์šฐ๋ฆฌ๋Š” ๋ฒ„์ „ 5.3.0์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ์ตœ์‹ ๋ฒ„์ „ ๋ฐ›์€ ๋™๊ธฐ ๋ง๋กœ๋Š” ๋ฌธ๋ฒ•์ด ์กฐ๊ธˆ ๋‹ฌ๋ผ์ง€๋Š”๊ฑฐ ๊ฐ™์•„์„œ ๋‹ค์‹œ ๋‹ค์šด๊ทธ๋ ˆ์ด๋“œ ํ•˜๊ณ ์™”๋‹ค๊ณ ํ•œ๋‹ค.

(์šฐ๋ฆฌ๋Š” ์ฝ”๋“œ์Šคํ…Œ์ด์ธ  ํ…Œ์ŠคํŠธ ํ†ต๊ณผํ•ด์•ผํ•จ ใ…‹ใ…‹)

 

์„ค์น˜ํ›„ Package.Json ํŒŒ์ผ๊ฐ€๋ฉด ์›ํ•˜๋Š” ๋ฒ„์ „์œผ๋กœ ์„ค์น˜ํ•œ๊ฒƒ ํ™•์ธ๊ฐ€๋Šฅํ•จ.

 

์ด์ œ ๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ ๋”์—์„œ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•  ๋ชจ๋“ˆ์„ ๊ตฌ์กฐ๋ถ„ํ•ด ํ• ๋‹นํ•ด์„œ ๊ฐ€์ ธ์˜จ๋‹ค.( ๋ณ„๊ฑฐ์•„๋‹ˆ๊ณ  {์ค‘๊ด„ํ˜ธ ์•ˆ์— ์“ธ๊ฑฐ ์ ๊ธฐ^^})

๋”์•ˆ์˜ ๋ชจ๋“  ๋ชจ๋“ˆ์„ ๋‹ค ์“ฐ์ง€์•Š๊ธฐ ๋•Œ๋ฌธ์—  ํ•„์š”ํ•œ๊ฒƒ ์™์™ ๊ฐ€์ ธ์˜ค๊ธฐ

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

import๋’ค์—๋Š” (์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์–ธ์–ด๋ฅผ ์ป๊ธฐ๋•Œ๋ฌธ์— ์ค‘๊ด„ํ˜ธ์— ๋„ฃ์–ด์„œ) ์‚ฌ์šฉ๋ชจ๋“ˆ ์ ์–ด์ฃผ๊ณ  from ๋’ค์—๋Š” ์–ด๋””์„œ ๊ฐ€์ ธ์˜ฌ๊ฑด์ง€

'์ด์•ˆ์— '; ์ ์–ด์ฃผ๋ฉด๋œ๋‹ค. 

import React from 'react';
import './App.css';
import {BrowserRouter, Route, Switch} from 'react-router-dom';
import Sidebar from './Sidebar';
import Tweets from './Pages/Tweets';
import MyPage from './Pages/MyPage';
import About from './Pages/About';

๋น„์Šทํ•œ ์˜ˆ๋กœ ์ž‘์—…ํ•  ํŒŒ์ผ์•ˆ์— ๋Œ๊ณ ์™€์•ผํ•  ๋‹ค๋ฅธ ํŒŒ์ผ๋“ค์ด ์žˆ๋‹ค๋ฉด

import ํŒŒ์ผ๋ช… from './๊ฐ€์ ธ์˜ฌ๊ณณ'; ํ•˜๋ฉด๋œ๋‹ค. (๋Œ€์†Œ๋ฌธ์ž ์œ ์˜ํ•˜์ž^^ <-๊ณ ์ƒํ•จ)

 

์ž ์ด์ œ ํ™”๋ คํ•œ ํƒœ๊ทธ๋“ค์ด ๊ฒฝ๋กœ ์ง€์ •ํ• ๊ฒƒ๋“ค์„ ๊ฐ์‹ธ์•ผํ•จ 

const App = () => {
  return (
    <BrowserRouter> 
      <div className="App">
        <main>
          <Sidebar />
          <section className="features">
            <Switch>  //์ด๊ฒŒ ์—†์œผ๋ฉด ๋ฃจํŠธ๋กœ ๋ถˆ๋Ÿฌ์˜จ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—ฐ๊ฒฐ๋˜์–ด ๋ณด์—ฌ์ง.
              <Route exact path = "/"> //path์†์„ฑ์œผ๋กœ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด์ค€๋‹ค.
              	<Tweets/>  //๋ถˆ๋Ÿฌ์˜ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.
              </Route>
              <Route path = "/about">
              	<About/>
              </Route>
              <Route path = "/mypage">
              	<MyPage/>
              </Route>
            </Switch>
          </section>
        </main>
      </div>
    </BrowserRouter>  
  );
};

๋ณด๋ฉด ๋งจ์œ—์ค„ ์•ฑ์ด๋ผ๋Š” ์ปจํฌ๋„ŒํŠธ์•ˆ์— <BrowserRouter></BrowserRouter> ๋กœ ์‹น๋‹ค ๊ฐ์‹ธ๊ณ 

(์ปจํฌ๋„ŒํŠธ์•ˆ์— ํƒœ๊ทธ๋Š” ๋”ฑํ•˜๋‚˜ ๋ฐ‘์— ๋‹ค๋“ค์–ด๊ฐ€์•ผํ•จ. ๋‘˜์ด ๋ ์ˆœ์—†์–ด~)

 

์ค‘๊ฐ„๋ถ€๋ถ„ <Switch></Switch> ์•ˆ์— <Route></Route>

๋ฃจํŠธ์˜ ์†์„ฑ path(๋ฃจํŠธํƒœ๊ทธ ์•ˆ์— ์ ์Œ ์•„๊นŒ import๋•Œ ์ฃผ์†Œ์ ์€๊ฑฐ์ฒ˜๋Ÿผ ์ฃผ์†Œ์™€ํ•จ๊ป˜ ) ๊นŒ์ง€ ํ•œ์„ธํŠธ๋กœ!! 

 

๋ฃจํŠธ์•ˆ์—<MyPage/> (๋ถˆ๋Ÿฌ์˜ค๋Š” ์ปดํฌ๋„ŒํŠธ)๊นŒ์ง€ ์ ์–ด์ฃผ๋ฉด ๋‹ค๋ซ๋‹ต.

***์—ฌ๊ธฐ๊นŒ์ง€ ์ง„์งœ ๋Œ€์†Œ๋ฌธ์ž ๋น„์ƒ์ด์˜€์Œ***

 

import { Link } from 'react-router-dom';

const Sidebar = () => {
  return (
    <section className="sidebar">
        <Link to = "/"> <i className="far fa-comment-dots"></i> </Link>
        <Link to = "/about"><i className="far fa-question-circle"></i></Link>
        <Link to = "/mypage"><i className="far fa-user"></i></Link>
    </section>
  );
};

path๋ฅผ ํ†ตํ•ด ์ฃผ์†Œ๋ฅผ ๋งŒ๋“ค์—ˆ๊ธฐ ๋•Œ๋ฌธ์—

์—ฌ๊ธฐ์„œ๋Š” ๋งํฌ ๋ชจ๋“ˆ๋กœ ์•„์ด์ฝ˜์„ ๋ˆ„๋ฅด๋ฉด ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ๋ฒ•์„ ๋ด…์‹œ๋‹ค.

 

์ผ๋‹จ, ๋งํฌ์“ธ๊ฑฐ๋‹ˆ๊นŒ import๋กœ ๋งํฌ๊ฐ€์ ธ์˜ค์ž.

๋ณด๊ธฐ์™€๊ฐ™์ด ๋‘๋ฒˆ์งธ์ค„์„ ๋ณด๋ฉด ์ด๊ณณ์€ ์‚ฌ์ด๋“œ๋ฐ” ์ปจํฌ๋„ŒํŠธ์ด๊ณ  

์‚ฌ์ด๋“œ๋ฐ”์•ˆ์— ์•„์ด์ฝ˜์ด 3๊ฐœ๊ฐ€ <i></i>์žˆ๋‹ค๋Š”๊ฒƒ์„ ์•Œ์ˆ˜์žˆ๋‹ค.

 

์•„์ด์ฝ˜ ํ•˜๋‚˜๋งˆ๋‹ค ๋งํฌ๋กœ ๊ฐ์‹ธ๊ณ  to = "" ์จ์„œ ์–ด๋””๋กœ ๊ฐ€๊ณ ์‹ถ์€์ง€ ์ •ํ•ด์ฃผ์ž

<Link to = "/about"><i className="์•„์ด์ฝ˜์ฃผ์†Œ?"></i></Link>
 
์—ฌ๊ธฐ๊นŒ์ง€ํ•˜๋ฉด ๋‚˜๋Š” ๊ฐ๊ฐ์˜ ํŒŒ์ผ์— ์ €์žฅ๋˜์–ด์žˆ๋Š” ์ปจํฌ๋„ŒํŠธ๋ฅผ
app.js์—์„œ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•˜์—ฌ ์–ด๋–ค ์ปจํฌ๋„ŒํŠธ๋กœ ์ด๋™ํ• ๊ฒƒ์ธ์ง€ ์ •ํ•ด์ฃผ์—ˆ๊ณ ,
 
๋งํฌํƒœ๊ทธ๋ฅผ ์ด์šฉํ•ด ๋ฏธ๋ฆฌ์ง€์ •๋œ ๊ฒฝ๋กœ(์ฃผ์†Œ)๋กœ ์ด๋™ํ• ์ˆ˜์žˆ๋Š” ์žฅ์น˜๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.
 
๋งˆ ๋ฆฌ์•กํŠธ ๋ณ„๊ฑฐ์•„์ด๋„ค!(์ ์‹ฌ๋•Œ์ฏค์—” ์šธ๊ณ ์‹ถ์—ˆ์Œ..
 
์—ญ์‹œ ์ฒจ์— ๋ณด๋ฉด ํ•˜๋‚˜๋„ ๋ชจ๋ฅด๊ฒ ๋Š”๋ฐ ๋ณด๋‹ค๋ณด๋‹ˆ ์กฐ์˜ค๊ธˆ ์•Œ๊ฒ ๋‹ค. ์ž์ฃผ๋ณด๋ฉด ๋” ๋งŽ์ด ์•Œ๊ฒ ์ง€!!
์˜ค๋Š˜ ๊ณต๋ถ€ ์ •๋ฆฌ ๋— ~~ 

 

๋Œ“๊ธ€