๐คฎ ์ฝ๋ฉ์ด์ง ์ฝ์นญ ํ๋ก์ ํธ - (2) ๋ผ์ฐํฐ

๋ค์ด๊ฐ๊ธฐ
์ด๋ฒ์ฃผ ์์
๋ชฉํ
- ์ธ๋ถ ๊ฐ๋ฐ๋๊ตฌ ์ค์นํ๊ณ ์ฌ์ฉํ๊ธฐ (npm, import)
- ํ๋ฉด ์ ํํ๊ธฐ (router)
- ๋ชจ๋ฌ ์ด๊ธฐ (modal)
์ํฌํธ = ์นํธํค???
- ๋ฆฌ์กํธ ์ฌ์ฉํ๋ ์ด์
- ํ์ด์ค๋ถ์ด ๋ง์ ๊ณ ๋ฏผํด์ ๊ฐ๋ฐ ์ฝ๊ณ ํธํ๊ณ ๋น ๋ฅด๊ฒ ํ ์ ์๊ฒ ๋์์ฃผ๋ ๋๊ตฌ/๋ฐฉ๋ฒ ๋ชจ์๋
- ๋ฆฌ์กํธ ์ฌ์ฉ ์ปค๋ฎค๋ํฐ ์ปค์ง๋ฉด์ ์คํ์์ค๋ก ๋๊ตฌ/๋ฐฉ๋ฒ์ ๊ธฐ์ฌํ๋ ํ๋ก์ ํธ ๋ง์์ง
- ์ด๊ฒ๋ค์ ์ ๊ฐ์ ธ๋ค ์ฐ๋ฉด ๊ฐ๋ฐ ์ฝ๊ณ ํธํ๊ณ ๋น ๋ฅด๊ฒ ํ ์ ์์
- ๊ฐ์ ธ๋ค ์ฐ๋ ค๋ฉด ์ํฌํธ ํ ์ค ์์์ผํจ.
- ์ํฌํธ๋ ์ธ๋ถ ์์์ ๊ฐ์ ธ๋ค ์ด๋ค๋ ์ด๋ค๋ ์๋ฏธ
๋ผ์ฐํฐ ๊ฐ๋จ ์ดํด
- [ ๋ผ์ฐํฐ = route + er ]์ ์นํ์ด์ง์ ๊ธธ์ ์๋ ค์ฃผ๋ ์น๊ตฌ
- ํ๋ฉด์ ํ์ ํ ์ ์๊ฒ ๋์์ค.
- ์นํ์ด์ง์ ๊ธธ์ ์ ์ฌ๋์('/')๋ก ์ฃผ์๋ฅผ ํ์ํ๋ค.
- ์๋ฅผ ๋ค๋ฉด ์๋ฐ๋๋
- ์น๊ตฌ์ง์ ๊ฐ๋๋ฐ ํ์ฅ์ค์ ๊ฐ๊ณ ์ถ๋ค. -> ์น๊ตฌ์ง์ฃผ์/ํ์ฅ์ค
- ์น๊ตฌ์ง์ ๊ฐ๋๋ฐ ์๋ฆฌ๋ฅผ ํ๊ณ ์ถ๋ค. -> ์น๊ตฌ์ง์ฃผ์/๋ถ์
- ์น ์์์๋ ์ด๋ฐ ๋๋์ผ๋ก ์๋ํ๊ฒ ๋๋ค.
- ๋ก๊ทธ์ธ ๋ฒํผ ํด๋ฆญ
-> ๋ผ์ฐํฐ์๊ฒ ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋ํ๊ณ ์ถ๋ค๊ณ ์ ๋ฌ
-> ๋ผ์ฐํฐ๊ฐ '์นํ์ด์ง์ฃผ์/๋ก๊ทธ์ธ' ํ์ด์ง๋ก ์ด๋์์ผ์ค
- ๋ฉ์ธ ๋ฒํผ ํด๋ฆญ
-> ๋ผ์ฐํฐ์๊ฒ ๋ฉ์ธ ํ์ด์ง๋ก ์ด๋ํ๊ณ ์ถ๋ค๊ณ ์ ๋ฌ
-> ๋ผ์ฐํฐ๊ฐ '์นํ์ด์ง์ฃผ์/๋ฉ์ธ' ํ์ด์ง๋ก ์ด๋์์ผ์ค

