๐ ๋น๋๊ธฐ ์ฒ๋ฆฌ in JS
๋๊ธฐ์
- ํ ์์ ์ด ๋๋์ผ ๋ค์ ์์ ์งํ
๋๊ธฐ์
- ์ฌ๋ฌ ์์ ์ด ๋์์ ์งํ/ ๊ธฐ๋ค๋ฆฌ๋ ๊ณผ์ ์์ ๋ค๋ฅธ ํจ์๋ ํธ์ถ ๊ฐ๋ฅ
๐ Promise
: ๋น๋๊ธฐ ์์ ์ ์๋ฃ ๋๋ ์คํจ๋ฅผ ๋ํ๋ด๋ ๊ฐ์ฒด
promise๊ฐ ๊ฐ์ง๋ ์ํ
- pending : ๋๊ธฐ ์ํ (์์ง ๊ฒฐ๊ณผ x)
- fulfilled : ์ดํ๋จ (์์ ์ฑ๊ณต)
- rejected : ๊ฑฐ๋ถ๋จ (์์ ์คํจ)
๊ธฐ๋ณธ๋ฌธ๋ฒ ์์
const promise = new Promise((resolve, reject) => {
// ๋น๋๊ธฐ ์์
์ํ
if (์ฑ๊ณต) {
resolve('๊ฒฐ๊ณผ');
} else {
reject('์๋ฌ ๋ฉ์์ง');
}
});
resolve() : fulfilled ์ํ๋ก ์ ํ์ํค๋ ํจ์
๐ async/await
๊ธฐ๋ณธ ๋ฌธ๋ฒ
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function process() {
console.log('์๋
ํ์ธ์!');
await sleep(1000); // 1์ด์ฌ๊ณ
console.log('๋ฐ๊ฐ์ต๋๋ค!');
}
process();
- ํจ์๋ฅผ ์ ์ธ ํ ๋ ํจ์์ ์๋ถ๋ถ์ async ํค์๋๋ฅผ ๋ถ์ฌ์ค
- Promise ์ ์๋ถ๋ถ์ await ์ ๋ฃ์ด์ค => ํด๋น ํ๋ก๋ฏธ์ค๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ค์ ์์ ์ํ
- ํจ์์์ async๋ฅผ ์ฌ์ฉ => ๊ฒฐ๊ณผ๊ฐ์ผ๋ก Promise๋ฅผ ๋ฐํ
๐ API ์ฐ๋์ ๊ธฐ๋ณธ
๐ REST API
- ๋ฉ์๋
- GET: ๋ฐ์ดํฐ ์กฐํ ex) axios.get('API ์ฃผ์');
- POST: ๋ฐ์ดํฐ ๋ฑ๋ก ex) axios.post('API ์ฃผ์, {๋ฑ๋กํ ์ ๋ณด});
- PUT : ๋ฐ์ดํฐ ์์
- DELETE: ๋ฐ์ดํฐ ์ ๊ฑฐ
- + PATCH, HEAD ๊ฐ์ ๋ฉ์๋๋ ์กด์ฌ
๐ useState ์ useEffect ๋ก ๋ฐ์ดํฐ ๋ก๋ฉํ๊ธฐ
- useEffect์ ์ฒซ๋ฒ์งธ ํ๋ผ๋ฏธํฐ๋ก ๋ฑ๋กํ๋ ํจ์์๋ async ์ฌ์ฉ ๋ถ๊ฐ => ํจ์ ๋ด๋ถ์์ async๋ฅผ ์ฌ์ฉํ๋ ์๋ก์ด ํจ์ ์ ์ธ ํ์
- ๋ก๋ฉ ์ํ์ผ๋๋ ๋ก๋ฉ์ค.. ๋ฌธ๊ตฌ
- users๊ฐ์ด ์์ ๋ null์ ๋ณด์ฌ์ฃผ๋๋ก
- users ๋ฐฐ์ด์ ๋ ๋๋ง
๐ ๋ฒํผ์ ๋๋ฌ์ API ์ฌ์์ฒญํ๊ธฐ
๐ ๋ผ์ฐํ
: ์ฌ์ฉ์๊ฐ ์์ฒญํ URL์ ๋ฐ๋ผ ์๋ง๋ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ์ ์๋ฏธ
ํ๋ก์ ํธ๋ฅผ ํ๋์ ํ์ด์ง๋ก ๊ตฌ์ฑ or ์ฌ๋ฌ ํ์ด์ง๋ก ๊ตฌ์ฑ ๊ฐ๋ฅ
โ์ฌ๋ฌํ์ด์ง๋ก ๊ตฌ์ฑ
๋ง์ฝ์ ๋ธ๋ก๊ทธ๋ฅผ ๋ง๋ ๋ค๊ณ ๊ฐ์ ํ๋ฉด :
- ๊ธ์ฐ๊ธฐ ํ์ด์ง
- ํฌ์คํธ ๋ชฉ๋ก ํ์ด์ง
- ํฌ์คํธ ์ฝ๊ธฐ ํ์ด์ง
์ด๋ ๊ฒ ์ฌ๋ฌ ํ์ด์ง๋ฅผ ๋ง๋ค์ด์ผ ํ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค.
๋ฆฌ์กํธ์์ ๋ผ์ฐํธ ์์คํ ์ ๊ตฌ์ถํ๋ ์ ํ์ง
- ๋ฆฌ์กํธ ๋ผ์ฐํฐ(React Router) : ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฆฌ์กํธ์ ๋ผ์ฐํ ๊ด๋ จ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค ์ค์์ ๊ฐ์ฅ ์ค๋๋๊ณ , ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๊ณ ์๋ค. ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ผ๋ก ๋ผ์ฐํ ์์คํ ์ ์ค์ ํ ์ ์์.
- Next.js : ๋ฆฌ์กํธ ํ๋ก์ ํธ์ ํ๋ ์์ํฌ, ๋ผ์ฐํ ์์คํ ์ ํ์ผ ๊ฒฝ๋ก ๊ธฐ๋ฐ์ผ๋ก ์๋
๐ ์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์
: ํ ๊ฐ์ ํ์ด์ง(HTML)๋ก ์ด๋ฃจ์ด์ง ์ ํ๋ฆฌ์ผ์ด์
๐ก ํต์ฌ ๊ฐ๋ :
- ํ์ด์ง ์ ํ ์ ์๋ก๊ณ ์นจ์ด ์๋ค.
- ์๋ฒ๋ ํ ๋ฒ๋ง HTML์ ์ ๊ณตํ๊ณ , ์ดํ์๋ ํ์ํ ์ฝํ ์ธ ๋ง JavaScript๋ก ๋์ ์ผ๋ก ๊ต์ฒดํจ.
- React๋ ์ด ๋ฐฉ์์ ์ฐ๋ ๋ํ์ ์ธ ํ๋ก ํธ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
๐ ๋ฆฌ์กํธ ๋ผ์ฐํฐ ์ ์ฉ ๋ฐ ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
๐ํ๋ก์ ํธ ์์ฑ ๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์น / ๋ผ์ฐํฐ ์ ์ฉ
๐ ํ์ด์ง ์ปดํฌ๋ํธ ๋ง๋ค๊ธฐ
๐ Route ์ปดํฌ๋ํธ๋ก ํน์ ๊ฒฝ๋ก์ ์ํ๋ ์ปดํฌ๋ํธ ๋ณด์ฌ์ฃผ๊ธฐ
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import { BrowserRouter } from 'react-router-dom';
ReactDOM.render(
<BrowserRouter>
<App />
</BrowserRouter>,
document.getElementById('root')
);
index.js๋ฅผ ์ด๋ฐ์์ผ๋ก ํ๋ฉด ๋ฆฌ์กํธ 18์ด์์์ ์๋๋ค๊ณ ํฉ๋๋ค !!!
๐ Route ์ปดํฌ๋ํธ๋ก ํน์ ๊ฒฝ๋ก์ ์ํ๋ ์ปดํฌ๋ํธ ๋ณด์ฌ์ฃผ๊ธฐ
Link ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ๋ ๋งํฌ๋ฅผ ๋ณด์ฌ์ค
-์น ํ์ด์ง์์๋ ์๋ aํ๊ทธ ์ฌ์ฉ : ๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ฅผ ์ฌ์ฉํ๋ ํ๋ก์ ํธ์์ a ํ๊ทธ๋ฅผ ๋ฐ๋ก ์ฌ์ฉํ๋ฉด ์๋จ.
=> aํ๊ทธ๋ฅผ ํด๋ฆญํ์ฌ ํ์ด์ง๋ฅผ ์ด๋ํ ๋ ๋ธ๋ผ์ฐ์ ์์ ํ์ด์ง๋ฅผ ์๋ก ๋ถ๋ฌ์ค๊ฒ ๋๊ธฐ ๋๋ฌธ
Link ์ปดํฌ๋ํธ๋ aํ๊ทธ๋ฅผ ์ฌ์ฉํ๊ธด ํ์ง๋ง
ํ์ด์ง๋ฅผ ์๋ก ๋ถ๋ฌ์ค๋ ๊ฒ์ ๋ง๊ณ ,History API๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ์ฃผ์์ ๊ฒฝ๋ก๋ง ๋ฐ๊พธ๋ ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์์
Link ์ปดํฌ๋ํธ ์ฌ์ฉ๋ฒ
<Link to="๊ฒฝ๋ก">๋งํฌ ์ด๋ฆ</Link>
๐ URL ํ๋ผ๋ฏธํฐ์ ์ฟผ๋ฆฌ์คํธ๋ง
- URL ํ๋ผ๋ฏธํฐ ex) /profile/velopert
- ์ฃผ์์ ๊ฒฝ๋ก์ ์ ๋์ ์ธ ๊ฐ์ ๋ฃ๋ ํํ
- ID ๋๋ ์ด๋ฆ์ ์ฌ์ฉํ์ฌ ํน์ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ ๋ ์ฌ์ฉ
- ์ฟผ๋ฆฌ์คํธ๋ง ex) /articles?**page=1&keyword=react
- ์ฃผ์์ ๋ท๋ถ๋ถ์ ?๋ฌธ์์ด ์ดํ์ key=value๋ก ๊ฐ์ ์ ์ํ๋ฉฐ &๋ก ๊ตฌ๋ถ์ ํ๋ ํํ
- ํค์๋ ๊ฒ์,ํ์ด์ง๋ค์ด์ ,์ ๋ ฌ ๋ฐฉ์ ๋ฑ ๋ฐ์ดํฐ ์กฐํ์ ํ์ํ ์ต์ ์ ์ ๋ฌํ ๋ ์ฌ์ฉ
URL ํ๋ผ๋ฏธํฐ
- useParams๋ผ๋ Hook์ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด ํํ๋ก ์กฐํ
- URL ํ๋ผ๋ฏธํฐ์ ์ด๋ฆ์ Route ์ปดํฌ๋ํธ์ path props๋ฅผ ํตํ์ฌ ์ค์
์ฟผ๋ฆฌ์คํธ๋ง
URL ํ๋ผ๋ฏธํฐ์ ๋ฌ๋ฆฌ Route ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ ๋ ๋ณ๋๋ก ์ค์ ํด์ผ ๋๋ ๊ฒ ์์
- useLoacation์ด๋ผ๋ Hook์ ์ฌ์ฉ, location ๊ฐ์ฒด๋ฅผ ๋ฐํ (ํ์ฌ ์ฌ์ฉ์๊ฐ ๋ณด๊ณ ์๋ ํ์ด์ง์ ์ ๋ณด๋ฅผ ์ง๋๊ณ ์์)
- ์ด ๊ฐ์ฒด๊ฐ ๊ฐ์ง๋ ๊ฐ
- pathname: ํ์ฌ ์ฃผ์์ ๊ฒฝ๋ก (์ฟผ๋ฆฌ์คํธ๋ง ์ ์ธ)
- search: ๋งจ ์์ ? ๋ฌธ์ ํฌํจํ ์ฟผ๋ฆฌ์คํธ๋ง ๊ฐ
- hash: ์ฃผ์์ # ๋ฌธ์์ด ๋ค์ ๊ฐ(์ฃผ๋ก History API ๊ฐ ์ง์๋์ง ์๋ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์ ํด๋ผ์ด์ธํธ ๋ผ์ฐํ ์ ์ฌ์ฉํ ๋ ์ฐ๋ ํด์ ๋ผ์ฐํฐ์์ ์ฌ์ฉ)
- state: ํ์ด์ง๋ก ์ด๋ํ ๋ ์์๋ก ๋ฃ์ ์ ์๋ ์ํ ๊ฐ
- key: location ๊ฐ์ฒด์ ๊ณ ์ ๊ฐ, ์ด๊ธฐ์๋ default์ด๋ฉฐ ํ์ด์ง๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๊ณ ์ ์ ๊ฐ์ด ์์ฑ๋จ
์ฟผ๋ฆฌ์คํธ๋ง์ location.search ๊ฐ์ ํตํด ์กฐํ ๊ฐ๋ฅ
- useSearchParams๋ ๋ฐฐ์ด ํ์ ์ ๊ฐ์ ๋ฐํ
- ์ฒซ๋ฒ์งธ ์์ : ์ฟผ๋ฆฌํ๋ผ๋ฏธํฐ ์กฐํ/์์ ํ๋ ๋ฉ์๋๋ค์ด ๋ด๊ธด ๊ฐ์ฒด ๋ฐํ
- get(): ํน์ ์ฟผ๋ฆฌํ๋ผ๋ฏธํฐ ์กฐํ
- set() : ํน์ ์ฟผ๋ฆฌํ๋ผ๋ฏธํฐ ์ ๋ฐ์ดํธ
- ๋๋ฒ์งธ ์์: ์ฟผ๋ฆฌํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ์ฒดํํ๋ก ์ ๋ฐ์ดํธํ ์ ์๋ ํจ์๋ฅผ ๋ฐํ
๐ ์ค์ฒฉ๋ ๋ผ์ฐํธ
import { Route, Routes } from 'react-router-dom';
import About from './pages/About';
import Article from './pages/Article';
import Articles from './pages/Articles';
import Home from './pages/Home';
import Profile from './pages/Profile';
const App = () => {
return (
<Routes>
<Route path="/" element={<Home />} />
<Route path="/about" element={<About />} />
<Route path="/profiles/:username" element={<Profile />} />
<Route path="/articles" element={<Articles />} />
<Route path="/articles/:id" element={<Article />} />
</Routes>
);
};
export default App;
์ด๋ฐ ์ฝ๋๋ฅผ ์ค์ฒฉ๋ ๋ผ์ฐํธ๋ฅผ ์ฌ์ฉํด์
๐ ๊ณตํต ๋ ์ด์์ ์ปดํฌ๋ํธ
์ค์ฒฉ๋ ๋ผ์ฐํธ์ Outlet์ ํ์ด์ง๋ผ๋ฆฌ ๊ณตํต์ ์ผ๋ก ๋ณด์ฌ์ค์ผ ํ๋ ๋ ์ด์์์ด ์์๋๋ ์ ์ฉํ๊ฒ ์ฌ์ฉ ๊ฐ๋ฅ
ex) Home, About, Profile ํ์ด์ง์์ ์๋จ์ ํค๋๋ฅผ ๋ณด์ฌ์ค์ผ ํ๋ ์ํฉ
-์ค์ฒฉ๋ ๋ผ์ฐํธ๋ฅผ ์ฌ์ฉํ๋ฉด ์ปดํฌ๋ํธ๋ฅผ ํ ๋ฒ๋ง ์ฌ์ฉํ๋ฉด ๋จ
๐ index props
Route ์ปดํฌ๋ํธ์๋ index๋ผ๋ props๊ฐ ์์. ์ด props๋ path="/"์ ๋์ผํ ์๋ฏธ
๐ ๋ฆฌ์กํธ ๋ผ์ฐํฐ ๋ถ๊ฐ๊ธฐ๋ฅ
๐ useNavigate
: Link ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋์ ํด์ผ ํ๋ ์ํฉ์ ์ฌ์ฉํ๋ Hook
navigate()
ํ๋ผ๋ฏธํฐ๊ฐ ์ซ์ ํ์ ์ด๋ผ๋ฉด ์์ผ๋ก ๊ฐ๊ฑฐ๋, ๋ค๋ก๊ฐ.
ex) navigate(-1) : ํ ๋ฒ ๋ค๋ก
ex) navigate(2) : ๋ ๋ฒ ์์ผ๋ก
replace
- ํ์ด์ง๋ฅผ ์ด๋ํ ๋ ํ์ฌ ํ์ด์ง๋ฅผ ํ์ด์ง ๊ธฐ๋ก์ ๋จ๊ธฐ์ง ์์
๐ NavLink(์ปดํฌ๋ํธ)
: ๋งํฌ์์ ์ฌ์ฉํ๋ ๊ฒฝ๋ก๊ฐ ํ์ฌ ๋ผ์ฐํธ์ ๊ฒฝ๋ก์ ์ผ์นํ๋ ๊ฒฝ์ฐ ํน์ ์คํ์ผ ๋๋ CSS ํด๋์ค๋ฅผ ์ ์ฉํ๋ ์ปดํฌ๋ํธ
- style ๋๋ className์ ์ค์ ํ ๋ { isActive: boolean } ์ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌ๋ฐ๋ ํจ์ ํ์ ์ ๊ฐ์ ์ ๋ฌ
ex)
<NavLink
style={({isActive}) => isActive ? activeStyle : undefined}
/>
<NavLink
className={({isActive}) => isActive ? 'active' : undefined}
/>
๐ NotFound ํ์ด์ง ๋ง๋ค๊ธฐ
: ์ฌ์ ์ ์ ์๋์ง ์๋ ๊ฒฝ๋ก์ ์ฌ์ฉ์๊ฐ ์ง์ ํ์ ๋ ๋ณด์ฌ์ฃผ๋ ํ์ด์ง(ํ์ด์ง๋ฅผ ์ฐพ์ ์ ์์ ๋ ๋ํ๋๋ ํ์ด์ง)
๐ Navigate ์ปดํฌ๋ํธ
: ์ปดํฌ๋ํธ๋ฅผ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ์๊ฐ ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋์ ํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ ์ปดํฌ๋ํธ
์ด๋ฒ์ด ์คํฐ๋ ๋ง์ง๋ง์ด๋ค์ใ ใ ์์ฝ์ต๋๋ค
'WINK-(Web & App) > React.js ์คํฐ๋' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[2025 1ํ๊ธฐ React.js ์คํฐ๋] ์ด๊ฐ์ธ #6์ฃผ์ฐจ (0) | 2025.05.28 |
---|---|
[2025 1ํ๊ธฐ React.js ์คํฐ๋] ์ต์ํฌ #6์ฃผ์ฐจ (0) | 2025.05.28 |
[2025 1ํ๊ธฐ React.js ์คํฐ๋] ์ต์ํฌ #5์ฃผ์ฐจ (0) | 2025.05.22 |
[2025 1ํ๊ธฐ React.js ์คํฐ๋] ๊ฐ๋ฏผ์ง #5์ฃผ์ฐจ (0) | 2025.05.22 |
[2025 1ํ๊ธฐ React.js ์คํฐ๋] ์ด์น์ค #5์ฃผ์ฐจ (0) | 2025.05.22 |