[React] React ์ ํน์ง, JSX ์ดํดํ๊ธฐ
CSR ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง
data(json)๊ฐ์ ธ์ ํด๋ผ์ด์ธํธ์์ ๋ ๋๋ง ํ์ฌ ๊ฒฐ๊ณผ ๋ณด์ฌ์ค
json๋ฐ์ดํฐ๋ง ๋ฐ์์์ ํด๋ผ์ด์ธํธ ๋ ๋๋ง ํ์ฌ๋ผ
SSR ์๋ฒ ์ฌ์ด๋๋ ๋๋ง
๋๋ฅด๋ฉด ํ์ด์ง ์๋ก๊ณ ์นจ ( ํ์ด์ง ์ด๋)
html ํ์ผ์ ๊ฐ์ ธ์์ ์๋ฒ์์ ์๋ก ๋ ๋๋ง
๐ SPA ( Single Page Application )
ํ single page์์ ๋ฐ์ดํฐ ๋ณํ๊ฐ ๋ค ์ด๋ฃจ์ด์ง๋๋ก ๋ง๋ ํ์ด์ง
์๋ก๊ณ ์นจ ์์ด ๋น ๋ฅด๊ฒ ๋์ํ๋๋ก ๋ง๋ฆ
๋ฐฑ์๋ API ์ ๊ณต -> ํด๋ผ์ด์ธํธ template ์์ -> ๋ ๋๋ง
ํด๋ผ์ด์ธํธ์์ data๋ค์ ํ์ฑํ๋ฉด์ JS๊ฐ ๋ณต์กํด์ก๋ค.
๋ง์ ๋ชจ๋๋ค์ ์ด๋ป๊ฒ ๊ฐ์ฒด์งํฅํ์ผ๋ก ๋ง๋ค๊น?
๊ทธ ์ค์ ๋น๋๊ธฐ ์ด๋ฒคํธ ์ฒ๋ฆฌ๋ ์๋ฃํด์ผ ํจ
SPA๋ฅผ ์ํด ํ์ํ ๊ธฐ์
๋ผ์ฐํ
ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ ๋๋ง
์ํ๊ด๋ฆฌ
view-model ๋ฐ์ธ๋ฉ
component ๋จ์ ๊ฐ๋ฐ
SPA ํ๋ ์์ํฌ
Angular, React, Vue.js ...
๐ MVC ( Modle View Controller ) ํจํด
Action -> Controller -> Model -> View
View ์ Model์ ์ธ
Model ๋ณ๊ฒฝ -> Viwe ๋ ๋๋ง ์์์
DOM ์ access ์ธํ์ ์์ ( DOM ์ง์ ์ ๊ทผ ํ์๊ฐ ์์)
๐ Flux ํจํด
ํ ์ชฝ ๋ฐฉํฅ์ผ๋ก ํ๋ฅด๋ ํ์ด์ง ๊ตฌ์กฐ
๋ฐ์ดํฐ์ ๊ตฌ์กฐ : top-down
๋ฐ์ดํฐ ๋ณ๊ฒฝ ---> ๋ ๋๋ง
์ฆ์ ๋ ๋๋ง์ ๋จ์ ์ด ์์
๐ React
UI๋ฅผ ๋ง๋๋ JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ (ํจ์์ ์งํฉ )
component์ ๋ชจ์์ผ๋ก ์ด๋ฃจ์ด์ง
๋ณ๊ฒฝ์ฌํญ์ ํ์งํ์ฌ View ๋ ๋๋ง ์ต์ํ
๋ฐ์ดํฐ๋ฅผ ์ ์ธํด๋๋ฉด ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์๋ ๋ ๋๋ง
virtual DOM์ ๋ง๋ค์ด ๋ณ๊ฒฝ์ฌํญ์ ๊ณ์ ๋น๊ต
Browser DOM ์์๋ DOM ๋ณ๊ฒฝ ์ต์ํ ํ์ฌ ๋ฐ์
๊ธฐ์กด์ ํ๋ ์์ํฌ | React |
ํน์ ๊ฐ์ด ๋ฐ๋๋ฉด ํน์ DOM์ ์์ฑ์ด ๋ฐ๋๋๋ก ์ฐ๊ฒฐ | ํน์ ๊ฐ์ด๋ฐ๋๋ฉด ์๋ก ๋ง๋ค์ด์ ๋ณด์ฌ์ค |
์ ๋ฐ์ดํธ๋ฅผ ์ด๋ป๊ฒ ํด์ผํ ์ง ๊ณ ๋ฏผํ์ง ์์๋ ๋จ
ํ์ง๋ง ๋ชจ๋ ๊ฑธ ๋ ๋ฆฌ๊ณ ์๋ก ๋ณด์ฌ์ฃผ๋ฉด ๋๋ฌด ๋๋ฆฌ๋ ํด๊ฒฐํ๊ธฐ ์ํด ๋์จ ๋ ์์ด virtual DOM
โ ๏ธ Virtual DOM ์ด๋?
๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ๋น๊ตํ๊ธฐ ์ํ ๊ฐ์ DOM
DOM ๋ณ๊ฒฝ์ ์ต์ํํ์ฌ ๋ ๋๋ง ํ ์ ์๊ฒ ํจ
๋จ์ JS ๊ฐ์ฒด์ด๊ธฐ ๋๋ฌธ์ ์ค์ ๋ธ๋ผ์ฐ์ ์ DOM ๋ณด์ฌ์ฃผ๋ ๊ฒ๋ณด๋ค ์๋๊ฐ ํจ์ฌ ๋น ๋ฆ
โ ๋์ ๋ฐฉ์
1) ๋ฐ์ดํฐ ์ ๋ฐ์ดํธ --> ์ ์ฒด UI ๋ฅผ virtual DOM ์ ๋ฆฌ๋ ๋๋ง
2) ์ด์ virtual DOM๊ณผ ํ์ฌ virtual DOM ๋น๊ต (diff)
3) ๋ฐ๋ ๋ถ๋ถ๋ง real DOM ์ ์ ์ฉ
React๋ virtual DOM์ ํตํด ๋ ๋๋ง์ ํ๋ฒ์ผ๋ก ์ค์ฌ ํจ์จ์ ์ผ๋ก HTML์ ์ ์ดํ๊ฒ ๋จ
๋ฐ์ดํฐ์ ํ๋ฆ๊ณผ ๊ตฌ์ฑ์ ์ผ๊ด๋๊ฒ ๋ง๋ค์ด์ค
์ฝ๋๋ก ์์๋ณด๊ธฐ
react = component ๊ฐ๋ฐ๋ฐฉ์
๊ฒฐ๊ตญ Single page์๋ HTML ์ฝ๋๊ฐ ์์ -> ๋ชจ๋ HTML ์ฝ๋๋ JS์ ์์
< html >
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="theme-color" content="#000000">
<title>React App</title>
</head>
<body>
<div id="root"></div>
</body>
</html>
< index.js >
import { StrictMode } from "react";
import ReactDOM from "react-dom";
import App from "./App";
const rootElement = document.getElementById("root");
ReactDOM.render(
<StrictMode>
<App />
</StrictMode>,
rootElement
);
index.js๊ฐ entry point ๋ก ์ค์ ๋๊ณ ๋ค๋ฅธ ๋ง์ component๋ค์ ๋ถ๋ฌ์์ ์ฌ์ฉ
ReactDOM>render : ์ค์ DOM ๋ด๋ถ์ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋ง
ex) ์ ์์ : id๊ฐ "root"์ธ DOM์ ์ ํํ์ฌ ๋ ๋๋งํ๊ฒ ๋ค.
๐ JSX
์ฐธ๊ณ : (2021.03.16 - [๐ React] - [ React ] JSX ์ดํดํ๊ธฐ & Proptypes
* React์์ ์ฌ์ฉํ๋ ํ์ค html ๋ฌธ๋ฒ (์ค์ ๋ก๋ JavaScript)
* DOM API๋ฅผ ์ง์ ์ฌ์ฉํ์ง ์๊ณ ๋ DOM์ ๋ณ๊ฒฝํ ์ ์๊ฒ ํจ
* babel์ ํตํด transpiling ์ ํด์ผ ํจ
render() {
return (
<div>์๋
ํ์ธ์</div>
)
}
โป JSX ๊ท์น
1. ํ๊ทธ๋ ๊ผญ ๋ซํ์์ด์ผํจ
<div></div>
๋จ ํ๊ทธ ์ฌ์ด์ ๋ด์ฉ์ด ๋ค์ด๊ฐ์ง ์์ ๋๋ Self Closing ํ๊ทธ ๊ฐ๋ฅ
<Hello />
2. 2๊ฐ ์ด์์ ํ๊ทธ๋ ๋ฌด์กฐ๊ฑด ํ๋์ ํ๊ทธ๋ก ๊ฐ์ธ์ผ ํจ
//์ค๋ฅ
return (
<Hello />
<div>์๋
</div>
);
//OK
return (
<div>
<Hellog />
<div>์๋
</div>
</div>
);
๋ณต์กํ ๊ฒฝ์ฐ Fragment ์ฌ์ฉ ๊ฐ๋ฅ
๋ธ๋ผ์ฐ์ ์์์ ๋ณ๋์ element๋ก ๋ํ๋์ง ์์
return (
<>
<Hellog />
<div>์๋
</div>
</>
);
3. JSX ์์ JS ๊ฐ ์ฌ์ฉ ์ {}
return (
<>
<Hellog />
<div>{name}</div>
</>
);
4. class ์ค์ ์ className (o) class(x)
return (
<>
<Hello />
<div>{name}</div>
<div className="boxTitle"></div>
</>
);
5. ์ฃผ์์ {/* */}
return (
<>
{/* ์ฃผ์์
๋๋ค */}
<Hello />
<div>{name}</div>
<div className="boxTitle"></div>
</>
);
6. ์ฌ์ฉ์ ์ง์ component ์ฌ์ฉ
render() {
return (
<div>
<div>์๋
ํ์ธ์</div>
<MyList info="firstPost"></MyList>
</div>
)
}
<MyList > : ์ค์ ์กด์ฌํ๋ HTML tag (x) ์ฌ์ฉ์ Component (o)
new MyList({info: "firstPost"});
JS๋ก ํ๋ฉด ์์ ๊ฐ๋ค๊ณ ํ ์ ์์