ํ์ด์ง๋ฅผ ๋ง๋ค์
- ๊ฐ๋ฐ = ์๊ณ ๋จ์ํ ๋ ๊ณ ๋ธ๋ญ์ ์์์ ํฌ๊ณ ๋ณต์กํ ํ๋ก๊ทธ๋จ ๋ง๋๋ ์์
- ํ๋ก์ ํธ ๋ณต์ก๋์ ๋ฐ๋ผ, ๊ฐ๋ฐํ๋ ์ฌ๋์ ์ทจํฅ์ ๋ฐ๋ผ ์คํฌ๋ฆฝํธ๋ฅผ ํ์ด์ง ํ๋๋ก ์ฌ์ฉํ๋ ์ฌ๋๋ ์๊ณ , ํ์ด์ง๋ผ๋ ๋ธ๋ญ์ ๊ตฌ์ฑํ๋ ์์ ๋จ์ ๋ธ๋ญ์ผ๋ก ์ฌ์ฉํ๋ ์ฌ๋๋ ์์.
- ์ผ๋จ์ ์คํฌ๋ฆฝํธ = ํ์ด์ง๋ก ์๊ฐํ๊ณ ๋ง๋ค์ด๋ณด์. ๋จ์ํ๊ฒ.
- ์คํฌ๋ฆฝํธ๋ฅผ ๋ง๋ค์ด์ฃผ์. srcํด๋ ์์ page ํด๋๋ฅผ ๋ง๋ค๊ณ
- ๊ทธ ์์
page_main.js / page_profile.js / page_contents.js ์ธ๊ฐ ์คํฌ๋ฆฝํธ ๋ง๋ค๊ธฐ~
(์คํฌ๋ฆฝํธ๋ฅผ ์ด๋ค ์์ผ๋ก ๋ช
๋ช
ํ ์ง๋ ์์ ์ด์ง๋ง, ๋๋ ์๋ฐ์์ผ๋ก ๋ถ๋ฅํด์ฃผ๋๊ฑธ ์ ํธํจ.)
app.js๋ฅผ ๊ฐ์ฅ ๋ฐ๋ฐ๋ฅ ํ๋๊ธฐ ๋ฐ์๋๊ณ ์ํฉ์ ๋ฐ๋ผ ์์ ๋ง๋ค์ด ๋์ ๋
์๋ค์ ๋ฎ์๋ค๊ฐ ์น์ ๋ค๊ฐํ๋ ์์ผ๋ก ์ฌ์ฉํ ๊ฑฐ

- ์ฌ์์ฌ๋ = app.js
- ๊ทธ ์์ ๋ฐ๊ฟ์
๋ ์ท๋ค = page_main.js, page_profile.js, page_contents.js
ํ์ด์ง๋ฅผ ์ธํ
ํ์
- ํ์ด์ง๋ฅผ ์ ํํ์ ๋ ์ ์ด๋ ์ด๋ค ํ์ด์ง๋ก ์ด๋ํ๋์ง๋ ํ์ธํด์ผํ๋๊น
- ํ์ด์ง ๊ธฐ๋ณธ์ธํ
์ ํด๋ณด์. ์ฌ๊ธฐ๊ฐ main์ด๊ตฌ๋, profile์ด๊ตฌ๋, contents๊ตฌ๋ ์ ๋๋ ์ ์ ์๊ฒ
- ์๋ ๊ทธ๋ฆผ์ฒ๋ผ ๊ฐ๊ฐ ํ์ด์ง์ ์ ์ฝ๋ ์
๋ ฅํด์ฃผ๋ฉด๋จ.

