JiwonDev

๋ฆฌ์•กํŠธ์™€ 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

ํ™œ๋™ํ•˜๊ธฐ