๋ฆฌ์กํธ์ Virtual DOM
by JiwonDev๋ธ๋ผ์ฐ์ ์ Workflow
1. DOM Tree ์์ฑ
๋ธ๋ผ์ฐ์ ๊ฐ HTML์ ๋ฐ์ผ๋ฉด ํด๋น ์ฝ๋๋ฅผ ํ์ฑํ์ฌ ๋ฌธ์๊ฐ์ฒดํธ๋ฆฌ(DOM Tree)๋ฅผ ๋ง๋ญ๋๋ค.
2. Render Tree ์์ฑ
๋ง๋ค์ด์ง DOM Tree ์ CSS์ ์คํ์ผ ์ ๋ณด๋ฅผ ์ด์ฉํด ๋ ๋ ํธ๋ฆฌ๋ฅผ ์์ฑํฉ๋๋ค.
3. Layout (=Reflow)
๋ง๋ค์ด์ง ๋ ๋ํธ๋ฆฌ๋ฅผ ์ด์ฉํ์ฌ ๊ฐ ๋ ธ๋๋ค์ ์ ๋ ๊ฐ ์ขํ๊ฐ ์ฃผ์ด์ง๊ณ , ์ ํํ๊ฒ ์ด๋์ ๋ํ๋์ผ ํ ์ง ์ ํฉ๋๋ค.
4. Painting (=Repainting)
Layout ๊ณผ์ ๊น์ง ๋ง์ณค๋ค๋ฉด ํธ๋ฆฌ์ ๊ฐ ๋ ธ๋๋ค์ ํ์ํ ๋ ํ๋ฉด์ ๊ทธ๋ฆฝ๋๋ค.
React์ Virtual DOM
๊ธฐ์กด์ ์น ๋ธ๋ผ์ฐ์ ์์๋ DOM์ ์กฐ์ํ๋ฉด ๋ ๋ ํธ๋ฆฌ๋ฅผ ๋ค์ ๋ง๋ค๊ณ , Layout ๊ณผ์ ์ ๊ฑฐ์ณ ํ์ธํ ์ ํ๊ฒ๋ฉ๋๋ค.
์๋ ์ ์นํ์ด์ง๋ ๋จ์ํ HTML, CSS, JS๋ก ๋์์ ํ๋ค๋ฉด ํ๋์ ์นํ์ด์ง๋ ๋ง์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค์ ๊ฐ์ง๊ณ ํ๋์ ์นํ์ด์ง(SPA, ์ฑ๊ธ ํ์ด์ง ์ดํ๋ฆฌ์ผ์ด์ )์์ ๋ง์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์คํํ๊ฒ ๋ฉ๋๋ค.
์ฆ ํ๋์ ์นํ์ด์ง์์ ๋ง์ DOM ์กฐ์์ ๋ง๋ค๊ฒ ๋๊ณ ๋ธ๋ผ์ฐ์ ์ ์ฐ์ฐ๋์ด ์๋นํ ๋ง์ด์ง๊ฒ ๋ฉ๋๋ค.
์ด๋ฅผ ๊ฐ์ ์ํค๊ธฐ ์ํด์ ๋์จ ๋ฐฉ๋ฒ์ด Virtual DOM ์ ๋๋ค.
Vortial DOM์ ํ๋ฉด์ ํ์๋ ๊ฐ์ฒด๋ค์ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ณ , ์ค์ DOM ์กฐ์์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด ์๋๋ฉ๋๋ค.
์ฝ๊ฒ๋งํด, DOM์ ์ํ๋ฅผ ๋ฉ๋ชจ๋ฆฌ ์์ ๊ณ์ ์ฌ๋ ค๋๊ณ ์ค์ DOM์ ๋ณํ๊ฐ ์์ ๋๋ง ํด๋น ๋ณ๊ฒฝ์ ๋ฐ์ํฉ๋๋ค.
1. ๋ฐ์ดํฐ๊ฐ ์ ๋ฐ์ดํธ ๋๋ฉด, ์ ์ฒด UI๋ฅผ Virtual DOM์ ๋ฆฌ๋ ๋๋ง ํฉ๋๋ค.
2. ์ด์ Virtual DOM์ ์๋ ๋ด์ฉ๊ณผ ํ์ฌ์ ๋ด์ฉ์ ๋น๊ตํฉ๋๋ค.
3. ๋ฐ๋ ๋ถ๋ถ๋ง ์ค์ DOM์ ์ ์ฉ์ด ๋ฉ๋๋ค. (๋ชจ๋ ๋ณํ๊ฐ ํ๋ฒ๋ง Reflow ๋ฉ๋๋ค.)
(์ปดํฌ๋ํธ๊ฐ ์ ๋ฐ์ดํธ ๋ ๋ , ๋ ์ด์์ ๊ณ์ฐ์ด ํ๋ฒ๋ง ์ด๋ค์ง๋๋ค.)
React-Router-DOM
๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ React์ ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ํ๋ฉด์ ํ์ ํ ๋ ์ฌ์ฉ๋ฉ๋๋ค.
๊ธฐ์กด์ ์นํ์ด์ง์์ <a>ํ๊ทธ๋ฅผ ์ด์ฉํด ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ๋ค๋ฉด, ๋ฆฌ์กํธ ๋ผ์ฐํฐ๋ฅผ ์ด์ฉํด <link> ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ฉด์ ์ ํํฉ๋๋ค.
๊ฐ์ DOM์ฒ๋ผ ๋ณํ๊ฐ ์๋ ์ปดํฌ๋ํธ๋ง ์ ๋ฐ์ดํธํ์ฌ ํจ์จ์ ์ผ๋ก ๊ด๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
<Link to='home'>HOME</Link> <!-- ๋งํฌ๊ฑธ๊ธฐ -->
<Route path='home' component={home} /> <!-- ๋ผ์ฐํธ ํ๊ทธ -->
<Router> <!-- ์ด๋ฐ์์ผ๋ก ๋งํฌ์ ๋ผ์ฐํธ ํ๊ทธ๋ฅผ ๋ฌถ๋๋ค. -->
<Link to='home'>HOME</Link>
<Route path='home' component={home} />
</Router>
<!-- default๊ฐ์ ์ฃผ๊ณ ์ถ์ ๋ ์ค์์น ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ค. -->
<Switch> <!-- ๊ฐ์ฅ ์ฒซ๋ฒ์งธ๋ก ์ผ์นํ๋ Route๋ก ๋ ๋๋งํ๋ค. ์ค์์น๋ฌธ. -->
<Route path='/work/photography/animal' component={work} />
<Route path='/work/photography' component={work} />
<Route path='/work' component={work} />
</Switch>
React ํ๋ก์ ํธ ๊ตฌ์กฐ
public ๋๋ ํ ๋ฆฌ
(์ฐธ๊ณ ๋ก node_modules ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํด๋)
์ ์ ์ธ ํ์ผ์ ๋ด๋๋ฐ ์ฌ์ฉํฉ๋๋ค. ์ฐธ๊ณ ๋ก ์ฌ๊ธฐ์ ์ ์ฅ๋ ํ์ผ๋ค์ Webpack์ด ๊ด๋ฆฌํ์ง ์์ผ๋ฏ๋ก ๋ฒ์ (์ข ์์ฑ)์ด ๊ผฌ์ผ ์ ์๋ ํ์ผ์ src ํด๋์ ๋ฃ์ด์ผ ํฉ๋๋ค.
src ๋๋ ํ ๋ฆฌ
src์๋ ๊ฐ๋ฐํ๋ ๋๋ถ๋ถ์ ํ์ผ์ด ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค.
๊ทธ ์ค ์ง์ ํ์ผ(main)์ index.js ์ ๋๋ค.
// index.js //
<script>
import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App'; // ์ปดํฌ๋ํธ ๋ชจ์ import
import * as serviceWorker from './serviceWorker';
ReactDOM.render(
<React.StrictMode>
<App /> <!-- react(app.js)์์ ๋ง๋ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฌ์จ๋ค. -->
</React.StrictMode>,
// ํด๋น ์ฝ๋๋ฅผ index.html ์ ๋ถ์ธ๋ค.
document.getElementById('root')
);
serviceWorker.unregister();
</script>
index.js ์์ ์๋ <App /> ํ๊ทธ ์์ ๋ด์ฉ์ ์๋ ํ์ผ์ ์ ์ผ๋ฉด ๋ถ๋ฌ์์ง๋๋ค.
์น์ ๋ณด์ฌ์ง๋ ๋ถ๋ถ์ ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด <div className ="App"> ๋ด๋ถ๋ฅผ ๋ณ๊ฒฝํ์ฌ ์ฌ์ฉํ๊ณ ํด๋น ์์๋ค์ <div> ํ๊ทธ ์์ ๋ค์ด๊ฐ ์์ด์ผ ํฉ๋๋ค.
// app.js //
<script>
import React, {Component} from 'react';
import logo from './logo.svg';
import './App.css';
class App extends Component {
render(){
// ์น์ ๋ณด์ฌ์ง๋ ๋ถ๋ถ์ ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด <div className ="App"> ๋ด๋ถ๋ฅผ ๋ณ๊ฒฝํ์ฌ ์ฌ์ฉ.
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer">
Learn React
</a>
</header>
</div>
);
}
}
export default App;
</script>
'๐ผFront > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React #5 create-react-app (0) | 2021.04.05 |
---|---|
React #4 ํ๋ก์ ํธ ์์ฑ ๋ฐ ์ปดํฌ๋ํธ์ ์ดํด (0) | 2021.04.05 |
React #3 props & state (0) | 2021.04.05 |
React #2 ๋ฆฌ์กํธ.JS (0) | 2021.04.05 |
React #1 ๊ฐ๋ (0) | 2021.03.29 |
๋ธ๋ก๊ทธ์ ์ ๋ณด
JiwonDev
JiwonDev