- export๋ import์ ๋ฐ๋๋ง. ์ ๋ธ๋ญ์กฐ๊ฐ์ ๋ฐ์์ ์ฌ์ฉํ ์ ์๊ฒ ๋ด๋ณด๋ธ๋ค๋ ์๋ฏธ์.
- ์ ํ์๋ฅผ ์ํด์ฃผ๋ฉด ๋ฐ์์ ๊ฐ์ ธ๋ค ์ธ ์ ์์.
- ๋ณดํต ์คํฌ๋ฆฝํธ๋ฅผ ๋ณด๋ฉด ์์ชฝ์ import๊ฐ ์๊ณ , ์ค๊ฐ์ function์ด ์๊ณ , ์๋์ export๊ฐ ์๋๋ฐ
- import๋ก ์ธ๋ถ ๊ฐ๋ฐ๋๊ตฌ/์์์ ๊ฐ์ง๊ณ ์์
- function์์ ๋ ๊ณ ๋ธ๋ญ์ ๋ง๋ ๋ค์
- export๋ก ๋ค๋ฅธ ๋ฐ์ ์ธ์์๊ฒ ๋ฑ์ด์ฃผ๋
- ์๋ฌํ ๋ก์ง์ด ๋ด๊ธด ๊ตฌ์กฐ์ด๋ค. ์์ ๋ฐ๋๋ฉด ์ค๋ฅํฐ์ง ใ
ใ
- ์ด์ผ๋ณด๋ฉด ๋๋๊ณค๋ณผ ํธ์ดํฌ์ด ์บก์๊ฐ์ ๋๋? ์บก์์ ๋์ง๋ฉด ์ปดํฌ๋ํธ๊ฐ ํ์ด๋์จ๋ค๋ ์ ์์~~

๋ผ์ฐํฐ๋ฅผ ์ค์นํ์
- ๋ผ์ฐํฐ๋ฅผ ์ฐ๋ ค๋ฉด ๋จผ์ ๋ผ์ฐํฐ๋ผ๋ ์ธ๋ถ์์์ ํ๋ก์ ํธ์ ์ค์นํด์ผํจ.
- ์ธ๋ถ ๊ฐ๋ฐ๋๊ตฌ ์ค์นํ ๋ npm์ด๋ผ๋ ํจํค์ง ๋งค๋์ ๋ฅผ ์ฌ์ฉํด์ผํ๋ค๋๊ฑด 1ํ์ฐจ์์ ์๋ ค์คฌ์.
- vs code ํฐ๋ฏธ๋ ์ด๊ณ ,
npm install react-router-dom ์
๋ ฅํด์ ๋ผ์ฐํฐ ์ค์นํ๊ธฐ

๋ผ์ฐํฐ๋ฅผ ์ํฌํธํ์
- ์ด์ ์ค๋น๊ฐ ๋ค ๋์์ผ๋ ๋ผ์ฐํฐ๋ฅผ ์ ์ฉํด๋ณด์.
- ์ฐ๋ฆฌ ์น ์ดํ๋ฆฌ์ผ์ด์
์ ๊ฐ์ฅ ๋ฐ๋ฐ๋ฅ์ด ๋ index.js, app.js๋ฅผ ์ด์
- ์๋จ์ ๊ฐ๊ฐ ์๊ฒ์ ์
๋ ฅ
- index.js
=> import { BrowserRouter } from "react-router-dom";
- app.js
=> import { NavLink, Routes, Route } from "react-router-dom";
- ๋ผ์ฐํฐ์ ์ฌ์ฉํ๋ ๋๊ตฌ๋ค์ ๋ถ๋ฌ์ค๋ ์ฝ๋. ์ด๊ฒ๋ค์ด ๋ญ์ง๋ ๊ฑ ์ฐ๋ฉด์ ์์๋ณด์.
๋ผ์ฐํฐ ๊ธฐ๋ณธ์ธํ
: BrowserRouter
- BrowserRouter๋ ํ๋ก์ ํธ์ ๊ฐ์ฅ ์์ ๋ธ๋ญ์ ๊ฐ์ธ์ฃผ๋๋ฐ ์ฌ์ฉํ๋ค.
- ๊ฑ ๊ธฐ๋ณธ ์ธํ
์ด๋ผ๊ณ ์๊ฐํ๊ณ ์จ๋ณด์.
- index.js
=> <BrowserRouter><App/></BrowserRouter>
- ์๋ก์ฝ๋กฌ App.js๋ฅผ ๊ฐ์ธ์ค๋ค.
๊ธธ์๋ด๋ฅผ ์์ฒญํ์ : NavLink
- NavLink๋ ๋ด๊ฐ ์ด๋ํ๊ณ ์ถ์ ๊ณณ์ ๋ผ์ฐํฐ์ ์ ๋ฌํ๋๋ฐ ์ฌ์ฉํ๋ค.
- ๋ฒํผ์ ๋๋ฅด๋ ํ์ = ๋ผ์ฐํฐ์๊ฒ ๋ด๊ฐ ๊ฐ๊ณ ์ถ์ ๊ณณ์ ์๋ ค์ฃผ๋ ํ์
- ์ฌ์ฉ๋ฒ์ ๊ฐ๋จ. ๋ฒํผ์ NavLink๋ก ๊ฐ์ธ์ฃผ๋ฉด ๋๋ค.
- app.js
=> <NavLink to="/main"><button>๋ฉ์ธ ํ์ด์ง๋ก ์ด๋</button></NavLink>
- ๋ฒํผ์ ๋๋ฅด๊ฒ ๋๋ฉด to์ ์ค์ ๋ ์ฃผ์๋ก ์ด๋ํด๋ฌ๋ผ๊ณ ๋ผ์ฐํฐ์๊ฒ ๋งํ๊ฒ ๋๋ค.
- profile, contents ํ์ด์ง ๋ฒํผ๋ ๋ง๋ค์ด๋ด๋ผ.
- NavLink๋ฅผ ๋๋ฅด๋ฉด ์ฃผ์์ฐฝ์ด ๋ค์๊ณผ ๊ฐ์ด ๋ณํ ๊ฒ์ด๋น.

