๊ฐ์ - Section 4 : React.js ๊ฐ๋ก
์ ๋ฐ๋ฏธ : https://www.udemy.com/course/winterlood-react-basic/
์ธํ๋ฐ :
1. React.js ์๊ฐ
* React์ ํน์ง
1. ์ปดํฌ๋ํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก UI๋ฅผ ํํํ๋ค
: ๋ฆฌ์กํธ๋ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ์ํคํ ์ณ๋ฅผ ์ฌ์ฉํ๋ค. ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์(๋๋ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ) ์ปดํฌ๋ํธ๋ค๋ก ๋๋์ด์ ๊ฐ๋ฐํ ์ ์์์ ์๋ฏธํ๋ค. ๊ฐ ์ปดํฌ๋ํธ๋ ๋ ๋ฆฝ์ ์ด๋ฉฐ, ์์ ๋ง์ ์ํ์ ๋ก์ง์ ๊ฐ์ง ์ ์๋ค.
2. ํ๋ฉด ์ ๋ฐ์ดํธ ๊ตฌํ์ด ์ฝ๋ค
: ๋ฆฌ์กํธ๋ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ์ผ๋ก ๋์ํ๋ค. ๊ฐ๋ฐ์๋ UI๊ฐ ํน์ ์ํ์์ ์ด๋ป๊ฒ ๋ณด์ฌ์ผ ํ๋์ง๋ง ์ ์ธํ๋ฉด, React๊ฐ ์ํ ๋ณํ์ ๋ฐ๋ผ UI๋ฅผ ์๋์ผ๋ก ์ ๋ฐ์ดํธ ํด์ค๋ค.
(์ ์ธํ ํ๋ก๊ทธ๋๋ฐ : ๊ณผ์ ์ ์๋ตํ๊ณ ๋ชฉ์ ๋ง ๊ฐ๊ฒฐํ ๋ช ์ํ๋ ๋ฐฉ๋ฒ ↔ ๋ช ๋ นํ ํ๋ก๊ทธ๋๋ฐ : ๋ชฉ์ ์ ์ด๋ฃจ๊ธฐ ์ํ ๋ชจ๋ ๊ณผ์ ์ ์ค๋ช )
3. ํ๋ฉด ์ ๋ฐ์ดํธ๊ฐ ๋น ๋ฅด๊ฒ ์ฒ๋ฆฌ๋๋ค
: ๋ฆฌ์กํธ๋ ๊ฐ์ DOM(Virtual DOM) ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ๋น ๋ฅธ ํ๋ฉด ์ ๋ฐ์ดํธ๋ฅผ ์ ๊ณตํ๋ค. ์ค์ DOM ์กฐ์์ ์ฑ๋ฅ์ ์ผ๋ก ๋น์ฉ์ด ๋ง์ด ๋๋ ์ง์ ์ด์ง๋ง, React๋ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์ DOM์ ๋จผ์ ๋ฐ์ํ๊ณ , ๊ทธ ์ฐจ์ด์ ์ ์ค์ DOM์ ์ต์ํ์ ๋ณ๊ฒฝ์ผ๋ก ๋ฐ์ํ๋ค.
2. React App ์์ฑํ๊ธฐ
* Vite๋ก ๋ฆฌ์กํธ ์ฑ ์์ฑ
(Vite? ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ์ํ ์ต์ ๋น๋ ๋๊ตฌ, ๊ฐ๋ฐ ํด. ๊ธฐ๋ณธ ์ค์ ์ด ์ ์ฉ๋ React App ์์ฑ ๊ฐ๋ฅ)
1. ํด๋ ํ์ธ ํ ํฐ๋ฏธ๋์ ์๋ ์ฝ๋ ์คํ
npm create vite@latest
2. create-vite ์์ฑ ํ์ธ : y ์ ๋ ฅ
3. ํ๋ก์ ํธ ์ด๋ฆ ์ค์
4. ํ๋ ์์ํฌ ์ ํ : React → JavaScript
5. ์์ฑ์๋ฃ
ํ์ธํด๋ณด๋ฉด node_modules์ package-lock.json์ด ์ค์น๊ฐ ์๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ ์๊ฐ์ ๋ฐฐ์ ๋ ๊ฒ์ฒ๋ผ ํฐ๋ฏธ๋์ ์๋์ ๊ฐ์ด ์ ๋ ฅํด์ค๋ค.
npm i
6. ์ธ์คํจ ์๋ฃ
* ์์ฑ๋ ํด๋, ํ์ผ ์ค๋ช
1. public : ์ ์ ํ์ผ์ ์ ์ฅํ๋ ํด๋. ์ฌ๊ธฐ์ ์๋ ํ์ผ์ ๋ณ๋์ ์ฒ๋ฆฌ ์์ด ๊ทธ๋๋ก ๋น๋ ๊ฒฐ๊ณผ์ ํฌํจ๋๋ค. ์๋ฅผ๋ค์ด ์ด๋ฏธ์ง๋ pavicon๋ฑ์ด ๋ค์ด๊ฐ ์ ์๋ค
2. src : ์ ํ๋ฆฌ์ผ์ด์ ์์ค ์ฝ๋๊ฐ ํฌํจ๋ ํด๋. React ์ฑ์ ์ปดํฌ๋ํธ, ์คํ์ผ, ๋ก์ง ๋ฑ์ ์์ฑํ๋ ๋ฉ์ธ ํด๋
(์ฌ๊ธฐ ์์๋ svgํ์ผ์ด ์๋๋ฐ, ์ฌ๊ธฐ์ ๋ค์ด๊ฐ ์ด๋ฏธ์ง๋ ์์ค์ฝ๋ ๋ด์์ import๋ก ๋ถ๋ฌ์ ๋ชจ๋์ฒ๋ผ ๊ฐ์ ธ์ฌ ์ ์์ผ๋ฉฐ public์ ๋ค์ด๊ฐ์๋ ์ด๋ฏธ์ง๋ URL์ ํตํด ์ ๊ทผํ๋ฉฐ ๋ธ๋ผ์ฐ์ ๊ฐ ์ง์ ๋ก๋ํ ์ ์๋ค๋ ์ฐจ์ด์ ์ด ์๋ค)
3. eslint.config : ESLint์ ์ค์ ํ์ผ๋ก, ์ฝ๋ ํ์ง๊ณผ ์คํ์ผ์ ๊ฒ์ฌํ๊ธฐ ์ํ ๊ท์น๋ค์ ์ ์ํ๋ ํ์ผ
4. gitignore : Git์ ํฌํจ๋์ง ์์์ผ ํ ํ์ผ์ด๋ ํด๋๋ฅผ ๋ช ์ํ๋ ํ์ผ
5. index.html : ๋ฆฌ์กํธ ์ฑ์ ๊ธฐ๋ณธ ํ ์ญํ ์ ํ๋ HTML ํ์ผ. main.js ํ์ผ์ด ์ด๊ณณ์ ์ฝ์ ๋์ด React๊ฐ ๋๋๋ง ๋๋ค
6. vite.config : Vite์ ์ค์ ํ์ผ
* React App ์คํ(๊ฐ๋ฐ ๋ชจ๋๋ก ์คํ)
npm run dev
* ๊ทธ ์ธ Vite ๋ช ๋ น์ด
r + enter : ํ์ฌ ์คํ์ค์ธ Vite ์๋ฒ๋ฅผ ์ฌ์์ ํจ
u + enter : ํ์ฌ ์คํ์ค์ธ Vite ์๋ฒ์ URL์ ์ฝ์์ ํ์ํจ
o + enter : ํ์ฌ ์คํ์ค์ธ Vite ์น ์ ํ๋ฆฌ์ผ์ด์
์ ๋ธ๋ผ์ฐ์ ์์ ์ด์ด์ค
c + enter : ์ฝ์ ์ฐฝ ํด๋ฆฌ์ด
q + enter : ํ์ฌ ์คํ์ค์ธ Vite ์๋ฒ ์ข
๋ฃ
React.js ๊ฐ๋ก
3. React App ๊ตฌ๋์๋ฆฌ ์ดํด๋ณด๊ธฐ
* React App ์คํํ๋ฉด ์๋์ ๊ฐ์ ํ๋ฉด์ด ๋์จ๋ค. ๊ตฌ๋์๋ฆฌ๋ฅผ ์ดํด๋ณด์
1. HTML ๋ก๋ (index.html)
<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Vite + React</title>
</head>
<body>
<div id="root"></div>
<script type="module" src="/src/main.jsx"></script>
</body>
</html>
๋ธ๋ผ์ฐ์ ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ index.html ํ์ผ์ ๋ถ๋ฌ์จ๋ค. ์ด index.html ํ์ผ์ ๋ฆฌ์กํธ ์ฑ์ ๋ผ๋๋ฅผ ์ ๊ณตํ๋ค.
<body>์์๋ <div id = "root"></div>๋ผ๋ ๋จ์ํ ํ๊ทธ๊ฐ ์๋๋ฐ ์ด ํ๊ทธ๋ ๋ฆฌ์กํธ๊ฐ UI๋ฅผ ๊ทธ๋ฆด ๊ณต๊ฐ์ ๋ง๋ค์ด ์ค๋ค.
์ด์ธ์ <script>ํ๊ทธ๋ ๋ฆฌ์กํธ๊ฐ ๋์ํ JS ํ์ผ์ ๋ถ๋ฌ์จ๋ค.
2. JavaScript ๋ชจ๋ ๋ก๋ (main.jsx)
import { StrictMode } from 'react'
import { createRoot } from 'react-dom/client'
import './index.css'
import App from './App.jsx'
createRoot(document.getElementById('root')).render(
<StrictMode>
<App />
</StrictMode>,
)
index.html์ <script> ํ๊ทธ๋ก ๋ถ๋ฌ์จ ๋ถ๋ฌ์จ main.jsx ํ์ผ์ด ๋ฆฌ์กํธ ์ฑ์ ์์์ ์ด๋ค.
์ฌ๊ธฐ์ createRoot๋ผ๋ ํจ์๊ฐ id๊ฐ root๋ผ๋ ์์๋ฅผ ์ฐพ์์ App ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ค.
* <StrictMode> ๋ ๊ฐ๋จํ๊ฒ ๋งํด์ ๊ฐ๋ฐ ์ค ๋ฌธ์ ๋ฅผ ๋ฏธ๋ฆฌ ํ์ธํ ์ ์๋ ๊ฐ๋ฐ ๋๊ตฌ์ด๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก! ๋์ ์ธ ํ๋ฉด ์์ฑ
๋ฆฌ์กํธ๊ฐ JS๋ก ํ์ํ HTML์ ๋ง๋ค์ด์ ๋ฃ์ด์ฃผ๊ธฐ ๋๋ฌธ์ ๋์ ์ธ ์นํ์ด์ง๋ฅผ ๋ง๋ค ์ ์๋ค.