React ๊ธฐ์ด ์ ๋ฆฌ ๐
React๋ ์น ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ํ์ ์ ๊ฐ์ ธ์จ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ. ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํด ๊ฐ๋ฐ๋์์ผ๋ฉฐ, ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ ๊ฐ๋ฐ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
React์ ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ์ React๋ฅผ ๋ฐฐ์์ผ ํ๋์ง, React์ ํน์ง, JSX์ ํ์ฉ, SPA์ ๊ฐ๋ , JSX์ ์ผ๋ฐ JavaScript์ ์ฐจ์ด์ , Component์ ๊ฐ๋ ๊ณผ ํ์ฉ, Component์ ๋ฐ์ดํฐ ๊ด๋ฆฌ ๋ฐฉ๋ฒ๋ฑ์ ๋ํด ์์๋ณด์.
React๋? ๐ค
- ์ ์: React๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ. Facebook์์ ๊ฐ๋ฐํ์๊ณ , ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ ๊ฐ๋ฐ์ ์งํฅํ๋ค.1
- ํน์ง:
- Component: ๋ ๋ฆฝ์ ์ธ ๋จ์๋ก ์ชผ๊ฐ์ด ๊ตฌํ๋๋ฉฐ, ๋ ๊ณ ๋ธ๋ญ์ฒ๋ผ ์ฌ๋ฌ ์ปดํฌ๋ํธ๋ค์ ์กฐ๋ฆฝํ์ฌ ํ ํ์ด์ง๋ฅผ ์์ฑํ๋ค.
- Virtual DOM: ๊ฐ์์ DOM์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ณ , ์ค์ DOM๊ณผ ๋๊ธฐํํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ . ์ด๋ฅผ ํตํด ์ฑ๋ฅ์ ํฅ์์ํจ๋ค.
- JSX: JavaScript ๋ด์์ HTML๊ณผ ์ ์ฌํ ๋ฌธ๋ฒ์ ์ฌ์ฉํ์ฌ UI๋ฅผ ํํํ๋ค. ์ด๋ก ์ธํด ๊ฐ๋ฐ์๋ ๋ณด๋ค ์ง๊ด์ ์ผ๋ก UI๋ฅผ ๊ตฌ์ฑํ ์ ์๋ค.
SPA (Single Page Application)์ ์ ํต์ ์ธ ์ฌ์ดํธ ๋น๊ต ๐
-
์ ํต์ ์ธ ์ฌ์ดํธ: ํ์ด์ง ๋ณ๊ฒฝ์ด ํ์ํ ๋๋ง๋ค ์๋ฒ์ ์์ฒญํ์ฌ ์๋ก์ด HTML์ ๋ฐ์์ค๋ ๋ฐฉ์. ์ด ๊ณผ์ ์์ ํ์ด์ง ์ ์ฒด๋ฅผ ์๋ก ๋ถ๋ฌ์จ๋ค.
-
SPA: ์ด๊ธฐ ๋ก๋ฉ ์ ์๋ฒ๋ก๋ถํฐ HTML์ ๋ฐ์์จ ํ, ์ดํ์ ํ์ด์ง ๋ณ๊ฒฝ์ AJAX ํต์ ์ ํตํด ํ์ํ ๋ฐ์ดํฐ๋ง JSON ํํ๋ก ๋ฐ์์์ ํด๋ผ์ด์ธํธ์์ ๋ ๋๋งํ๋ค. ์ด ๋ฐฉ์์ React๋ฅผ ํฌํจํ ํ๋์ ์ธ JavaScript ํ๋ ์์ํฌ/๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ๋๋ฆฌ ์ฌ์ฉ๋๋ค.
React๋ฅผ ๊ณต๋ถํด์ผ ํ๋ ์ด์ ๐
- ์์ฐ์ฑ๊ณผ ์ฌ์ฌ์ฉ์ฑ: ์ปดํฌ๋ํธ์ Hook์ ํ์ฉํ์ฌ ๊ฐ๋ฐ์์ ์์ฐ์ฑ์ ๋์ด๊ณ , ์ฝ๋์ ์ฌ์ฌ์ฉ์ฑ์ ์ฆ๊ฐ์ํจ๋ค.
- ํ๋ถํ ์๋ฃ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: React๋ ๋๋ฆฌ ์ฌ์ฉ๋๊ธฐ ๋๋ฌธ์ ๋ค์ํ ์๋ฃ์ ์คํ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฝ๊ฒ ์ฐพ์ ์ ์๋ค.
- ๋ค์ํ ์ฌ์ฉ์ฒ: React๋ฅผ ๋ฐฐ์ฐ๋ฉด ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ฟ๋ง ์๋๋ผ React Native๋ฅผ ํตํด ๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์๋ ํ์ฉํ ์ ์๋ค.
React๋ฅผ ๋ฐฐ์ฐ๋ ๊ฒ์ ํ๋ ์น ๊ฐ๋ฐ์ ํธ๋ ๋๋ฅผ ๋ฐ๋ผ๊ฐ๋ ๋ฐ ์์ด ํ์์ ์ธ ์์๊ฐ ๋์๋ค๊ณ ํ ์ ์๋ค. ์์ํ๊ธฐ ์ ์, ๊ธฐ๋ณธ์ ์ธ JavaScript ์ง์์ ๊ฐ์ถ๋ ๊ฒ์ด ์ข๋ค. React์ ์ธ๊ณ๋ก! ๐
React์ ํต์ฌ ํน์ง ์ ๋ฆฌ ๐
React๋ ํ๋ ์น ๊ฐ๋ฐ์์ ์ค์ํ ์ญํ ์ ํ๋ JavaScript ๋ผ์ด๋ธ๋ฌ๋ฆฌ. React์ ์ฃผ์ ํน์ง๋ค์ ์ข ๋ ์์ธํ ์ดํด๋ณด์.2
HTML๊ณผ JS ํจ๊ป ์ฌ์ฉํ๊ธฐ ๐
-
์ ํต์ ์ธ ๋ฐฉ์ (jQuery ์ฌ์ฉ ์): HTML ์์๋ฅผ JavaScript๋ก ๋์ ์ผ๋ก ์ถ๊ฐํ๋ ๋ฐฉ์. ์ฝ๋๊ฐ ๋ณต์กํด์ง๊ณ ์ ์ง๋ณด์๊ฐ ์ด๋ ค์์ง ์ ์๋ค.
$("#todo-list").append( "<li><span>" + value + "</span><button type='button' class='complete'>complete</button> <button type='button' class='delete'>delete</button></li>" )
-
React ๋ฐฉ์ (JSX ์ฌ์ฉ ์): HTML๊ณผ JavaScript๋ฅผ ํจ๊ป ์ฌ์ฉํ์ฌ UI๋ฅผ ์ ์ธ์ ์ผ๋ก ํํํ๋ค. ์ฝ๋๊ฐ ๋ ๊ฐ๊ฒฐํ๊ณ ์ดํดํ๊ธฐ ์ฝ๋ค.
<ol id="todo-list"> {todoList.map((item, index) => ( <li className={item.isCompleted ? "completed" : ""}> <span>{item.value}</span> <button onClick={() => handleCompleteClick(index)}>complete</button> <button onClick={() => handleDeleteClick(index)}>delete</button> </li> ))} </ol>
Component ๊ธฐ๋ฐ ๊ฐ๋ฐ ๐ ๏ธ
-
React๋ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ผ๋ก ๊ฐ๋ฐ๋๋ค. ๊ฐ ์ปดํฌ๋ํธ๋ ๋ ๋ฆฝ์ ์ธ ๋จ์๋ก, ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ฉฐ, ๋ณต์กํ UI๋ ์ฝ๊ฒ ๊ตฌ์ฑํ ์ ์๋ค.
const App = () => { const text = "hello world" return <span>{text}</span> }
State๋ฅผ ํตํ ๋ฐ์ดํฐ ๊ด๋ฆฌ ๐
- React์์๋ state๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํฌ๋ํธ์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ค. state๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ปดํฌ๋ํธ๋ ์๋์ผ๋ก ๋ค์ ๋ ๋๋ง๋๋ค.
const [todoList, setTodoList] = useState([]) const [inputValue, setInputValue] = useState("")
React์ ์ด๋ฌํ ํน์ง๋ค์ ๊ฐ๋ฐ์๊ฐ ๋ ํจ์จ์ ์ผ๋ก ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์๋๋ก ๋๋๋ค. JSX, ์ปดํฌ๋ํธ, ๊ทธ๋ฆฌ๊ณ ์ํ ๊ด๋ฆฌ๋ React ๊ฐ๋ฐ์ ํต์ฌ์ ์ด๋ฃจ๋ฉฐ, ์ด๋ฅผ ํตํด ๋ ๋์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋ค. React๋ฅผ ๋ฐฐ์ฐ๊ณ ์ถ๋ค๋ฉด, ์ด๋ฌํ ๊ฐ๋ ๋ค์ ๊น์ด ์ดํดํ๋ ๊ฒ์ด ์ค์! ๐
Create React App(CRA) ๋ฐ Node.js, NPM์ ๋ํ ์ ๋ฆฌ ๐
Create React App(CRA)์ React ํ๋ก์ ํธ๋ฅผ ์ฝ๊ฒ ์์ํ ์ ์๊ฒ ํด์ฃผ๋ ๋๊ตฌ.3 Facebook์ ์ํด ๋ง๋ค์ด์ก์ผ๋ฉฐ, ํ๋ก์ ํธ ์์ฑ๋ถํฐ ๋ค์ํ ๊ฐ๋ฐ ๋๊ตฌ๋ฅผ ์ ๊ณตํ๋ค. Node.js์ NPM์ CRA๋ฅผ ์ฌ์ฉํ์ฌ React ํ๋ก์ ํธ๋ฅผ ์์ํ ๋ ํ์์ ์ธ ํ๊ฒฝ์ด๋ค.
Create React App(CRA) ๐ ๏ธ
- ๊ฐ์: React ํ๋ก์ ํธ๋ฅผ ์ฝ๊ฒ ์์ฑํ ์ ์๋๋ก ๋์์ฃผ๋ Boilerplate. ์ง์ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐํ์ฌ ์ฌ์ฉํ๋ ๊ฒ๋ ๊ฐ๋ฅํ์ง๋ง, CRA๋ฅผ ์ฌ์ฉํ๋ฉด ๋ ํธ๋ฆฌํ๋ค.
- ์ฅ์ :
- ๊ฐ๋ฐ์ ์ง์คํ ์ ์๋๋ก ํ๊ฒฝ์ ๊ตฌ์ฑํด์ค๋ค.
- ๋ค์ํ ๋ธ๋ผ์ฐ์ ์์ ์๋ํ ์ ์๋๋ก transcompile์ ์ง์ํ๋ค. (์: babel, webpack)
- ์ฌ์ฉ ๋ฐฉ๋ฒ:4
npx create-react-app <directory name> cd <directory name> npm start
- ๊ณต์ ๋ฌธ์ ๋ฐ ์์ธํ ์ ๋ณด
Node.js์ NPM ๐
- Node.js:
- ์๋ฒ ํ๋ก๊ทธ๋๋ฐ์ ์ฃผ๋ก ์ฌ์ฉ๋๋ JavaScript ๊ธฐ๋ฐ์ ์ํํธ์จ์ด ํ๋ซํผ.
- ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๊ฐ ์๋ฒ ๊ฐ๋ฐ์ ์ฝ๊ฒ ์ ๊ทผํ ์ ์๋๋ก ๋์์ค๋ค.
- CRA๋ฅผ ์ฌ์ฉํ React ํ๋ก์ ํธ ์์ฑ ์ ๊ฐ๋ฐ ํ๊ฒฝ ๋ฐ ํ ์คํธ ์๋ฒ๋ก ํ์ฉ๋๋ค.
- NPM (Node Package Manager):
- Node.js ํ๊ฒฝ์์ ์ฌ์ฉํ ์ ์๋ ํจํค์ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ์ ์ฅ์.
- ํจํค์ง ๊ด๋ฆฌ์ ์๋ฒ ์คํ, ๊ด๋ฆฌ์ ํ์ํ ๋ค์ํ ๋ช ๋ น์ด๋ฅผ ์ ๊ณตํ๋ค.
- ์ค์น ๋ฐ ์ฌ์ฉ:
- Node.js ์ค์น:
- Node.js ๊ณต์ ํํ์ด์ง ์์ LTS ๋ฒ์ ์ ๋ค์ด๋ก๋ํ๊ณ ์ค์นํ๋ค.
- ๋ฒ์ ํ์ธ:
node -v
๋ช ๋ น์ด๋ก ์ค์น๋ Node.js ๋ฒ์ ์ ํ์ธํ ์ ์๋ค.
- Node.js ์ค์น:
React ํ๋ก์ ํธ ์์ฑ ๊ณผ์ ๐ฆ
- Node.js ์ค์น: ์์์ ์ธ๊ธํ ๋๋ก LTS ๋ฒ์ ์ ์ค์น.
- ํ๋ก์ ํธ ์์ฑ:
npx create-react-app <directory name>
๋ช ๋ น์ด๋ฅผ ์ฌ์ฉ. - ํ๋ก์ ํธ ์คํ: ์์ฑ๋ ๋๋ ํ ๋ฆฌ๋ก ์ด๋ํ ํ npm start ๋ช ๋ น์ด๋ก ํ๋ก์ ํธ๋ฅผ ์คํ.
npm ๋ช ๋ น์ด ๐
npm install
: package.json์ ์ ์๋ ์์กด์ฑ ํจํค์ง๋ค์ ์ค์น.npm install <package name>
: ์ํ๋ ํจํค์ง๋ฅผ ์ค์น.npm install <package name>@<version>
: ํน์ ๋ฒ์ ์ ํจํค์ง๋ฅผ ์ค์น.npm install <git repository ์ฃผ์>
: git repository๋ก๋ถํฐ ํจํค์ง๋ฅผ ์ค์น.npm start
: Node.js๋ฅผ ์ด์ฉํด ํ๋ก์ ํธ๋ฅผ ์คํ.npm build
: ํ๋ก์ ํธ๋ฅผ ๋น๋.- ๋ ๋ง์ ๋ช ๋ น์ด ์ฐธ๊ณ
CRA, Node.js, NPM์ ํ์ฉํ๋ฉด React ํ๋ก์ ํธ๋ฅผ ํจ์จ์ ์ผ๋ก ์์ํ๊ณ ๊ด๋ฆฌํ ์ ์๋ค. ์ด ๋๊ตฌ๋ค์ ํ๋ ์น ๊ฐ๋ฐ์์ ์ค์ํ ์ญํ ์ ํ๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ๋ ๋์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋๋ก ๋๋๋ค. ๐
React ํ๋ก์ ํธ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ ๋ฐ JSX ์๊ฐ ๐
React ํ๋ก์ ํธ๋ฅผ ์์ํ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ช ๊ฐ์ง ์ฃผ์ ๋๋ ํ ๋ฆฌ์ ํ์ผ์ด ์์ฑ๋๋ค. ์ด๋ค์ ํ๋ก์ ํธ์ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํ๋ค. ๋ํ, JSX๋ React ๊ฐ๋ฐ์์ ํต์ฌ์ ์ธ ์ญํ ์ ํ๋ ๋ฌธ๋ฒ์ผ๋ก, HTML๊ณผ ์ ์ฌํ์ง๋ง JavaScript๋ฅผ ํ์ฅํ ๋ฌธ๋ฒ์ด๋ค.5
Directory ๊ตฌ์กฐ ๐
./node_modules/
: npm์ ์ด์ฉํด ์ค์นํ ํจํค์ง ๋ชจ์../public/
: ์ ์ ์ธ ํ์ผ๋ค(HTML, ์ด๋ฏธ์ง ๋ฑ)์ ๋ชจ์../src/
: ๋ฆฌ์กํธ ๊ฐ๋ฐ์ ์ํ ์ฃผ์ ์์ค ํ์ผ๋ค์ด ์์นํ๋ค../.gitignore
: git์ ์ฌ๋ฆฌ์ง ์์ ํ์ผ ์ค์ ์ ํฌํจํ๋ค../package.json
: ํ๋ก์ ํธ ๊ด๋ จ ์ ๋ณด์ ์ฌ์ฉ ํจํค์ง ๋ช ์ธ ํ์ผ. ํจํค์ง ๋ฒ์ ์ ^, <=, >= ๋ฑ์ ๊ธฐํธ๋ก ๋ฒ์๋ฅผ ํํํ ์ ์๋ค../README.md
: ํ๋ก์ ํธ์ ๊ดํ ์ค๋ช ์ ์์ฑํ๋ ํ์ผ.
์ค์นํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ถ๋ฌ์ค๊ธฐ ๐
import "package name" // CSS๋ import๋ง์ผ๋ก ์ญํ ์ ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
import something from "package name" // ๊ธฐ๋ณธ์ ์ผ๋ก ๋ถ๋ฌ์ ํ์ฉํ ๋
import { a, b } from "package name" // ํจํค์ง ๋ด ์ผ๋ถ๋ง ๊ฐ์ ธ์ฌ ๋
import * as something from "package name" // default๋ก export๋์ง ์์ ๊ฒฝ์ฐ
JSX ์๊ฐ โจ
JSX๋ JavaScript๋ฅผ ํ์ฅํ ๋ฌธ๋ฒ์ผ๋ก, UI๊ฐ ์ด๋ป๊ฒ ์๊ฒจ์ผ ํ๋์ง ์ค๋ช ํ๊ธฐ ์ํด React์ ํจ๊ป ์ฌ์ฉ๋๋ค. JSX๋ React "์๋ฆฌ๋จผํธ"๋ฅผ ์์ฑํ๋ฉฐ, HTML๊ณผ ์ ์ฌํ ์๊น์๋ฅผ ๊ฐ์ง์ง๋ง JavaScript์ ๋ชจ๋ ๊ธฐ๋ฅ์ ํฌํจํ๋ค6.
JSX์ ์ฅ์
- ๊ฐ๋ฐ์ ํธ์์ฑ์ ํฅ์
- ํ์ ์ฉ์ด ๋ฐ ์์ฐ์ฑ์ ํฅ์
- ๋ฌธ๋ฒ ์ค๋ฅ ๋ฐ ์ฝ๋๋ ๊ฐ์
JSX์ ํน์ง
- HTML ํ๊ทธ ๋ด์์ JavaScript ์ฐ์ฐ์ ๊ฐ๊ฒฐํ๊ฒ ํํํ ์ ์๋ค.
- HTML๊ณผ์ ์ฐจ์ด์ ์ผ๋ก๋ class ๋์ className์ ์ฌ์ฉํ๊ณ , ์คํ์ผ์ ๊ฐ์ฒด ํํ๋ก ํํํ๋ค.
- ๋ซ๋ ํ๊ทธ๊ฐ ํ์์ด๋ฉฐ, ์ต์๋จ element๋ ๋ฐ๋์ ํ๋์ฌ์ผ ํ๋ค.
JSX์ JavaScript์ ์ฐจ์ด์
- JSX๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ฉฐ, HTML์ฒ๋ผ ๋ณด์ด์ง๋ง ์ค์ ๋ก๋ JavaScript์.
- React์์๋ JSX๋ฅผ ํตํด ์ปดํฌ๋ํธ๋ฅผ ์ ์ํ๊ณ , ์ด๋ฅผ ํตํด UI๋ฅผ ๊ตฌ์ฑํ๋ค. ์ด๋ ๊ธฐ์กด JavaScript์ HTML์ ์ฌ์ฉํ๋ ๋ฐฉ์๊ณผ๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํ๋ค7.
JSX๋ React ๊ฐ๋ฐ์์ ์ค์ํ ์ญํ ์ ํ๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ๋ณด๋ค ํจ์จ์ ์ผ๋ก UI๋ฅผ ๊ตฌ์ฑํ ์ ์๋๋ก ๋๋๋ค. React ํ๋ก์ ํธ์ ๊ตฌ์กฐ์ JSX์ ๋ํด ์ดํดํ๋ฉด, React ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์์ด ํจ์ฌ ๋ ํธ๋ฆฌํ๊ฒ ์ ๊ทผํ ์ ์๋ค. ๐
๋ธ๋ผ์ฐ์ ์ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐ UI ์ ๋ฐ์ดํธ ๋ฐฉ๋ฒ ๐พ๐
๋ธ๋ผ์ฐ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ UI๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ์ ๊ธฐ์ ์คํ์ ๋ฐ๋ผ ๋ค๋ฅด๋ค. JavaScript์ React๋ ์ด๋ฌํ ์์ ์ ์ฒ๋ฆฌํ๋ ๋ฐ ์์ด ์๋ก ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํ๋ค.
๋ธ๋ผ์ฐ์ ์ ๋ฐ์ดํฐ ์ ์ฅ ๋ฐฉ๋ฒ
JavaScript
- ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ ์ฃผ๋ก DOM์ ์ ์ฅ๋๋ค. DOM์ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ง๋ค๊ณ ์ ์ง ๊ด๋ฆฌํ๋ ์ ์ฒด HTML์ ๋ํ๋ธ๋ค.
- ์ฌ์ฉ์๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅํ๋ฉด, ๊ฐ๋ฐ์๋ DOM์์ ํด๋น ๊ฐ์ ์ฐพ์ ์ถ์ถํด์ผ ํ๋ค. ์ด ๊ณผ์ ์ ๊ด๋ฆฌ๊ฐ ๋ฒ๊ฑฐ๋ก์ธ ์ ์๋ค8.
React
- React์์๋ ์ ์ด ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ ๋ ฅ์ ๊ธฐ๋ฐ์ผ๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ์ ๋ฐ์ดํธํ๋ค. ์ด๋ DOM์ ์์กดํ์ง ์๊ณ JS ๋ณ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ๋ฅผ ์ ์ฅํจ์ผ๋ก์จ ์ด๋ฃจ์ด์ง๋ค.
- ์ด ๋ฐฉ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฑ์ฅํจ์ ๋ฐ๋ผ ๋์ฑ ์ค์ํด์ง๋ฉฐ, ์ฝ๋ ๊ด๋ฆฌ๊ฐ ํธ๋ฆฌํด์ง๋ค.
UI ์ ๋ฐ์ดํธ ๋ฐฉ๋ฒ
JavaScript
- UI ์ ๋ฐ์ดํธ๋ฅผ ์ํด, ๊ฐ๋ฐ์๋ DOM์์ ์์๋ฅผ ์ฐพ๊ณ , ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ค์ ํ์ฌ ์ฌ์ฉ์ ์ํธ์์ฉ์ ๋ฐ์ํด์ผ ํ๋ค. ์ด ๊ณผ์ ์ ๋ณต์กํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์ธ ์ ์๋ค.
React
- React๋ ์ํ ๊ด๋ฆฌ๋ฅผ ํตํด UI๋ฅผ ์๋์ผ๋ก ์ ๋ฐ์ดํธํ๋ค. ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ฉด React๋ ์ด๋ฅผ ๊ฐ์งํ๊ณ ํ์ํ UI ๋ถ๋ถ๋ง์ ํจ์จ์ ์ผ๋ก ์ ๋ฐ์ดํธํ๋ค.
- ์ด๋ ๊ฐ๋ฐ์๊ฐ UI ์ ๋ฐ์ดํธ ๋ก์ง์ ์ง์คํ๊ธฐ๋ณด๋ค๋ ์ฌ์ฉ์์์ ์ํธ์์ฉ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๊ด๋ฆฌ์ ๋ ์ง์คํ ์ ์๊ฒ ํด์ค๋ค9.
๋ธ๋ผ์ฐ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ UI๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ์ ๊ธฐ์ ์ ์ ํ์ ๋ฐ๋ผ ํฌ๊ฒ ๋ฌ๋ผ์ง ์ ์๋ค. JavaScript๋ ์ง์ ์ ์ธ DOM ์กฐ์์ ์์กดํ๋ ๋ฐ๋ฉด, React๋ ์ํ ๊ด๋ฆฌ๋ฅผ ํตํด ๋ณด๋ค ์ ์ธ์ ์ด๊ณ ํจ์จ์ ์ธ ๋ฐฉ์์ ์ ๊ณตํ๋ค. ์ด๋ฌํ ์ฐจ์ด์ ์ ์ดํดํ๋ ๊ฒ์ ์น ๊ฐ๋ฐ์์ ์ค์ํ ์์ ์ค ํ๋. ๐
React ์ปดํฌ๋ํธ ๐จ
React์์ ํ์ด์ง๋ฅผ ๊ตฌ์ฑํ๋ ๊ธฐ๋ณธ ๋จ์์ธ ์ปดํฌ๋ํธ์ ๋ํด ์์๋ณด์. ์ปดํฌ๋ํธ๋ React ์ ํ๋ฆฌ์ผ์ด์ ์ ํต์ฌ ์์๋ก, ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋์ ๋ธ๋ก์ ์ ๊ณตํ๋ค.
์ปดํฌ๋ํธ๋? ๐ค
- React์์์ ์ญํ : ํ์ด์ง๋ฅผ ๊ตฌ์ฑํ๋ ์ต์ ๋จ์๋ก, ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ UI ์กฐ๊ฐ.
- ๋ค์ด๋ฐ ๊ท์น: ์ปดํฌ๋ํธ์ ์ด๋ฆ์ ๋๋ฌธ์๋ก ์์ํ๋ค. ์ด๋ ์ผ๋ฐ HTML ์์์ ๊ตฌ๋ณํ๊ธฐ ์ํจ์.
์ปดํฌ๋ํธ์ ์ข ๋ฅ
- Class ์ปดํฌ๋ํธ: ์ด๊ธฐ React์์ ์ฃผ๋ก ์ฌ์ฉ๋์์ผ๋ฉฐ, Java ๊ฐ๋ฐ์์๊ฒ ์น์ํ ๊ฐ๋ . React์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ฝ๊ฒ ํ์ ํ ์ ์๋ค.
- Function ์ปดํฌ๋ํธ: React v16๋ถํฐ ์ถ๊ฐ๋ ๊ธฐ๋ฅ์ผ๋ก, ํ์ฌ๋ ๋๋ถ๋ถ์ ์ปดํฌ๋ํธ๊ฐ ์ด ํํ๋ก ์ฌ์ฉ๋๋ค. Hook์ ์ฌ์ฉํ์ฌ ์ํ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
Controlled Component์ Uncontrolled Component
- Controlled Component: form์ ํตํด ์ ๋ ฅ์ ๋ฐ์ ๋, ๊ฐ input์ ๋ฐ์ดํฐ๋ฅผ state๋ฅผ ํตํด ์ง์ ๊ด๋ฆฌํ.
- Uncontrolled Component: React๋ก input์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ๊ด๋ฆฌํ์ง ์๊ณ , ํ์ํ ๋ DOM์์ ์ง์ ๊ฐ์ ๊ฐ์ ธ์จ๋ค.
์ปดํฌ๋ํธ์ ํน์ง
- Props(Properties): ์ปดํฌ๋ํธ์ ์์ฑ์ผ๋ก, ์์ ์ปดํฌ๋ํธ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ๋ฐ๋๋ค.
- Children: ์ปดํฌ๋ํธ ์์ ์์ฑ๋ ํ์ ์์๋ก, props์ ์ผ๋ถ๋ก ์ทจ๊ธ๋๋ค.
์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ ๊ด๋ฆฌ
- Props๋ฅผ ํตํ ๋ฐ์ดํฐ ์ ๋ฌ: ์ปดํฌ๋ํธ ๊ฐ ๋ฐ์ดํฐ๋ props๋ฅผ ํตํด ๋ถ๋ชจ์์ ์์์ผ๋ก ์ ๋ฌ๋๋ค.
- State๋ฅผ ํตํ ๋ด๋ถ ๋ฐ์ดํฐ ๊ด๋ฆฌ: ์ปดํฌ๋ํธ ๋ด์์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ๋๋ state๋ฅผ ์ฌ์ฉํ๋ค.
React ์ปดํฌ๋ํธ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํ๋ ๋ฐ ์์ด ๋งค์ฐ ์ค์ํ ์ญํ ์ ํ๋ค. ์ปดํฌ๋ํธ๋ฅผ ํตํด UI๋ฅผ ๋ชจ๋ํํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์์ฑํ์ฌ, ๊ฐ๋ฐ ๊ณผ์ ์ ํจ์จ์ ์ผ๋ก ๋ง๋ค ์ ์๋ค. ๋ฐ์ดํฐ ๊ด๋ฆฌ์ ๋ํ ๋ ์์ธํ ์ ๋ณด๋ ์ฌ๊ธฐ์์ ํ์ธํ ์ ์๋ค. ๐
- https://ko.legacy.reactjs.org/tutorial/tutorial.htmlโฉ
- https://www.elancer.co.kr/blog/view?seq=167โฉ
- https://create-react-app.dev/โฉ
- https://legacy.reactjs.org/docs/create-a-new-react-app.htmlโฉ
- https://ko.legacy.reactjs.org/docs/introducing-jsx.htmlโฉ
- https://ko.legacy.reactjs.org/docs/introducing-jsx.htmlโฉ
- https://www.w3schools.com/react/react_css.aspโฉ
- https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Client-side_web_APIs/Client-side_storageโฉ
- https://www.linkedin.com/pulse/understanding-react-reconciliation-heartbeat-ui-updates-rostamiโฉ