๊ธธ์๋ด๋ฅผ ํด์ฃผ์ : Routes, Route
- ์ด์ ๋ ์ฐ๋ฆฌ์ ์์ฒญ์ ๋ค์ด์ค ๋ผ์ฐํฐ๋ฅผ ์ธํ
ํด์ค์ผ ํ๋ค.
- ๋ผ์ฐํฐ์๊ฒ ๊ธธ์ ์๋ ค์ค์ผ ๋ผ์ฐํฐ๊ฐ ์ฐ๋ฆฌ์ ์์ฒญ์ ๋ค์ด์ค ์ ์์ผ๋.
- app.js
=> <Routes><Route path="/main" element={<PageMain/>}/></Routes>
- Routes๋ ์์ฒญ์ ๋ฐ๋ผ ์ํ๋ ๊ธธ ์๋ด์ ์ฐ๊ฒฐํด์ฃผ๋ ์ญํ ์ ๋งก๋๋ค.
- ๊ทธ๋ฌ๋ Route๋ฅผ
<Routes></Routes>๋ก ๊ฐ์ธ์ฃผ์.
- Route๋ ๊ธธ ์๋ด๋ฅผ ์ค์ ํ๋ ์ญํ ์ ๋งก๋๋ค.
/main์ด๋ผ๋ ์ฃผ์๋ก ๊ฐ๊ณ ์ถ๋ค๋ ์์ฒญ์ด ๋ค์ด์ค๋ฉด <PageMain/>์ผ๋ก ์๋ดํด์ค๋ค.
- Routes์์ ์ถ๊ฐ์ ์ผ๋ก profile๊ณผ contents๋ก ์๋ดํ๋ Route๋ค์ ๋ง๋ค์ด๋ด๋ผ.
- ๋ค ๋ง๋ ๋ค NavLink๋ฅผ ๋๋ฅด๋ฉด ํ๋ฉด์ด ๋ค์๊ณผ ๊ฐ์ด ๋ณํ ๊ฒ์ด๋น.

