
๐ฏ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ React์ ๋ํด ์ ๋ฆฌํฉ๋๋ค.
react.js๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค(UI)๋ฅผ ๋ง๋ค๊ธฐ ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์
๋๋ค. ์น ์ ํ๋ฆฌ์ผ์ด์
(SPA)๊ณผ ๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์
(React Native)์ ๊ฐ๋ฐํ ๋ ์ฃผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
๐ค jQuery๋ฅผ ์ฌ์น๊ณ , React๊ฐ ๋ฑ์ฅํ ์ด์ ๋ ๋ญ๊น?
๊ธฐ์กด์ ์น ๊ฐ๋ฐ ๋ฐฉ์(
jQuery)์์๋ ์ฌ์ฉ์ ์ํ๊ฐ ๋ฐ๋ ๋๋ง๋ค HTML ์์(DOM)๋ฅผ ์ง์ ์ฐพ์ ์กฐ์ํด์ผ ํ์ต๋๋ค. (์ฆ, ๊ฐ์ด ๋ณํด๋ ์๋์ผ๋ก UI๊ฐ ๋ฐ๋์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฐ์๊ฐ ์ง์ UI๋ฅผ ์กฐ์ํด์ผ ํ์ต๋๋ค.)if (user.loggedIn) { document.getElementById("loginBtn").style.display = "none"; document.getElementById("logoutBtn").style.display = "block"; document.getElementById("welcomeMsg").textContent = "ํ์ํฉ๋๋ค!"; }ํ์ง๋ง ์ธํฐํ์ด์ค๊ฐ ์ ์ ๋ณต์กํด์ง๋ฉด์ ์ํ์ UI ๊ฐ์ ์ผ์น๋ฅผ ์ ์งํ๊ธฐ ์ด๋ ค์์ก๊ณ , ์ฑ๋ฅ ์ ํ๋ ๋ฒ๊ทธ๊ฐ ์์ฃผ ๋ฐ์ํ์ต๋๋ค.
React๋ DOM์ ์ง์ ๋ค๋ฃจ์ง ์์๋ ๋๊ฒ๋ ์ถ์ํํด์ค๋๋ค. ๊ฐ๋ฐ์๋ ์ด๋ป๊ฒ ๋ฐ๊ฟ์ผ ํ ์ง๊ฐ ์๋๋ผ, ์ง๊ธ ์ํ๋ผ๋ฉด ์ด๋ค ํ๋ฉด์ด์ด์ผ ํ๋์ง๋ง ์ ์ธ์ ์ผ๋ก ํํํ๋ฉด ๋ฉ๋๋ค. (์ฆ, ์ํ๋ง ๊ด๋ฆฌํ๋ฉด, ํ๋ฉด์ React๊ฐ ์๋์ผ๋ก ๊ทธ๋ ค์ค๋๋ค.)function Greeting({ isLoggedIn }) { return ( <div> {isLoggedIn ? ( <p>ํ์ํฉ๋๋ค!</p> ) : ( <button>๋ก๊ทธ์ธ</button> )} </div> ); }
์ถ์ฒ: https://ninefloor.tistory.com/118
์ปดํฌ๋ํธ๊ฐ ์ฒ์์ผ๋ก ํ๋ฉด์ ๊ทธ๋ ค์ง ๋, React๋ ์ ์ฒด UI ๊ตฌ์กฐ๋ฅผ ํ ๋ฒ์ ๋ ๋๋งํฉ๋๋ค.
๋ง์ฝ ์ฌ์ฉ์๊ฐ ๋ฒํผ์ ํด๋ฆญํด์ ์ํ๊ฐ ๋ฐ๋๋ฉด, ๊ฐ์ DOM(Virtual DOM)์ ๋จผ์ ์ ๋ฐ์ดํธํฉ๋๋ค.
๐ค ๊ฐ์ DOM์ด๋?
์ค์ ํ๋ฉด์ด ์๋, ๋ฉ๋ชจ๋ฆฌ ์์ ์กด์ฌํ๋ ๊ฐ์์ ๊ตฌ์กฐ์ ๋๋ค. ์ค์ ๋ก ๊ทธ๋ฆฌ๊ธฐ ์ ์ ๋น ๋ฅด๊ฒ ๊ณ์ฐํ๊ณ ์คํํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
๋ณ๊ฒฝ๋ ๊ฐ์ DOM๊ณผ ์ด์ ๊ฐ์ DOM์ ๋น๊ตํ์ฌ
์ด๋ค ๋ถ๋ถ์ด ๋ฌ๋ผ์ก๋์ง๋ฅผ ๊ณ์ฐํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ํ๋ฉด(DOM)์ ํ์ํ ๋ถ๋ถ๋ง ํจ์จ์ ์ผ๋ก ์ ๋ฐ์ดํธํฉ๋๋ค.
โน๏ธ ํ์ฌ๋ ์ฌ์ฉ์ด ๊ถ์ฅ๋์ง ์๋ ๊ตฌ๋ฒ์ ๋ฌธ์ (React 17 ์ดํ)๋ฅผ ์ฐธ๊ณ ํด์ ์ฑ์ ๋ง๋๋ ์ ์ ์ฐธ๊ณ ํด์ฃผ์ธ์.
๐ฅ CRA(Create React App) vs Vite
๐ ๋ ์ด์ CRA(Create React App)์ ์ฌ์ฉํ์ง ์๋ ์ด์ / Vite๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ๋ฐฉ๋ฒ
ํญ๋ชฉ Create React App (CRA) Vite ๋ช ๋ น์ด npx create-react-app my-appnpm create vite@latest my-app -- --template react๊ธฐ์ ๊ธฐ๋ฐ Webpack ESBuild + Rollup ์ด๊ธฐ ์ค์ ์๋ ์ค์ , ์จ๊ฒจ์ง ์ค์ ( ejectํ์)ํ ํ๋ฆฟ ๊ธฐ๋ฐ, vite.config.js๋ก ์ฝ๊ฒ ์ปค์คํฐ๋ง์ด์ง ๊ฐ๋ฅ๊ฐ๋ฐ ์๋ฒ ์๋ ๋๋ฆด ์ ์์ ๋น ๋ฅด๊ฒ ๋ฐ์ํจ ๋น๋ ์๋ ๋น๊ต์ ๋๋ฆผ ๋น ๋ฆ ๊ธฐ๋ณธ ๋ฒ๋ค๋ฌ Webpack Rollup ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง(SSR) ๊ธฐ๋ณธ ๋ฏธ์ง์ ์ผ๋ถ SSR ๊ฐ๋ฅ (Next.js๋ณด๋จ ์ ํ์ )
typescript๋ฅผ ํ์ฉํ์ฌ ๊ฐ๋ฐํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ typescript ํ
ํ๋ฆฟ์ ์ค์ ํ์ฌ ์ค์นํฉ๋๋ค.
npx create-react-app ํ๋ก์ ํธ๋ช
--template typescript
cd ํ๋ก์ ํธ๋ช
npm start
JavaScript XML์ ์ค์๋ง๋ก, React์์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๋ง๋ค ๋ ์ฌ์ฉํ๋ ๋ฌธ๋ฒ์
๋๋ค. React ์ปดํฌ๋ํธ์ return ๋ฌธ ์์์ ์ฌ์ฉ๋ฉ๋๋ค.
๐ HTML์ JSX๋ก ๋ณํํด์ฃผ๋ ์ฌ์ดํธ
์ค๊ดํธ {} ์์ JavaScript ํํ์์ ๋ฃ์ ์ ์์ต๋๋ค.
function Greeting() {
const name = "Yuna";
return <h1>Hello, {name}!</h1>;
}
function App() {
return (
<div>
<h1>Hello</h1>
<p>Welcome</p>
</div>
);
}
HTML์์๋ ์ผ๋ถ ํ๊ทธ๋ฅผ ๋ซ์ง ์์๋ ๋์ง๋ง, JSX์์๋ ๋ชจ๋ ํ๊ทธ๋ฅผ ๋ซ์์ผ ํฉ๋๋ค.
function Logo() {
return <img src="logo.png" />;
}
class ๋์ className์ ์ฌ์ฉํฉ๋๋ค.
function Container() {
return <div className="container">๋ด์ฉ</div>;
}
jsx ์ธ๋ถ์์๋ // ๋๋ /* */๋ก js์ ๋์ผํ๊ฒ ์ฌ์ฉํ์ง๋ง jsx ๋ด๋ถ์์๋ {/* */}๋ฅผ ํ์ฉํ์ฌ ์ฃผ์์ ์์ฑํฉ๋๋ค.
function Home({ isLoggedIn }) {
return (
<div>
{/* ์ฌ๊ธฐ๋ ์ ๋ชฉ์
๋๋ค */}
<h1>Hello, world!</h1>
{/* ์กฐ๊ฑด๋ถ ๋ ๋๋ง ์์ */}
{isLoggedIn ? <LogoutButton /> : <LoginButton />}
</div>
);
}
JSX์์๋ JavaScript ๊ฐ์ฒด ํ์์ผ๋ก ์คํ์ผ์ ์ ์ํฉ๋๋ค. ๊ทธ๋์ ์ค๊ดํธ ๋ ๊ฐ({{ ... }})๋ก ํํํฉ๋๋ค. css ์์ฑ ์ด๋ฆ๋ camelCase๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํฉ๋๋ค.
function StyledBox() {
return (
<div style={{
padding: '20px',
backgroundColor: 'lightgray',
borderRadius: '8px'
}}>
์ธ๋ผ์ธ ์คํ์ผ๋ก ๊พธ๋ฉฐ์ง ๋ฐ์ค์
๋๋ค.
</div>
);
}
JSX์ ๋ฌธ๋ฒ์ด ์์ง ํท๊ฐ๋ฆฌ์ง๋ง ์ ์ ๋ฆฌํด์ ์ต์ํด์ง๋๋ก ํด์ผ๊ฒ ๋ค.