๐ API ์ฐ๋์ ๊ธฐ๋ณธ
โ API๋ฅผ ์ฐ๋ํ๊ธฐ ์ํด์ ์ํ๋ก์ ํธ ์์ฑ
โ API๋ฅผ ํธ์ถํ๊ธฐ ์ํด์ axios ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
- REST API ๋ฉ์๋
๋ฉ์๋ | ์๋ฏธ |
GET | ๋ฐ์ดํฐ ์กฐํ |
POST | ๋ฐ์ดํฐ ๋ฑ๋ก |
PUT | ๋ฐ์ดํฐ ์์ |
DELETE | ๋ฐ์ดํฐ ์ ๊ฑฐ |
- useState์ useEffect๋ก ๋ฐ์ดํฐ ๋ก๋ฉํ๊ธฐ
useState๋ฅผ ์ฌ์ฉํ์ฌ ์์ฒญ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ , useEffect๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง๋๋ ์์ ์ ์์ฒญํด๋ณด๊ฒ ์.
๋จ, ์์ฒญ์ ๋ํ ์ํ๋ฅผ ๊ด๋ฆฌํ ๋
์์ฒญ์ ๊ฒฐ๊ณผ
๋ก๋ฉ ์ํ
์๋ฌ
๊ด๋ฆฌํด์ค์ผํจ.
Users.js
App.js
์คํ ๊ฒฐ๊ณผ
===================== ๋ฒํผ์ ๋๋ฌ์ API ์ฌ์์ฒญํ๊ธฐ =====================
๋ฒํผ์ ๋๋ฌ์ API๋ฅผ ์ฌ์์ฒญํ๋ ๊ธฐ๋ฅ์ ๊ตฌํํด๋ณด๊ฒ ์. ์ด๋ฅผ ์ํด์ fetchUsers ํจ์๋ฅผ ๋ฐ๊นฅ์ผ๋ก ๊บผ๋ด์ฃผ๊ณ , ๋ฒํผ์ ๋ง๋ค์ด ํด๋น ํจ์๋ฅผ ์ฐ๊ฒฐํด์ค ๊ฑฐ์.
Users.js
์คํ ๊ฒฐ๊ณผ
"๋ค์ ๋ถ๋ฌ์ค๊ธฐ" ๋ฒํผ์ด ์๊ฒผ์ !!!!!
๐ React Router v6 ํํ ๋ฆฌ์ผ
๐ก ๋ผ์ฐํ ์ด๋?
์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ผ์ฐํ ์ด๋ ์ฌ์ฉ์๊ฐ ์์ฒญํ URL์ ๋ฐ๋ผ ์๋ง๋ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ์๋ฏธํจ.
์ฝ๊ฒ ๋งํด์ ๋ธ๋ก๊ทธ ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ฑ์ ๋ณด๋ฉด "๊ธ์ฐ๊ธฐ ํ์ด์ง/ ํฌ์คํธ ๋ชฉ๋ก ํ์ด์ง/ ํฌ์คํธ ์ฝ๊ธฐ ํ์ด์ง" ๋ฑ์ ์ฌ๋ฌ ํ์ด์ง๋ก ๊ตฌ์ฑ๋ ๊ฒ์ ๋ณผ ์ ์์.
์ด๋ ๊ฒ ์ฌ๋ฌ ํ์ด์ง๋ก ๊ตฌ์ฑ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ๋ ํ์ด์ง๋ณ๋ก ์ปดํฌ๋ํธ๋ค์ ๋ถ๋ฆฌํด๊ฐ๋ฉด์ ํ๋ก์ ํธ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ํ์ํ ๊ฒ์ด ๋ผ์ฐํ ์์คํ ์ด๋ค.
๋ฆฌ์กํธ์์ ๋ผ์ฐํธ ์์คํ ์ ๊ตฌ์ถํ๊ธฐ ์ํด ๋ฆฌ์กํธ ๋ผ์ฐํฐ(React Router)๋ Next.js๋ฅผ ์ฌ์ฉํ ์ ์์.
- ๋ฆฌ์กํธ ๋ผ์ฐํฐ > ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ผ๋ก ๋ผ์ฐํ ์์คํ ์ ์ค์ ํ ์ ์์
- Next.js > Create React App์ฒ๋ผ ๋ฆฌ์กํธ ํ๋ก์ ํธ ์ค์ , ๋ผ์ฐํ ์์คํ , ์ต์ ํ, ๋ค๊ตญ์ด ์์คํ ์ง์, ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง ๋ฑ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํ๋ ์์ํฌ์. ํ์ผ ๊ฒฝ๋ก ๊ธฐ๋ฐ์ผ๋ก ์์ฑํ๊ณ ๋ฆฌ์กํธ ๋ผ์ฐํฐ ๋์์ผ๋ก ๋ง์ด ์ฌ์ฉ๋จ.
๊ทผ๋ฐ ์๋ฃ์์ ๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํ๋ค๋๊น ๋๋ ๋ฆฌ์กํธ ๋ผ์ฐํฐ ์ฌ์ฉํ ๊ฑฐ์
๐ก์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ์ด๋?
ํ ๊ฐ์ ํ์ด์ง๋ก ์ด๋ฃจ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ์.
์๊น ๋ถ๋ช ๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ํ์ด์ง๋ก ๊ตฌ์ฑ๋ ํ๋ก์ ํธ๋ฅผ ๋ง๋ค ์ ์๋ค๊ณ ํ์๋๋ฐ, ์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐฐ์ฐ๋์ง ์ดํด์ํค๊ธฐ ์ํด ๋ฉํฐ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์๋ ๋ฐฉ์๋ถํฐ ์ดํด๋ณด๊ฒ ์.
๋ฉํฐ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ ๋๋ง๋ค ์๋ก์ด html์ ๋ฐ์์ค๊ณ , ํ์ด์ง๋ฅผ ๋ก๋ฉํ ๋๋ง๋ค ์๋ฒ์์ CSS, JS, ์ด๋ฏธ์ง ํ์ผ ๋ฑ์ ๋ฆฌ์์ค๋ฅผ ์ ๋ฌ ๋ฐ์ ๋ธ๋ผ์ฐ์ ํ๋ฉด์ ๋ณด์ฌ์คฌ์. ๊ฐ ํ์ด์ง๋ง๋ค ๋ค๋ฅธ html ํ์ผ์ ๋ง๋ค์ด์ ์ ๊ณตํ๊ฑฐ๋, ๋ฐ์ดํฐ์ ๋ฐ๋ผ ์ ๋์ ์ธ html์ ์์ฑํด์ฃผ๋ ํ ํ๋ฆฟ ์์ง์ ์ฌ์ฉํ๊ธฐ๋ ํ์.
BUT
์ฌ์ฉ์ ์ธํฐ๋์ ์ด ๋ณ๋ก ์๋ ์ ์ ์ธ ํ์ด์ง๋ค์ ์ ๋ฐฉ์์ด ใฑใ ์๋ฐ, ์ฌ์ฉ์ ์ธํฐ๋์ ์ด ๋ง๊ณ ๋ค์ํ ์ ๋ณด๋ฅผ ์ ๊ณตํด์ผํ๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ค์ ์ด ๋ฐฉ์์ด ์ข์ง๊ฐ ์์. ์ฆ ์๋ก์ด ํ์ด์ง๋ฅผ ๋ณด์ฌ์ค์ผํ ๋๋ง๋ค ์๋ฒ ์ธก์์ ๋ชจ๋ ์ค๋น๋ฅผ ํด์ผํ๋๋ฐ, ๊ทธ๊ฑธ ์๋ฒ๋ ํธ๋ํฝ์ด ๊ฐ๋นํ๊ธฐ ์ด๋ ต๊ธฐ ๋๋ฌธ์.
๊ทธ๋์ ..!!!
๋ฆฌ์กํธ์์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํด์ ๋ทฐ ๋ ๋๋ง์ ์ฌ์ฉ์ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ด๋นํ๊ณ , ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ธ๋ผ์ฐ์ ์ ๋ถ๋ฌ์ ์คํ์ํค๊ณ ์ฌ์ฉ์์์ ์ธํฐ๋์ ์ด ๋ฐ์ํ๋ฉด ํ์ํ ๋ถ๋ถ๋ง js๋ฅผ ์ฌ์ฉํด์ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ์์ผ๋ก ๋ฐ๊พธ๊ฒ ๋จ.
์ฆ, ์๋ก์ด ๋ฐ์ดํฐ๊ฐ ํ์ํ๋ฉด ์๋ฒ API๋ฅผ ํธ์ถํ์ฌ ํ์ํ ๋ฐ์ดํฐ๋ง ์๋ก ๋ถ๋ฌ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉํ ์ ์๊ฒ๋์.
๊ทธ๋ฆฌ๊ณ html์ ํ๋ฒ๋ง ๋ฐ์์์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํ์ํจ ํ, ํ์ํ ๋ฐ์ดํฐ๋ง ๋ฐ์์์ ํ๋ฉด์ ์ ๋ฐ์ดํธ ํด์ฃผ๋ ๊ฒ์ด ์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ ์.
๐ก๋ฆฌ์กํธ ๋ผ์ฐํฐ ์ ์ฉ ๋ฐ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
โ ํ๋ก์ ํธ ์์ฑ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
๋ฆฌ์กํธ ํ๋ก์ ํธ๋ฅผ ์๋ก ์์ฑํ ํ, ํด๋น ํ๋ก์ ํธ ๋๋ ํฐ๋ฆฌ๋ก ์ด๋ํ์ฌ ๋ฆฌ์กํธ ๋ผ์ฐํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น
โ ํ๋ก์ ํธ์ ๋ผ์ฐํฐ ์ ์ฉ
src/index.js ํ์ผ์ react-router-dom์ ๋ด์ฅ๋์ด์๋ BrowserRouter ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํด์ค ๊ฑฐ์.
์ด ์ปดํฌ๋ํธ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ํ์ด์ง๋ฅผ ์๋ก ๋ถ๋ฌ์ค์ง์๊ณ ์ฃผ์๋ฅผ ๋ณ๊ฒฝํ๊ณ , ํ์ฌ ์ฃผ์์ ๊ฒฝ๋ก์ ๊ด๋ จ๋ ์ ๋ณด๋ฅผ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค.
src/index.js
๋ผ๊ณ ์๋ฃ์๋ ๋์์์ง๋ง ์ ๋ ๊ฒ ํ๋๊น ๋ฒ์ ํธํ์ฑ ๋ฌธ์ ?๊ฐ ๋ฐ์ํ์ฌ ์ฝ๋ ๋ฐ๊ฟ์คฌ์
โ ํ์ด์ง ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ
๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ฅผ ํตํด ์ฌ๋ฌ ํ์ด์ง๋ก ๊ตฌ์ฑ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ธฐ ์ํด ๊ฐ ํ์ด์ง์์ ์ฌ์ฉํ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค ๊ฑฐ์. ์ฌ์ฉ์๊ฐ ์น ์ฌ์ดํธ์ ๋ค์ด์ค๊ฒ ๋์ ๋ ๊ฐ์ฅ ๋จผ์ ๋ณด์ฌ์ง๊ฒ ๋ Home ํ์ด์ง ์ปดํฌ๋ํธ์ ์น ์ฌ์ดํธ๋ฅผ ์๊ฐํ๋ About ํ์ด์ง ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด๋ณด๊ฒ ์ !!
src/pages/Home.js
src/pages/About.js
โ Route ์ปดํฌ๋ํธ๋ก ํน์ ๊ฒฝ๋ก์ ์ํ๋ ์ปดํฌ๋ํธ ๋ณด์ฌ์ฃผ๊ธฐ
src/App.js
์คํ ๊ฒฐ๊ณผ
yarn start๋ฅผ ์ ๋ ฅํ์ฌ ์คํ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํด๋ณด๋ฉด
โ Link ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ๋ ๋งํฌ ๋ณด์ฌ์ฃผ๊ธฐ
src/pages/Home.js
์คํ ๊ฒฐ๊ณผ
โ URL ํ๋ผ๋ฏธํฐ์ ์ฟผ๋ฆฌ์คํธ๋ง
URL ํ๋ผ๋ฏธํฐ๋ ์ฃผ์์ ๊ฒฝ๋ก์ ์ ๋์ ์ธ ๊ฐ์ ๋ฃ๋ ํํ๊ณ , ์ฟผ๋ฆฌ ์คํธ๋ง์ ์ฃผ์์ ๋ท๋ถ๋ถ์ "?" ์ดํ์ key=value๋ก ๊ฐ์ ์ ์ํ๋ฉฐ &๋ก ๊ตฌ๋ถํจ.
- URL ํ๋ผ๋ฏธํฐ ์์: /profile/velopert
- ์ฟผ๋ฆฌ์คํธ๋ง ์์: /articles?**page=1&keyword=react
โ URL ํ๋ผ๋ฏธํฐ
src/pages/Profile.js
src/App.js
src/pages/Home.js
์คํ ๊ฒฐ๊ณผ
โ ์ฟผ๋ฆฌ์คํธ๋ง
src/pages/About.js
์ ์ปดํฌ๋ํธ์์ useLocation ์ด๋ผ๋ Hook์ ์ฌ์ฉํ์. ์ด Hook์ location ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ฉฐ ์ด ๊ฐ์ฒด๋ ํ์ฌ ์ฌ์ฉ์๊ฐ ๋ณด๊ณ ์๋ ํ์ด์ง์ ์ ๋ณด๋ฅผ ๊ฐ์ง.
location ๊ฐ์ฒด์๋ ๋ค์๊ณผ ๊ฐ์ ๊ฐ์ด ์์
pathname | ํ์ฌ ์ฃผ์์ ๊ฒฝ๋ก (์ฟผ๋ฆฌ์คํธ๋ง ์ ์ธ) |
search | ๋งจ ์์ ? ๋ฌธ์ ํฌํจํ ์ฟผ๋ฆฌ์คํธ๋ง ๊ฐ |
hash | ์ฃผ์์ # ๋ฌธ์์ด ๋ค์ ๊ฐ |
state | ํ์ด์ง๋ก ์ด๋ํ ๋ ์์๋ก ๋ฃ์ ์ ์๋ ์ํ ๊ฐ |
key | location ๊ฐ์ฒด์ ๊ณ ์ ๊ฐ, ์ด๊ธฐ์๋ default ์ด๋ฉฐ ํ์ด์ง๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๊ณ ์ ์ ๊ฐ์ด ์์ฑ๋จ |
โ ์ค์ฒฉ๋ ๋ผ์ฐํธ
src/pages/Articles.js
src/pages/Articles.js
src/App.js
src/pages/Home.js
์คํ ๊ฒฐ๊ณผ
โ ๊ณตํต ๋ ์ด์์ ์ปดํฌ๋ํธ
์ด๋ฒ์๋ ์ค์ฒฉ๋ ๋ผ์ฐํธ๋ฅผ ํตํด ๊ณตํต ๋ ์ด์ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํด๋ณด๊ฒ ์
src/Layout.js
src/App.js
์คํ ๊ฒฐ๊ณผ
Header๊ฐ ์๋ํ๋ ๊ฑธ ๋ณผ ์ ์์ !!
๐ก๋ฆฌ์กํธ ๋ผ์ฐํฐ ๋ถ๊ฐ๊ธฐ๋ฅ
์ด์ ๋ถํฐ๋ ๋ฆฌ์กํธ ๋ผ์ฐํฐ์์ ๋ผ์ฐํ ๊ด๋ จ๋ ์์ ์ ํ ๋ ์ฌ์ฉํ ์ ์๋ ์ ์ฉํ API๋ค์ ์ดํด๋ณด๊ฒ ์
โ useNavigate
Link ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ ์ ์์
src/Layout.js
์คํ ๊ฒฐ๊ณผ
ํค๋์ ๋ฒํผ ๋๊ฐ๊ฐ ๋ง๋ค์ด์ง ๊ฒ์ ๋ณผ ์ ์์
โ NavLink
๋งํฌ์์ ์ฌ์ฉํ๋ ๊ฒฝ๋ก๊ฐ ํ์ฌ ๋ผ์ฐํธ ๊ฒฝ๋ก์ ์ผ์นํ๋ ๊ฒฝ์ฐ ํน์ ์คํ์ผ ๋๋ CSS ํด๋์ค๋ฅผ ์ ์ฉํ๋ ์ปดํฌ๋ํธ์
src/pages/Articles.js
์คํ ๊ฒฐ๊ณผ
"๊ฒ์๊ธ1"์ด ํฌ๊ธฐ๊ฐ ๋ ์ปค์ง๊ณ ์๋ ์ด๋ก์์ผ๋ก ๋ฐ๋ ๊ฑธ ๋ณผ ์ ์์ !
โ NotFound ํ์ด์ง ๋ง๋ค๊ธฐ
NotFound ํ์ด์ง๋ ์ฌ์ ์ ์ ์๋์ง ์๋ ๊ฒฝ๋ก์ ์ฌ์ฉ์๊ฐ ์ง์ ํ์ ๋ ๋ณด์ฌ์ฃผ๋ ํ์ด์ง์.
src/pages/NotFound.js
src/App.js
โ Navigate ์ปดํฌ๋ํธ
Navigate ์ปดํฌ๋ํธ๋ ์ปดํฌ๋ํธ๋ฅผ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ์๊ฐ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋์ ํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ์.
์ฐ์ ์ฌ์ฉ์์ ๋ก๊ทธ์ธ์ด ํ์ํ ํ์ด์ง์ด๋ฏ๋ก ๋ก๊ทธ์ธ ํ์ด์ง๋ถํฐ ๋ณด์ฌ์ฃผ๊ฒ ์.
src/pages/Login.js
src/pages/MyPage.js
src/App.js
์คํ ๊ฒฐ๊ณผ
/mypage ๋ก ์ด๋ํ๋ฉด ๋ฐ๋ก ๋ก๊ทธ์ธ ํ์ด์ง๋ก ๋ค์ด๊ฐ์ง๋ ๊ฒ์ ๋ณผ ์ ์์
๐ ์ ๋ฆฌ
๋ด๊ฐ ์ ๋ ฅํ๋ ์ฝ๋์ ๋ฐ๋ผ ์น ํ์ด์ง ํ๋ฉด์ด ๋ค์ํ๊ฒ ๋ฐ๋๋๊ฒ ์ฌ๋ฐ์์