๋ชจ๋ฌ
๋ชจ๋ฌ ๊ฐ๋จ ์ดํด
- ์ด๋ฐ๊ฒ ๋ชจ๋ฌ์ฐฝ์ด๋ค. (์๋ gif์ฐธ๊ณ )
- ํ์
์ฐฝ๊ณผ ๋ชจ๋ฌ์ฐฝ์ ์ฐจ์ด๋
- ํ์
์ฐฝ์ ์๋ก์ด ์๋์ฐ๋ฅผ ์ด์ด์ ์์ฐฝ์ ๋ณด์ฌ์ฃผ๋๊ฑฐ๊ณ
- ๋ชจ๋ฌ์ฐฝ์ ํ๋์ ์๋์ฐ์์ ์์ฐฝ์ฒ๋ผ ๋ณด์ฌ์ฃผ๋๊ฑฐ
- ๋ฒํผ ๋๋ฅด๋ฉด ๋ชจ๋ฌ์ฐฝ ํ๋ ์ด๋ฆฌ๋ ๊ธฐ๋ฅ ๊ตฌํํด๋ณด์
๋ชจ๋ฌ ์ค์นํ๊ณ ์ํฌํธํ๊ธฐ
- vs code ํฐ๋ฏธ๋์์
npm install react-modal ์
๋ ฅํด์ ์ค์น
- ๋ฐ๋ก ์ํฌํธ๊น์ง
- app.js
=> import Modal from 'react-modal';
๋ชจ๋ฌ ๋ง๋ค๊ธฐ
- ์ ๋นํ ๊ณณ์ ์ ์ฝ๋ ์
๋ ฅ
<Modal isOpen={true}>์ด๊ฑฐ๋ ๋ชจ๋ฌ์ด๋ค</Modal>
- ๊ทธ๋ฌ๋ฉด ๋ชจ๋ฌ์ด ๋ง๋ค์ด์ง๋๋ฐ, ๋์น ๋น ๋ฅด๋ฉด ๋๋ต ๊ฐ ์ก์๊ฒ ์ง๋ง, isOpen์ผ๋ก ๋ชจ๋ฌ ์ด๊ณ ๋ซ๊ณ ์ค์ ํ ์ ์๋ค.
(๋น๋ถ๊ฐ ๋์์ธ์ ๊ฐ๋ ์ค๋ฒ๋ ค... ๋ชจ๋๋ก ๊ฐ๋น ใ
ใ
ใ
ใ
)

- ๋ชจ๋ฌ ์ด๊ณ ๋ซ์ผ๋ ค๋ฉด ๋ฐ์ดํฐ(state) ๊ฑด๋๋ ค์ผํจ.
- ๋ค์์๊ฐ์ state ๋ฐฐ์ฐ๋ฉด์ ๋ชจ๋ฌ ๋๊ณ ์ผ๊ธฐ ๊ตฌํํด๋ณด์. ์ด๋ฒ์ฃผ๋ ์ฌ๊ธฐ๊น์ง
๋๊ฐ๊ธฐ
- ์ด๋ ๊ฒ ์ฐจ๊ณก์ฐจ๊ณก ํ๋ก์ ํธ๊ฐ ๋น๋ฉ๋๋ ๊ณผ์ ์ ํจ๊ป ๋ฐ์ผ๋ฉด
- ํ์ํ ๋ ํ์ํ๊ฑธ ์๋ ค์ฃผ๋ฉด์ ๋ฐฐ์ธ ์ ์์.
- ์์ฐ์ค๋ฝ๊ฒ ํ์ํ์ง ์์๊ฑด ์ ์๋ ค์ค ์ ์์.
- ๊ฝค ์ข์ ๋ฐฉ๋ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค.
- ๋ค๋ง ๋น๋ฉํ๋ ๊ณผ์ ์์ ๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ๋ค์ด ์ ๋ฌ๋๊ธฐ ์ ๊น์ง๋ ์๋๊ฐ ๊ฝค ๊ฑธ๋ฆฐ๋ค ใ
ใ
ใ
- ์ง์ง ์ ๋ฌํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ * 5 = ์ ๋ฆฌํ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ...
- ๊ทธ๋ผ์๋ ์ธ์ ๊ฐ ๋์์ด ๋๊ฒ ์ง ํ๋ฉฐ ์ ๋ฆฌ๋ฅผ
~~~
- ์ ๊ทธ๋ฆฌ๊ณ . ๋ญ๊ฐ๋ฅผ ํ๋ ๋ฐฉ๋ฒ์ ์๋ ค์ฃผ๋๊ฑฐ๋ ์๋ฏธ ์๋ค.
- ๋ญ๋ฅผ ํ ์ ์๋์ง๋ฅผ ์๋ ค์ฃผ๊ณ , ๊ทธ ๋ฐฉ๋ฒ์ ์ค์ค๋ก ์ฐพ๋ ๋ฐฉ๋ฒ์ ์๋ ค์ค์ผ ํ๋ค.
