[TIL] Day28
[SEB FE] Day28
์ ํต์ ์ธ ์น์ฌ์ดํธ๋ ํ์ด์ง ์ด๋ ์ ๋งค๋ฒ HTML ํ์ผ๋ก ๋ โํ์ด์ง ์ ์ฒด'๋ฅผ ๋ถ๋ฌ์์ผ๋ง ํ์ โ โ๊น๋นก์ธ๋คโ
โ ์ฌ์ฉ์/์๋น์ค ์ฌ์ด์ ์ํธ์์ฉ ์ฆ๊ฐ๋ก ํธ๋ํฝ ์ฆ๊ฐ์ ์ฌ์ฉ์ ๊ฒฝํ ์ ํ ์ผ๊ธฐ
โ ์ ๋ฐ์ดํธ์ ํ์ํ ๋ฐ์ดํฐ๋ง ์๋ฒ์์ ์ ๋ฌ๋ฐ์ ์ด ๋ฐ์ดํฐ๋ฅผ JS๊ฐ ๋์ ์ผ๋ก HTML ์์๋ฅผ ์์ฑํด์ ํ๋ฉด์ ๋ณด์ฌ์ฃผ๋ ๋ฐฉ์์ด ๊ฐ๋ฐ๋์ด ์ฌ์ฉ๋๊ธฐ ์์ โSPA
โฐย SPA(Single Page Application)
: ์๋ฒ๋ก๋ถํฐ ์์ ํ ์๋ก์ด ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ค์ง ์๊ณ ํ์ด์ง ๊ฐฑ์ ์ ํ์ํ ๋ฐ์ดํฐ๋ง ๋ฐ์ ๊ทธ ์ ๋ณด๋ฅผ ๊ธฐ์ค์ผ๋ก ํ์ฌ ํ์ด์ง๋ฅผ ์ ๋ฐ์ดํธํจ์ผ๋ก์จ ์ฌ์ฉ์์ ์ํตํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ / ์น ์ฌ์ดํธ
โย SPA๋ JavaScript์ ์์กด์
โSPA๋ ํ๋์ ์น ๋ฌธ์๊ฐ ์๋๋ผ, ํ๋์ ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฐ๋ฐํ ์ ์์
โย ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๊ฐ๋ฐ ๋ฐฉ๋ฒ - ์ด๋ค ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค๊ณ ์ด๋ค์ ์กฐํฉํ ์ง๋ถํฐ ๊ตฌ์
โฐย Wireframe
: ์นํ์ด์ง์ ๋ ์ด์์๊ณผ UI ์์ ๋ฑ์ ๋ํ ๋ผ๋
โฐย Mockup
: ๋ฐ๋ชจ ์์ฐ, ํ๊ฐ๋ฅผ ์ํ ์ต์ํ์ ๊ธฐ๋ฅ๋ง ๋ด์ ๋ชจํ
โฐย
Routing
(๋ผ์ฐํ )
: ๋ค๋ฅธ ์ฃผ์์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ทฐ๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ณผ์ โ โ๊ฒฝ๋ก์ ๋ฐ๋ผ ๋ณ๊ฒฝํ๋คโ๋ผ๋ ์๋ฏธ
BrowseRouter
: ๋ผ์ฐํฐ ์ญํ (router
)Routes
: ๊ฒฝ๋ก ๋งค์นญ(route matchers
)<Route>
์ปดํฌ๋ํธ๋ฅผ ๊ฐ์ธ์ ๊ทธ ์ค ๊ฒฝ๋ก๊ฐ ์ผ์นํ๋ ํ๋์ ๋ผ์ฐํฐ๋ง ๋ ๋๋ง<Routes>
๋ฅผ ์ฌ์ฉํ์ง ์์ผ๋ฉด ๋งค์นญ๋๋ ๋ชจ๋ ์์ ๋ ๋๋งRoute
: ๊ฒฝ๋ก ๋งค์นญ(route matchers
)path
์์ฑ์ ์ง์ ํด์ ํด๋น path์์ ์ด๋ค ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ค์ง ์ ํจelement
์์ฑ์ผ๋ก ์ฐ๊ฒฐํ๊ณ ์ ํ๋ ์ปดํฌ๋ํธ ์ง์ <Link>
์ปดํฌ๋ํธ๊ฐ ์ ํด์ฃผ๋ URL ๊ฒฝ๋ก์ ์ผ์นํ๋ ๊ฒฝ์ฐ์๋ง ์๋Link
: ๊ฒฝ๋ก ๋ณ๊ฒฝ(route changers
) โ ๊ฒฝ๋ก ์ฐ๊ฒฐ<a>
์์๊ฐ ์๋ <Link>
๋ฅผ ๊ตณ์ด ์ฌ์ฉํ๋ ์ด์ ๋?<a>
์์๋ ํ์ด์ง ์ ํ ๊ณผ์ ์์ ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ค๊ธฐ ๋๋ฌธ์ ์ฒ์๋ถํฐ ๋ ๋๋ง์ํด โ ์๋ก๊ณ ์นจ ํ์<Link>
์ปดํฌ๋ํธ๋ ํ์ด์ง ์ ํ ๋ฐฉ์ง ๊ธฐ๋ฅ์ด ๋ด์ฅ๋์ด ์์ด SPA ๊ตฌํ ๊ฐ๋ฅ path=โ*โ
(๋ฏธ์ง์ ์ฃผ์ ์ ๊ทผ์ ์ด ์์ฑ์ด ์ค์ ๋์ด ์๋ ์ปดํฌ๋ํธ๋ฅผ ๋ณด์ฌ์ค)// react-router ๋ผ์ด๋ธ๋ฌ๋ฆฌ install
// @version์ ์ ํ์ฌํญ
npm install react-router-dom@^6.3.0
// import๋ ํ์ํ ๋ชจ๋์ ๋ถ๋ฌ์ค๋ ์ญํ
// ๊ตฌ์กฐ ๋ถํด ํ ๋น ๋ฌธ๋ฒ๊ณผ ๋น์ทํ๊ฒ ์ด์ฉ - {}
import { BrowserRouter, Routes, Route, Link } from 'react-router-dom';
// App.js์์ ๊ธฐ๋ณธ์ ์ธ react-router ์ฌ์ฉํ ๋
function App() {
return(
<BrowserRouter>
<div>
<nav>
<ul>
<li>
<Link to="/">Home</Link>
</li>
<li>
<Link to="/mypage">MyPage</Link>
</li>
</ul>
</nav>
<Routes>
<Route path="/" element={<Home/>} />
<Route path="/mypage" element={<MyPage/>} />
</Routes>
</div>
</BrowserRouter>
)
}
function Home() {
return <h1>Home</h1>;
}
function MyPage() {
return <h1>MyPage</h1>;
}
export default App;
// index.js์ <BrowserRouter>๋ฅผ ๋ฃ์ด์ ํ์ฉ ๋ํ ๊ฐ๋ฅ
// React Version 18
import React from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter } from 'react-router-dom';
const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
<React.StrictMode>
<BrowserRouter>
<App />
</BrowserRouter>
</React.StrictMode>
);
์ด์ ์งํํ๋ React Twittler Intro ์์ ๊ธฐ๋ฅ develop
// MyPage.js
const MyPage = () => {
// username์ด 'kimcoding'์ธ ๋ฐ์ดํฐ๋ง ๊ณจ๋ผ๋ด๊ธฐ -> filter ๋ฉ์๋ ์ฌ์ฉ
const filteredTweets = dummyTweets.filter(
(el) => el.username === "kimcoding"
);
return (
<section className="myInfo">
<ul className="tweets__mypage">
{/* kimcoding์ธ ๋ฐ์ดํฐ๊ฐ ํ๋๊ฐ ์๋ ์ ์๊ธฐ ๋๋ฌธ์
map์ผ๋ก kimcoding์ ํด๋นํ๋ ๋ฐ์ดํฐ ๋ชจ์กฐ๋ฆฌ ๊ฐ์ ธ์์ ๋ณด์ฌ์ฃผ๊ธฐ */}
{filteredTweets.map((tweet) => {
return (
<li className="tweet" id={tweet.id}>
<div className="tweet__profile">
<img src={tweet.picture} />
</div>
<div className="tweet__content">
<div className="tweet__userInfo">
<span className="tweet__username">{tweet.username}</span>
</div>
<div className="tweet__message">{tweet.content}</div>
</div>
</li>
);
})}
</ul>
<Footer />
</section>
);
};
export default MyPage;
โฐย
useNavigate()
: ํน์ ํ๋์ ํ์ ๋ ํด๋น ์ฃผ์๋ก ์ด๋์์ผ์ฃผ๋ ์ญํ
โย useNavigate๋ Link์ ๋ฌ๋ฆฌ ํจ์ ํธ์ถ์ ํตํด ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ํ์ด์ง ์ด๋ ๊ฐ๋ฅ
import React from "react";
import { useNavigate } from "react-router-dom";
function Goback() {
const navigate = useNavigate();
return (
<div>
<button onClick={() => {navigate(-1)}}>
<i className="far fa fa-arrow-left"></i>
</button>
<button onClick={() => {navigate(1)}}>
<i className="far fa fa-arrow-right"></i>
</button>
</div>
);
}
export default Goback;
๐ซ ๊ฐ๋ ์ ๋ฆฌ๋ฅผ ๋ฐ๋ก ์ ํด๋ ์ํ์์ ๊ฑฐ์ 1๋ ๋ง์ React ๊ธฐ์ด๋ถํฐ ๋ค์ ํ๋ ค๋๊น ๊ธฐ์ต์ด ๊ฐ๋ฌผ๊ฐ๋ฌผ ๊ฑฐ์ ๋ฐฑ์ง ์ํ๋ค,, JS๋ฅผ ์ด๋์ ๋ ๊น์ด ๊ณต๋ถํ ๋ค์์ React๋ฅผ ๊ณต๋ถํ์์ด์ผ ํ๋๋ฐ JS ๊ฐ๋ ๋ ์ ๋ชจ๋ฅด๋ฉด์ React๋ฅผ ๊ณต๋ถํ๋ ค๊ณ ํ์ผ๋ ์ฝ๋๋ ์ฃผ๋จน๊ตฌ์์ผ๋ก ๋ฐ๋ผ ์ฐ๊ธฐ๋ง ํ์๋ ๊ฒ ๊ฐ๋ค. ์ด๋์ vanilla js๊ฐ ์ ์ค์ํ์ง ๋ผ์ ๋ฆฌ๊ฒ ๋๋ ์ ์์๋..
๐ช ์ด๋ฒ ์ฃผ๋ง์ ๊ผญ๊ผญ๊ผญ ์๋ฐ ๊ฐ๋ค์ค๊ณ ๋์ ์ ๋ ์๊ฐ์ ๊ณ์ ๋ฏธ๋ฃจ๊ณ ๋ฏธ๋ค๋ TIL ๋ชจ์กฐ๋ฆฌ ๋ณต์ตํ๊ณ ์ฝํ๋ฆฟ ๋ฌธ์ ๋ ๋ค์ ํ์ด๋ณด๊ธฐ!!