์ด๋ฒ 4์ฃผ์ฐจ Weekly Paper ์์๋
- ์ด๋ฒ์ฃผ ๊ฐ์ ํ๊ธฐ ๋ฐ ์ค์ค๋ก์ ๋ํ ํผ๋๋ฐฑ
- React๊ฐ ๋ ๋๋ง ํ๋ ๋ฐฉ์
- React์์ Virtual Dom์ด ๋ฌด์์ธ์ง
- React์์์ ์ปดํฌ๋ํธ๋ ๋ฌด์์ธ์ง
- ํจ์ํ ์ปดํฌ๋ํธ, ํด๋์ค ์ปดํฌ๋ํธ์ ์ฐจ์ด์
์ ๋ค๋ฃน๋๋ค.
์ด๋ฒ์ฃผ์ ์ฃผ๋ก ๋ฐฐ์ด๊ฒ
๋น๋๊ธฐ, API์์ฒญ, ๋ชจ๋ ๊ฐ๋
์ด์๋ค.
async/await then์ด๋ try/catch
axios๋ node.js๊ฐ์๊ฒ๋ค ?
๋ญ๊ฐ ๋ฐฐ์ฐ๋ฉด ๋ฐฐ์ธ์๋ก ํ ์์๋ ํญ์ด ๋์ด์ง๋๊ฒ ๊ฐ์์
์ฌ๋ฐ๊ธฐ๋ ํ๋ค, ์ค์ต์๊ฐ์ด ์กฐ๊ธ ์ฌ์ ๊ฐ ์๋ํธ์ด๋ผ
๊ทธ๋ฅ ๋ฐ์๊ฑฐ๋ก ์ด๋์ ๋ ๋ง๋ค์ด๋ณด๊ณ ์๋๋ฐ
๋ญ๊ฐ ์๊ฐํ๋๊ฒ ์กฐ์กํ๊ฒ๋๋ง ๋ง๋ค์ด์ง๊ธด ํ๋๊น
์ฌ๋ฐ๊ธฐ๋ ํ๊ณ , ๋์ค์ ์ข ๋ ๋ฐฐ์ฐ๊ณ ๋๋ฉด
์ข ์ ๋๋ก ์ฌ์ด๋ ํ๋ก์ ํธ ํ๋ ํด๋ณด๊ณ ์ถ๋ค!
๊ทผ๋ฐ ์๋ฌด๋๋ ๋ญ๊ฐ ์ฝ๋๋ฅผ ์ชผ๊ฐ ๋ค๊ณ ํด์ผํ๋?
๊ทธ๋ฐ ๊ฐ๋
์ ์์ด์ ์์ง ์๊ฐ์ ํ์ด ๋ ์ด๋ ค์๋๊ฑฐ๊ฐ๋ค.
๋ค๋ฅธ์ฌ๋๋ค ์ฝ๋๋ณด๋ฉด ์~ ์ด๋ ๊ฒ๋ ์ง๋๊ตฌ๋ ์ถ์๋ฐ
์์ง ๊ทธ ์ ๋๊น์ง๋ ์๊ฐ์ด ๋๋ฌํ์ง ์๋๊ฒ๊ฐ๊ณ ..
axios๊ฐ ์ง์ง ๋ง๋์๋๊ฒ ํธํ๋ค๋๊ฑฐ๋ ์ ์์๋ค..
์! ๊ทธ๋ฆฌ๊ณ ํํธ1์ด ๋๋ฌ๋ค!!
๋ฒ์จ ํ๋ฌ์ง๋ฌ๋ค๊ณ ? ๋ง์ด ์๋๋ค..
์ด๋ฒ์ฃผ ์ค๊ธฐ๋ ์๋ฌด๋๋ API์์ฒญ ์ด ๋ฉ์ธ์ด๋ค๋ณด๋
๋ฑํ ์คํฌ๋ฆฐ์ท์ ๋จ๊ธธ๊ฑด ์์ด์..
์๋ง ๋ค์์ฃผ์ ์ค์ ๋ก ๊ตฌํํ๊ณ ๋๋ฉด ์ฌ๋ฆฌ์ง ์์๊น?
๊ทธ๋ฆฌ๊ณ ์ด๋์ ๋ ์ฐพ๋ค๊ฐ JSDoc ๋ ํผ๋ฐ์ค ๋ผ๋๊ฑธ ์ฐพ์๋๋ฐ
์ด๊ฑฐ ์ง์ง ๊ด์ฐฎ์๊ฒ๊ฐ๋ค.
์ข ์~์ ์ ์ง๋ ํจ์๊ฐ์๊ฑฐ
์.. ์ด๊ฑฐ ๋ญ๋๋ผ ์ถ์ ๊ฒฝ์ฐ๊ฐ ์๋๋ฐ
๋ฐ๋ก๋ฐ๋ก ์๋ ค์ฃผ๋๊น ์ ๋ง์ข์
๊ทธ๋ฌ๋ฉด ๋ณธ๋ฌธ์ผ๋ก!
Virtual DOM์ ๋ญ๊น?
์ผ๋จ ํ๋ฒ ์ง๊ณ ๋์ด๊ฐ๋ณด์.
์ด Virtual DOM์ React Element๋ผ๋ ๊ฐ์ฒด๊ฐ๋ค์ ๋ชจ์์ด๊ณ
๊ฒฐ๋ก ์ ์ผ๋ก๋ ๊ทธ๋ฅ "๊ฐ"์ด๋ค, JS์ ๊ฐ์ด๊ณ , ๊ฐ์ฒดํํ๋ฅผ ๊ฐ์ง๋ค.
์ค์ DOM์ด๋ผ๊ณ ๋ ํ ์ ์๊ณ , ๋ณต์ฌ๋ณธ์ ๋์ ํด๋นํ๋ค.
๋ผ๊ณ ์ค๋ช ํ ์๋ ์๊ณ .
Virtual DOM(VDOM)์ UI์ ์ด์์ ์ธ ๋๋ ๊ฐ์(Virtual)์ ์ธ ํํ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅ๋๊ณ ReactDOM๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด "์ค์ " DOM๊ณผ ๋๊ธฐํ ํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ ์ด๋ค, ๊ทธ๋ฆฌ๊ณ ์ด ํ๋ก์ธ์ค๋ฅผ ์ฌ์กฐ์ (Reconciliation)์ด๋ผ ๋ถ๋ฅธ๋ค.
๋ผ๊ณ ๋ฆฌ์กํธ ๊ณต์๋ฌธ์์์๋ ์ค๋ช ํ๊ณ ์๋ค.
React Element๊ฐ ๋ญ์ง, ๋์ ๋ณต์ฌ๋ณต์ ๋์ ํด๋นํ๋ค๋๊ฒ ๋ญ์๋ฆฌ์ธ์ง
DOM๊ณผ ๋๊ธฐํํ๋๊ฒ ๋ญ๊ณ , ์ฌ์กฐ์ ์ด ์ ํํ ๋ญ์ง, ์์ง ๋ชจ๋ฅผ ์ ์๋ค.
๋น์ฅ์ ๋๋์ด ์ค์ง ์์๋,
์๋์์ ๋ ๋๋ง ๋ฐฉ์์ ์ดํดํ๋ค๋ณด๋ฉด ๊ฐ์ด ์ฌ๊ฒ์ด๋ค!
์ผ๋จ React๋ ๋ญ๊น?
React๋ ์น์ฌ์ดํธ๋ ์ฑ์ ํ๋ฉด์
๋ณด๋ค ์ฝ๊ฒ ๋ง๋ค๊ณ ๊ด๋ฆฌํ ์ ์๊ฒ ํด์ฃผ๋ JS๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค.
์ฐ๋ฆฌ๊ฐ ์น์ฌ์ดํธ๋ฅผ ๋ง๋ค๋
React๋ ์ฌ๋ฌ๊ฐ์ ์์ ๋จ์๋ก ํ๋ฉด์ ๋๋์ด ์๊ฐํ ์ ์๊ฒ ๋์์ค๋ค.
์ด ์์ ๋จ์, ํ๋ฉด์ ๊ตฌ์ฑํ๋ ์กฐ๊ฐ๋ค์
์ฐ๋ฆฌ๋ "์ปดํฌ๋ํธ"๋ผ๊ณ ๋ถ๋ฅด๊ณ ,
์ด ์ปดํฌ๋ํธ๋ ์ ๋ถ ๊ฐ๊ฐ ํ๋์ ์ฝ๋๋ธ๋ก๋ค์ด๋ค.
๊ฒ์์ฐฝ์ด๋ ๋ฒํผ์ด๋ ์
๋ ฅ์ฐฝ์ด๋ ๋ฉ๋ด๋ ๊ด๊ณ์์ด
๊ฐ๊ฐ์ ๋ถ๋ถ๋ค์ ๋ชจ๋ ์ปดํฌ๋ํธ๋ก ๋ง๋ค ์ ์์ผ๋ฉฐ
์ฐ๋ฆฌ๋ ์ด๊ฒ๋ค์ ์ด์ฉํด ๋ณต์กํ ์นํ์ด์ง๋ค์
์์ ๋จ์๋ก ๋๋ ๋ณด๋ค ์ฝ๊ฒ ๋ง๋ค๊ณ ์์ ํ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ React์์ ์ด "์ปดํฌ๋ํธ"๋ฅผ ๋ง๋๋ ๋ฐฉ๋ฒ์๋ ๋๊ฐ์ง๊ฐ ์๋๋ฐ,
ํ๋๋ "ํจ์ํ ์ปดํฌ๋ํธ"
ํ๋๋ "ํด๋์ค ์ปดํฌ๋ํธ"๋ค.
๊ฐ๊ฐ์ ๋ํด ์์ ๋ณด๊ธฐ ์ ,
๋ฆฌ์กํธ์ State์ Lifecycle์ ๋ํด ํ๋ฒ๋ง ์ฝ์ด๋ณด๊ณ ๊ฐ์!
React ์ปดํฌ๋ํธ ๋ด์์ ๋ณํํ๋ ๋ฐ์ดํฐ๋ค์(์ด๊ฑธ State๋ผ๊ณ ๋ถ๋ฅธ๋ค)
์ปดํฌ๋ํธ์ ๋ ๋๋ง์ ์ํฅ์ ์ฃผ๊ณ ,
State์ ๋ณํ๊ฐ ๋ฐ์ํ ์ ํด๋น ์ปดํฌ๋ํธ๋ ์ฌ ๋ ๋๋ง๋๋ฉฐ,
์ด๋ฌํ ๋ฐฉ์์ผ๋ก UI๋ฅผ ๋์ ์ผ๋ก ์ ๋ฐ์ดํธ ํ ์ ์๋ค.
React ์ปดํฌ๋ํธ๋ ์์ฑ, ๊ฐฑ์ , ์๋ฉธ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ ์ง๋ค.
์๋ช ์ฃผ๊ธฐ๋ ์ปดํฌ๋ํธ๊ฐ ์์ฑ๋์ด ํ๋ฉด์ ๋ํ๋๊ณ , ์ ๋ฐ์ดํธ๋๊ณ , ์ฌ๋ผ์ง ๋๊น์ง์ ์ผ๋ จ์ ๊ณผ์ ์ ์๋ฏธํ๋ฉฐ,
๊ฐ ๋จ๊ณ์์ ํน์ ๋ฉ์๋๋ ํ ์ด ํธ์ถ๋๋ค.
import React, { useState } from 'react';
function MyButton() {
// useState Hook์ ์ด์ฉํด์
// 'count'๋ผ๋ ๋ณ์๋ฅผ ๋ง๋ค๊ณ , ์ด๊ธฐ๊ฐ์ 0์ผ๋ก ์ค์
// 'setCount'๋ผ๋ ํจ์๋ฅผ ์ฌ์ฉํด์
// 'count'์ ๊ฐ์ ๋ฐ๊ฟ ์ ์๋ค!(์ด๊ธฐ ๊ฐ์ 0)
const [count, setCount] = useState(0);
return (
<div>
<p>๋ฒํผ์ {count}๋ฒ ๋๋ ์ต๋๋ค</p>
<button onClick={() => setCount(count + 1)}>
๋๋ฌ๋ณด์ธ์!
</button>
</div>
);
}
export default MyButton;
ํจ์ํ ์ปดํฌ๋ํธ๋ก ๋ง๋
๋ฒํผ์ ํ๋ฒ ๋๋ฅผ๋๋ง๋ค 1์ฉ count ๊ฐ์ ์ฆ๊ฐ์ํค๋ ์ฝ๋.
์ด๋ ๋ฏ ํจ์ํ ์ปดํฌ๋ํธ๋ ํจ์๋ฅผ ์ฌ์ฉํด์ ์ด๋ค HTML์ ๋ณด์ฌ์ค์ง๋ฅผ ์ ํ๋ค.
import React, { Component } from 'react';
class Counter extends Component {
constructor(props) {
super(props);
this.state = { count: 0 };
}
// this.setState์ this.state๋ก ๋ณ์๋ฅผ ๊ด๋ฆฌํ๋ค.
// Counter๋ผ๋ ํด๋์ค๋ก state๋ค์ ๋ฌถ์ด์ this ํค์๋๋ก ์ฐธ์กฐํ๋ค.
// setState๋ฉ์๋๋ก state๋ฅผ ์
๋ฐ์ดํธํ๋ค.
// 'this.state'์ 'count'๋ฅผ ๊ฐ์ฒด๊ฐ์ผ๋ก ๊ด๋ฆฌํ๋ฉฐ ๋ฐ๊ฟ ์ ์๋ค!(์ด๊ธฐ ๊ฐ์ 0)
render() {
return (
<div>
<p>๋ฒํผ์ {this.state.count} ๋ฒ ๋๋ ์ต๋๋ค</p>
<button onClick={() => this.setState({ count: this.state.count + 1 })}>
๋๋ฌ๋ณด์ธ์!
</button>
</div>
);
}
}
ํด๋์ค ์ปดํฌ๋ํธ๋ก ๋ง๋
๋ฒํผ์ ํ๋ฒ ๋๋ฅผ๋๋ง๋ค 1์ฉ count ๊ฐ์ ์ฆ๊ฐ์ํค๋ ์ฝ๋.
ํจ์ํ ์ปดํฌ๋ํธ์ ๊ฐ์ ๋ณ์๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ๊ณผ ๋ค๋ฅด๊ฒ
๊ฐ์ ๊ฐ์ฒด๋ก ๊ด๋ฆฌํ๋ฉฐ,
useState Hook์ ์ฌ์ฉํ์ง์๊ณ this.setState๋ฅผ ๋ฉ์๋๋ฅผ ํตํด state๋ฅผ ๊ด๋ฆฌํ๋ค.
๊ทธ๋ ๋ค๋ฉด ๋์ ์ด๋ค ์ฐจ์ด๊ฐ ์์๊น?
ํจ์ํ ์ปดํฌ๋ํธ๋ ํจ์๋ก ์ ์๋๋ค.
ํด๋์ค ์ปดํฌ๋ํธ๋ ํด๋์ค๋ก ์ ์๋๋ค.
ํจ์ํ ์ปดํฌ๋ํธ๋ useState
๊ฐ์ Hook์ ์ฌ์ฉํด์ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ค.
ํด๋์ค ์ปดํฌ๋ํธ๋ this.state
์ this.setState
๋ฉ์๋๋ฅผ ์ฌ์ฉํด ์ํ๋ฅผ ๊ด๋ฆฌํ๋ค.
ํจ์ํ ์ปดํฌ๋ํธ๋ useEffect
๊ฐ์ Hook์ ์ฌ์ฉํด์ ์๋ช
์ฃผ๊ธฐ ๋ฉ์๋๋ฅผ ๋์ฒดํ๋ค.
ํด๋์ค ์ปดํฌ๋ํธ๋ ๊ฐ๊ฐ ์ํฉ์์์ ๋ช
์์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค.
(componentDidMount
, componenDidUpdate
, componentWillUnmound
๋ฑ)
ํจ์ํ ์ปดํฌ๋ํธ๋ ์ง์ ์ ์ธ ์๋ฌ๊ฒฝ๊ณ๋ฅผ ์ ๊ณตํ์ง ์๋๋ค. (ErrorBoundray
) ๋ฅผ ํตํด ๊ฐ์ธ๋ ์์ผ๋ก ๊ฐ์ ์ ์ผ๋ก๋ง ๊ตฌํ ๊ฐ๋ฅํ๋ค.
ํด๋์ค ์ปดํฌ๋ํธ๋ ์ง์ ์ ์๋ฌ๊ฒฝ๊ณ๋ฅผ ์ ๊ณตํ๋ค. (componenDidCatch
)
ํจ์ํ ์ปดํฌ๋ํธ๋ ๋ณด๋ค ์ง๊ด์ ์ด๊ณ , ๊ฐ๊ฒฐํ๋ค.
ํด๋์ค ์ปดํฌ๋ํธ๋ ๋ ๋ง์ Boilerplate์ฝ๋๋ฅผ ํ์๋ก ํ๋ค.
React 16.8 ๋ฒ์ ๋ถํฐ
React Hooks๋ผ๋ ํน๋ณํ ํจ์๋ค์ด ์๊ฒผ๊ณ
๊ธฐ์กด์๋ ํจ์ํ ์ปดํฌ๋ํธ์์ ๊ตฌํํ ์ ์์๋
ํด๋์ค ์ปดํฌ๋ํธ์
State ๊ด๋ฆฌ์, Lifecycle ๊ธฐ๋ฅ์ด ์ฌ์ฉํ ์ ์๊ฒ ๋๋ฉฐ
ํ์ฌ๋ ํจ์ํ ์ปดํฌ๋ํธ๋ค์ ์ฃผ๋ก ์ฌ์ฉํ๋ค.
์ด๊ธฐ์๋ ํด๋์ค ์ปดํฌ๋ํธ๊ฐ ํจ์ํ๋ณด๋ค ๋์ ์ฅ์ ์ด ์์์ง๋ง ์ ์ React๊ฐ ๋ฐ์ ํด๊ฐ์๋ฐ๋ผ ์ฅ์ ์ด ์ฌ๋ผ์ง๋ ์ถ์ธ.
๊ธฐ์กด์์ this.state
, componentDidUpdate
๋ฑ์ผ๋ก ํด๋์ค ์ปดํฌ๋ํธ์์์ state์ lifecycle๋ฑ์ ๊ด๋ฆฌํ๋ค๋ฉด
React Hooks๋ผ๋ ํจ์๋ค๋ก ์ด๋ฌํ ๊ธฐ๋ฅ๋ค์ ํด๋์ค๊ฐ ์๋ ํจ์๋ด์์ ์์ฒด์ ์ผ๋ก ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๊ฒ ๋๊ฒ์ด๋ค.
"๊ทธ๋ ๋ค๋ฉด ๊ทธ๋ฅ ํจ์ํ ์ปดํฌ๋ํธ๊ฐ ์์ํธํ์๋๊ฐ?"
๋ผ๊ณ ์๊ฐํ ์๋ ์๋ค.
์.. ๋ง๋ค.. ํจ์ํ์ด ๋์ฒด๋ก ์ฝ๊ธฐ๋์ฝ๊ณ ๋ซ๊ธดํ๋ค.
ํ์ง๋ง ํด๋์ค ์ปดํฌ๋ํธ๋ ์์ ๋ชฐ๋ผ๋ ๋๋๊ฑด ์๋๋ค.
์์์ผ ํ๋ ์ด์ ๋ ์ด๋ค๊ฒ ์์๊น?
ํด๋์ค ์ปดํฌ๋ํธ๋ ์๋ฌด๋๋ React ์ด๊ธฐ๋ถํฐ ์์๊ธฐ ๋๋ฌธ์, ์ค๋๋ ์ฝ๋๋ฒ ์ด์ค๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํธํ์ฑ์ด ๋ ์ข์์๋ ์๋ค. ๊ทธ๋ฆฌ๊ณ , ์ฌ๋ฌ ๋ ๊ฑฐ์ ํ๋ก์ ํธ์์ ์์ง๋ ํด๋์ค ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๊ณ ์๊ธฐ๋ ํ๋ค.
ํด๋์ค ์ปดํฌ๋ํธ๋ ํจ์ํ ์ปดํฌ๋ํธ์ useEffect
์ ๋ค๋ฅด๊ฒ Lifecycle ๊ฐ๊ฐ์ ์๊ฐ์ ๋ช
์์ ์ผ๋ก ์ ๊ณตํ๋ค. ๋ฌผ๋ก useEffect๊ฐ ํ ์ ์๋ ์ผ์ด์ง๋ง, ํด๋์ค ์ปดํฌ๋ํธ์ ๋ณด๋ค ๋ช
์์ ์ธ ๋ฉ์๋๋ค์ ๋ณด๋์ฌ๋์ผ๋ก ํ์ฌ๊ธ ์ฝ๋ ๊ตฌ์กฐ๊ฐ ๋์ฑ ๋ช
ํํ๊ฒ ๋๊ปด์ง ์๋ ์๋ค.
์์์ ๋งํ๋ฏ
ํจ์ํ ์ปดํฌ๋ํธ๋ ์ง์ ์ ์ธ ์๋ฌ๊ฒฝ๊ณ๋ฅผ ์ ๊ณตํ์ง ์๊ณ , "๋~์ถฉ ์ด๋ ๊ตฌ์ญ์ฏค์์ ์๋ฌ๊ฐ ์๊ฒผ๋๋ฐ, ํฌ๋์ ๋ฐฉ์ง๋ ํ๊ณ , ๊ฐ๋จํ ์๋ฌ ๋ฉ์ธ์ง์ ๋๋ง ๋ด๋ณผ๊ฒ" ์ ๋์ ๋๋์ด๋ค.
๋ฐ๋ฉด ํด๋์ค ์ปดํฌ๋ํธ๋ ์ง์ ์ ์ผ๋ก ์๋ฌ๊ฒฝ๊ณ๋ฅผ ์ ๊ณตํ๋ค.
์ง์ ์ ์ด๋ผ๋๊ฒ์,
๋ค๋ฅธ ์ ํต์ ์ธ Error catch๋ค ์ฒ๋ผ ์ปดํฌ๋ํธ ํธ๋ฆฌ์ ํน์ ๋ถ๋ถ์์ ์๋ฌ๋ฅผ ์ก์๋ด๋ ๊ธฐ๋ฅ์ด ์๋ค๋ ์๋ฏธ๋ค.
์ด๋ ๋ฏ ๊ฐ ์ปดํฌ๋ํธ์ ํ์๊ฐ ์์ง๋ง,
ํ์ฌ๋ ๋ฆฌ์กํธ ์ํ๊ณ์ ๋ฐ์ ์ ๋ฐ๋ฅธ
ํจ์ํ ์ปดํฌ๋ํธ์ ์ฅ์ ์ด ํจ์ฌ ๋ง์์
์ฃผ๋ก ์ฝ๊ณ ์์ ํ๊ธฐ ํธํ ํจ์ํ ์ปดํฌ๋ํธ๊ฐ ๋์ธ์ธ ๋๋์ด๋ค.
๋ฐฐ๊ฒฝ์ง์์ ์ผ์ถ ์์๊ณ .. ๊ทธ๋ ๋ค๋ฉด
์ฐ๋ฆฌ๊ฐ ์์ฑํ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ ์ด๋ป๊ฒ ๋ ๋๋ง๋ ๊น?
Brower์ ๋ ๋๋ง ๋ฐฉ์์
์ ๋ฒ Weekly Paper์์ ์๋นํ ์ธ๋ถ์ ์ผ๋ก ์ค๋ช
ํ ๊ฒ ๊ฐ์ผ๋ ํจ์คํ๊ณ ..
Browser ๋์๊ณผ์ ์ ์๋ง ์ด์ฌ์ง์ ๋ณด๋ฉด ๋ ์ค๋ฅด์ง ์์๊น ?
์ฌํผ,
React์ ๋ ๋๋ง ํ๋ก์ธ์ค๋
Render Phase์ Commit phase ๋๋จ๊ณ๋ก ์งํ๋๋ค
Render Phase์์๋ ์ปดํฌ๋ํธ๋ฅผ ๊ณ์ฐํ๊ณ ์ ๋ฐ์ดํธ ์ฌํญ์ ํ์ ํ๊ณ
Commit Phase๋ ๋ณ๊ฒฝ ์ฌํญ์ ์ค์ DOM์ ๋ฐ์ํด์ฃผ๋๊ฒ.
์์ธํ๊ฒ ํ๋ฒ ์ดํด๋ณด์
Render Phase์์ ์ฒซ๋ฒ์งธ๋ก
์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ปดํฌ๋ํธ๋ฅผ ํธ์ถํด์ ๊ฒฐ๊ณผ๊ฐ์ ๊ณ์ฐํ๋ค.
function App() {
return (
<div id="main">
<p>Hello</p>
</div>
)
}
์ด๋ฐ ์ฑ ์ปดํฌ๋ํธ๊ฐ ์๊ณ , ์ฐ๋ฆฌ๊ฐ ์ด ์ปดํฌ๋ํธ๋ฅผ ํธ์ถํ๋ค๋ฉด
์ด๋ค ๊ฒฐ๊ณผ๊ฐ์ ๋ฐํํ ๊น ?
์ ๋นํ ์๊ฐํด๋ณด๋ฉด..
"๊ทธ๋ฅ ๋ฆฌํด HTMLํ๊ทธ๋ค์ด๋๊น ์ด HTML ํ๊ทธ๊ฐ ๋ฐํ๋๋๊ฑฐ ์๋๊ฐ?"
๋ผ๊ณ ์๊ฐํด๋ณผ๋ง ํ์ง๋ง
์ฌ์ค
{
type: "div",
key: null,
ref: null,
props: {
id: main,
children: {
type: "p",
key: null,
ref: null,
props: {
children: "Hello",
},
},
},
};
์ด๋ ๊ฒ ์๊ธด ๊ฐ์ฒด๊ฐ์ ๋ฐํํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ ์ด ๊ฐ์ฒด๊ฐ์ React Element๋ผ๊ณ ๋ถ๋ฅธ๋ค.
๊ทธ๋์ ์ด React Element๊ฐ ๋ญํ๋ ๊ฐ์ฒด๋?
์์์ ์๋ก๋ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ํ๊ณ ์ํ๋ UI์ ๋ชจ๋ ์ ๋ณด๋ฅผ ํฌํจํ๊ณ ์๋ ๊ฐ์ฒด๋ค.
์ด๋ฐ ๋๋์ผ๋ก ์ง์ ์ง์ด์
์ด ํ๊ทธ๋ ํ์
์ด div
์ด๊ณ , id
๋ main
์ด๊ณ
์์ ์์๋ก๋ p
ํ๊ทธ ๊ฐ์๊ฒ๋ค์ด ํด๋น๋์ด์๋ค.
๋ผ๋ ์ ๋ณด๋ค์ ๊ฐ์ง๊ณ ์๋๊ฒ.
์ด๋ฐ์์ผ๋ก ์ฒซ๋ฒ์งธ ํ์ด์ฆ์์
์ปดํฌ๋ํธ๋ฅผ ํธ์ถํด ๊ฒฐ๊ณผ๊ฐ์ ๊ณ์ฐํ๊ณ , React Element๋ฅผ ์ป๊ฒ ๋๋ค.
๊ทธ ๋ค์ ๋๋ฒ์งธ๋ก๋
ํ๋ฉด์ ๊ตฌ์ฑํ๋๋ฐ ํ์ํ ๋ชจ๋ ์ปดํฌ๋ํธ๋ค์ ํธ์ถํด์
React Element๋ก ๋ง๋ ๋ค ์ด๊ฒ๋ค์ ๋ชจ๋ ๋ชจ์
Virtual DOM์ ๋ง๋ ๋ค.
Git์์์ Commit์ด ๋ณ๊ฒฝ์ฌํญ์ ์ ์ฉํ๋ฏ
๊ฐ๋ค๋ก ๋ง๋ค์ด๋ธ Virtual DOM์ ์ง์ง Real DOM์ Commit, ๋ฐ์ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ด๋ฐ ๋จ๊ณ๋ฅผ ์ฐ๋ฆฌ๋ Commit Phase๋ผ๊ณ ๋ถ๋ฅธ๋ค!
์ด Virtual DOM์ Real DOM์๋ค๊ฐ ๋ฐ์ํ๋ฉด
์ค์ DOM์ด ๋ณ๊ฒฝ๋ ๊ฒ์ด๊ณ
๋ธ๋ผ์ฐ์ ๋ ์ด ๋ณ๊ฒฝ์ฌํญ์ ์ธ์ํด์
Render Tree๋ฅผ ์ฌ๊ตฌ์ฑํ ๊ฒ์ด๊ณ
Layout๋ ๋ค์ ์ก์๊ฒ์ด๋ฉฐ
Paint ๊ณผ์ ๋ ๋ค์ ์งํํ ๊ฒ์ด๋ค.
๋ ๋๋ง ๊ณผ์ ๊ด๋ จ ์์ธํ ์ฌํญ์ ๋ธ๋ผ์ฐ์ ๋ฅผ ์ฐธ์กฐ
์ด๋ฌํ ๊ณผ์ ์ ๊ฑฐ์ณ์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ค์ด ๋ ๋๋ง ๋๋ค!
๊ทธ๋ฅ HTML CSS๋ก ํ๋ฉด, ๋ ๋๋ง๊ณผ์ ํ๋ฒ๋ง ๋๋ ค๋ ๋ค ๋์ฌํ
๋ฐ
๊ตณ์ด ์ด๋ ๊ฒ ๋ณต์กํ ๊ณผ์ ์ ์ง๋๋ ์ด์ ๊ฐ ๋ฌด์์ผ๊น?
๋ฐ๋ก DOM ์์ ์ ์ต์ํ, ๋น ๋ฅธ ์ ๋ฐ์ดํธ ๋์์ ์ํด์ ๊ทธ๋ ๋ค.
๋ด๋ถ์ ์ผ๋ก ์ฌ๋ฌ๊ฐ์ง์ ์ด์ ๋ก ์ ๋ฐ์ดํธ๊ฐ ๋ฐ์ํ๋ค๋ฉด ์ด๋ค์ผ์ด ์ผ์ด๋ ๊น?
์
๋ฐ์ดํธ๊ฐ ๋ฐ์ํ๋ฉด, React๋ ์ฐ์ ์ ์ผ๋ก
Render Phase๋ฅผ ์ฒ์๋ถํฐ ๋ค์ ์คํํด์
์ปดํฌ๋ํธ๋ฅผ ํธ์ถํ๊ณ , ์๋ก์ด React Element๋ฅผ ๋ฐ๊ณ , ์๋ก์ด Virtual DOM์ ๋ง๋ ๋ค.
๊ทธ๋ ๋ค๋ฉด, ์๋์ VDOM์ด ์๋ ์๋ก์ด VDOM์๋
์ฌ์ง์์ ๋ณผ์์๋ฏ ์
๋ฐ์ดํธ๋ ์์๋ค์ด ๋ฐ์๋์ด์์๊ฒ์ด๊ณ .
๋ฆฌ์กํธ๋ ์ด ๋ ํธ๋ฆฌ์ ์ค๋
์ท์ ์ฐธ๊ณ ์๋ฃ๋ก
์๋ ์ฐ๊ณ ์๋ VDOM๊ณผ ์๋ก ๋ ๋๋ง๋ VDOM์ ์ฐจ์ด์ ์ ์๋ก ๋น๊ตํ๋ค.
ํ์๋์ด ์๋ ๋ถ๋ถ๋ง ์๋ก์ด ์
๋ฐ์ดํธ ๋ ๋ถ๋ถ์ด๋ ๋ณํ๋ ๋ถ๋ถ๋ง์ ๋น ๋ฅด๊ฒ ์ฐพ์์ ์๊ณ
์ฐพ์ ๋ค์์๋ Commit Phase๋ก ๋์ด๊ฐ
์ค์ DOM์ ๋ฐ์ํ๋ฉด์ ๋จ ํ๋ฒ์ DOM ์์ ์ผ๋ก ์
๋ฐ์ดํธ๋ฅผ ๋ฐ์ํ ์ ์๋๊ฒ.
Virtual DOM์์๋
์ค์ DOM๊ณผ Virtual DOM์ ๋น๊ตํ์ฌ ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง์ ์ค์ DOM์ ๋ฐ์ํ๋๋ฐ
์ด๋ ๋ณ๊ฒฝ๋ ๋ถ๋ถ์ ์ฐพ์๋ด๋ ๊ฑธ Diff
๋ผ๊ณ ํ๊ณ ,
์ด๊ฒ์ ๋น๊ตํ๋ ๊ณผ์ ์์ Diffing
์๊ณ ๋ฆฌ์ฆ์ด ์ฌ์ฉ๋๋ค.
์ด์ ๋ํด ์์๋ณด์
์๊น Render Phase - 1์์
์ด ์ฌ์ง์ ๋ณด์ฌ์ฃผ๋ฉฐ ์ปดํฌ๋ํธ๊ฐ type์ด๋ผ๋ ํค๊ฐ์ ๊ฐ๊ณ ์๋ค~ ๋ผ๊ณ ์ค๋ช
ํ๋๋ฐ,
์ด๊ฒ diffing ์๊ณ ๋ฆฌ์ฆ์ ๋น๊ต๊ณผ์ ์ ํ์ํ๋ค.
์์ฐจ์ ์ผ๋ก ์์๋ณด์
- ๋ ธ๋ํ์ ์ ๋น๊ต
๋ ๋ ธ๋๊ฐ ๊ฐ์ ํ์ ์ธ์ง ํ์ธํ๋ค. ๊ฐ์ ํ์ ์ด๋ผ๋ฉด ์์ฑ์ ๋น๊ตํ๊ณ , ๋ค๋ฅธ ํ์ ์ด๋ผ๋ฉด ์ด์ ๋ ธ๋๋ฅผ ์ ๊ฑฐํ๊ณ ์๋ก์ด ๋ ธ๋๋ฅผ ์ถ๊ฐํ๋ค
- ์์ฑ ๋น๊ต
์์ฑ์ด ๋ณ๊ฒฝ๋์ด์๋์ง ํํํด๋ณด๊ณ ๋ณ๊ฒฝ๋ ์์ฑ๋ง ์ค์ DOM์ ์ ์ฉํ๋ค.
- ์์ ๋ ธ๋ ๋น๊ต
3-1. ๊ฐ ์์ ๋ ธ๋๋ฅผ ์์๋๋ก ๋น๊ตํ๋ค. key๊ฐ ์๋ค๋ฉด key๋ฅผ ๊ธฐ์ค์ผ๋ก, ์๋๊ฒฝ์ฐ ์ธ๋ฑ์ค๋ฅผ ๊ธฐ์ค์ผ๋ก ๋น๊ตํ๋ค.
3-2. ์์ ๋ ธ๋๊ฐ ๋ฆฌ์คํธ๋ผ๋ฉด, ๊ฐ ๋ ธ๋์ key๋ฅผ ๊ธฐ์ค์ผ๋ก ํด์ ์ถ๊ฐ, ์ ๊ฑฐ, ์ด๋์ ๊ฒฐ์ ํ๋ค.
์ด๋ฐ ์ด์ ๋ก key๋ก ์ธ๋ฑ์ค๋ฅผ ์ฃผ๋๊ฒ์ diffing ์๊ณ ๋ฆฌ์ฆ์ ๋ฐฉํดํ๋ค.
key๋ก ์ธ๋ฑ์ค๋ฅผ ์ค๋ฒ๋ฆฌ๋ฉด ์๊ฐ ์ด๋์ํ๋,
์๋ก์ด๊ฒ ์๊ฒผ๋, ๋ญ๊ฐ ์ญ์ ๊ฐ๋์๋ ํ์
ํ ์๊ฐ์๊ณ ,
์ถ๊ฐํ๊ฑฐ๋ ์ ๊ฑฐํ ๋๋ง๋ค ๋ณ๊ฒฝ๋๋ ์ธ๋ฑ์ค๋ฅผ ์ถ์ ํ๋ ค๋ฉด
์ ์ฒด ๋ฆฌ์คํธ๋ฅผ ์ฌ๋ ๋๋ง ํด์ผํ๊ณ ,
๋ถํ์ํ DOM์
๋ฐ์ดํธ๊ฐ ๋ฐ์ ํด๋ฒ๋ฆฌ๋๊ฒ!
๊ฐ๋จํ ์ฝ๋๋ฅผ ๋ณด๋ฉฐ ์ดํดํด๋ณด์.
// ์์ VDOM
const oldVDOM = (
<div>
<h1 key="1">Title</h1>
<p key="2">Element</p>
</div>
);
// ์๋ก์ด VDOM
const newVDOM = (
<div>
<h1 key="1">Brand New Title</h1>
<span key="3">New Element</span>
</div>
);
์์์ ์ค๋ช ํ ๊ทธ๋๋ก ์งํํด๋ณด์.
๋ฃจํธ <div>
๋
ธ๋๋ฅผ ๋น๊ตํ๋ค. ๋ ๋
ธ๋ ๋ชจ๋ <div>
ํ์
์ด๋ฏ๋ก ๊ณ์ ๋ค์๋จ๊ณ๋ก ๋์ด๊ฐ๋ฉฐ ๋น๊ตํ๋ค.
์์ ๋
ธ๋ <h1>
์ ๋น๊ตํ๋ค. ๊ฐ์ key๋ฅผ ๊ฐ์ง๊ณ ์์ผ๋ฏ๋ก ํ
์คํธ ๋ด์ฉ๋ง ์
๋ฐ์ดํธํ๋ค.
<p>
์ <span>
๋
ธ๋๋ฅผ ๋น๊ตํ๋ค. key๊ฐ ๋ค๋ฅด๋ฏ๋ก <p>
๋ฅผ ์ ๊ฑฐํ๊ณ <span>
์ ์ถ๊ฐํ๋ค.
์๊ฐ๋ณด๋ค ์์์ ์ด์ง์์๊ฐ?
๊ทธ๋์ React๊ฐ ์ข์ ์ด์ , ์ด๋ป๊ฒ ๊ตด๋ฌ๊ฐ๋์ง๋ฅผ ์์ฝํ์๋ฉด
React๋
๋์์ ๋ฐ์ํ ์ ๋ฐ์ดํธ๋ฅผ ๋ชจ์ ๋ฑ ํ๋ฒ๋ง DOM์ ์์ ํ๊ณ
์ด๋ ๋๋ถ๋ถ์ ์ํฉ์ ์์ด ๋น ๋ฅธ์๋๋ก ํ๋ฉด ์ ๋ฐ์ดํธ๊ฐ ์ด๋ฃจ์ด์ง๋ค.
์ฐ๋ฆฌ๋ ์ด ๊ณผ์ ์ ์์์ ๋งํ๋ Reconciliation(์ฌ์กฐ์ )์ด๋ผ๊ณ ๋ถ๋ฅธ๋ค
๊ทธ๋ฆฌ๊ณ ์ด ์ฌ์กฐ์ ์ ์์ด ๋น๊ต๊ณผ์ ์ Diff๋ผ๊ณ ํ๋ค.
์์ JS๋ง์ ์ด์ฉํด DOM์ ์กฐ์ํ๋ ๊ฒฝ์ฐ์๋ ๊ณผ๋ํ Reflow์ Repaint์ ์ฃผ์ํ๋ฉฐ
DOM ์์ ์ ์ต์ํ ํด์ผ ํ์ง๋ง,
์ด๋ ์๋น์ค ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด ์ปค์ง์๋ก ์ด๋ ต๋ค.
ํ์ง๋ง React๋ ์์ฒด์ ๋ ๋๋ง ํ๋ก์ธ์ค๋ฅผ ์ฌ์ฉํ๊ณ ์๊ธฐ๋๋ฌธ์
์์์ ํ๋ฒ์ ๊ด๋ฆฌํด์ค๋ค๋๊ฒ์ด ์ฅ์ ์ธ๊ฒ.
#์ฝ๋์์คํ๋ฆฐํธ #์คํ๋ฆฐํธํ์คํ1๊ธฐ #์ทจ์ ๊น์ง๋ฌ๋ฆฐ๋ค