July 17, 2025

๐Ÿ‘ป ๋ฆฌ์•กํŠธ์—์„œ DOM ์ง์ ‘ ์กฐ์ž‘: ๊ฐ€์ƒ DOM ๋ถˆ์ผ์น˜์™€ ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ UI

React
์„ฑ๋Šฅ
์—๋Ÿฌ์ฒ˜๋ฆฌ
์ปดํฌ๋„ŒํŠธ
์•„ํ‚คํ…์ฒ˜

Summary

๋ฆฌ์•กํŠธ์—์„œ document.getElementById์™€ ๊ฐ™์€ ์ง์ ‘ DOM ์กฐ์ž‘์€ ๊ฐ€์ƒ DOM๊ณผ์˜ ๋ถˆ์ผ์น˜๋ฅผ ์•ผ๊ธฐํ•˜์—ฌ ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ UI ๋ฒ„๊ทธ์™€ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์ดˆ๋ž˜ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ƒํƒœ(state)์™€ ์†์„ฑ(props)์„ ํ†ตํ•ด UI๋ฅผ ์„ ์–ธ์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๊ณ , ์˜ˆ์™ธ์ ์ธ ์ƒํ™ฉ์—์„œ๋งŒ useRef์™€ useEffect๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ œํ•œ์ ์œผ๋กœ DOM์— ์ ‘๊ทผํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Why Wrong?

๋ฆฌ์•กํŠธ(React)๋Š” ํšจ์œจ์ ์ธ UI ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด ๊ฐ€์ƒ DOM(Virtual DOM)์ด๋ผ๋Š” ์ถ”์ƒํ™” ๊ณ„์ธต์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ(state)๋‚˜ ์†์„ฑ(props)์„ ๋ณ€๊ฒฝํ•˜๋ฉด, ๋ฆฌ์•กํŠธ๋Š” ์ƒˆ๋กœ์šด ๊ฐ€์ƒ DOM์„ ์ƒ์„ฑํ•˜๊ณ  ์ด์ „ ๊ฐ€์ƒ DOM๊ณผ ๋น„๊ต(Reconciliation)ํ•˜์—ฌ ์‹ค์ œ DOM์— ์ตœ์†Œํ•œ์˜ ๋ณ€๊ฒฝ๋งŒ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฆฌ์•กํŠธ์˜ ์„ ์–ธ์ (Declarative) ๋ฐฉ์‹์€ ๊ฐœ๋ฐœ์ž๊ฐ€ UI์˜ '์ตœ์ข… ์ƒํƒœ'๋งŒ ์ •์˜ํ•˜๋ฉด ๋˜๋ฏ€๋กœ ์ฝ”๋“œ์˜ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์—ฌ์ค๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ฝ”๋“œ ๋‚ด์—์„œ document.getElementById, querySelector ๋“ฑ์„ ํ†ตํ•ด ์‹ค์ œ DOM ์š”์†Œ๋ฅผ ์ง์ ‘ ์กฐ์ž‘ํ•˜๊ฒŒ ๋˜๋ฉด, ๋ฆฌ์•กํŠธ์˜ ๊ฐ€์ƒ DOM์€ ์ด๋Ÿฌํ•œ ์™ธ๋ถ€ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์•Œ์ง€ ๋ชปํ•ด ๋‚ด๋ถ€ ์ƒํƒœ์™€ ์‹ค์ œ DOM ๊ฐ„์˜ ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ UI ๋™์ž‘: ๋ฆฌ์•กํŠธ๊ฐ€ ๋‹ค์Œ ๋ Œ๋”๋ง ์ฃผ๊ธฐ์—์„œ ์ž์‹ ์˜ ๊ฐ€์ƒ DOM์— ๋”ฐ๋ผ ์‹ค์ œ DOM์„ ๋‹ค์‹œ ์—…๋ฐ์ดํŠธํ•  ๋•Œ, ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์กฐ์ž‘ํ•œ ๋‚ด์šฉ์ด ์˜๋„์น˜ ์•Š๊ฒŒ ๋ฎ์–ด์”Œ์›Œ์ง€๊ฑฐ๋‚˜, ์‚ฌ๋ผ์ง€๊ฑฐ๋‚˜, ์ž˜๋ชป๋œ ์ƒํƒœ๋กœ ๋˜๋Œ์•„๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์„ฑ๋Šฅ ์ €ํ•˜: ๋ฆฌ์•กํŠธ์˜ ์ตœ์ ํ™”๋œ Reconciliation ํ”„๋กœ์„ธ์Šค๊ฐ€ ์ง์ ‘์ ์ธ DOM ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด ๋ฐฉํ•ด๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ๊ฐ€ ๋ณ€๊ฒฝ์„ ๊ฐ์ง€ํ•˜์ง€ ๋ชปํ•ด ๋ถˆํ•„์š”ํ•œ ์ „์ฒด ์žฌ๋ Œ๋”๋ง์„ ์œ ๋ฐœํ•˜๊ฑฐ๋‚˜, ์•„๋‹ˆ๋ฉด ๋ฐ˜๋Œ€๋กœ ํ•„์š”ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ๋†“์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋””๋ฒ„๊น…์˜ ์–ด๋ ค์›€: UI๊ฐ€ ์˜ˆ์ƒ๋Œ€๋กœ ๋™์ž‘ํ•˜์ง€ ์•Š์„ ๋•Œ, ๋ฆฌ์•กํŠธ์˜ ์ƒํƒœ์™€ ์‹ค์ œ DOM์˜ ๋ถˆ์ผ์น˜๋กœ ์ธํ•ด ๋ฒ„๊ทธ์˜ ์›์ธ์„ ํŒŒ์•…ํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ๋ณต์žกํ•ด์ง‘๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ ์ปดํฌ๋„ŒํŠธ ํƒญ์—์„œ ๋ณด๋Š” ์ƒํƒœ์™€ ์‹ค์ œ ํ™”๋ฉด์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ด์  ์ƒ์‹ค: ๋ฆฌ์•กํŠธ์™€ ๊ฐ™์€ ์„ ์–ธ์  UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ฃผ๋œ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ธ 'DOM ์กฐ์ž‘์˜ ์ถ”์ƒํ™”' ์ด์ ์„ ์ƒ์‹คํ•˜๊ณ , ๋ณต์žกํ•œ ์ €์ˆ˜์ค€ DOM API๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋‹ด์ด ์ƒ๊น๋‹ˆ๋‹ค.

How to Fix?

๋ฆฌ์•กํŠธ ์•ฑ์—์„œ๋Š” ํ•ญ์ƒ '๋ฆฌ์•กํŠธ ๋ฐฉ์‹'์œผ๋กœ DOM์„ ์กฐ์ž‘ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ(state)๋‚˜ ์†์„ฑ(props)์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๋ฆฌ์•กํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ์‹ค์ œ DOM์„ ์—…๋ฐ์ดํŠธํ•˜๋„๋ก ํ•˜๋Š” ์„ ์–ธ์  ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฆฌ์•กํŠธ๊ฐ€ ๊ฐ€์žฅ ํšจ์œจ์ ์ด๊ณ  ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.

  1. ์ƒํƒœ(State)๋ฅผ ํ†ตํ•œ UI ์ œ์–ด: ๋Œ€๋ถ€๋ถ„์˜ UI ๋ณ€๊ฒฝ์€ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•จ์œผ๋กœ์จ ์ด๋ฃจ์–ด์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์š”์†Œ์˜ ์Šคํƒ€์ผ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด CSS ํด๋ž˜์Šค๋ฅผ ํ† ๊ธ€ํ•˜๊ฑฐ๋‚˜ ์ธ๋ผ์ธ ์Šคํƒ€์ผ์„ ์ƒํƒœ ๊ฐ’์— ๋”ฐ๋ผ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. ํ…์ŠคํŠธ ์ฝ˜ํ…์ธ , ์š”์†Œ์˜ ๊ฐ€์‹œ์„ฑ ๋“ฑ ๋ชจ๋“  ๋™์ ์ธ UI ์š”์†Œ๋Š” ์ƒํƒœ์— ์ข…์†๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. Refs๋ฅผ ์ด์šฉํ•œ ์ง์ ‘ ์ ‘๊ทผ (์ตœํ›„์˜ ์ˆ˜๋‹จ): ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: D3.js, Chart.js)์™€ ์—ฐ๋™ํ•˜๊ฑฐ๋‚˜, ํŠน์ • DOM ๋…ธ๋“œ์˜ ํฌ๊ธฐ๋ฅผ ์ธก์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ, ํ˜น์€ <input> ์š”์†Œ์— ์ง์ ‘ focus()๋ฅผ ์ฃผ๋Š” ๋“ฑ ์ •๋ง๋กœ ์‹ค์ œ DOM ๋…ธ๋“œ์— ์ง์ ‘ ์ ‘๊ทผํ•ด์•ผ ํ•˜๋Š” ๊ทนํžˆ ์˜ˆ์™ธ์ ์ธ ์ƒํ™ฉ์—์„œ๋Š” useRef ํ›…์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. useRef๋กœ DOM ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์–ป์€ ํ›„, useEffect ํ›… ๋‚ด์—์„œ๋งŒ ํ•ด๋‹น ์ฐธ์กฐ๋ฅผ ํ†ตํ•ด ์ตœ์†Œํ•œ์˜ imperative(๋ช…๋ นํ˜•) ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋„ ๋ฆฌ์•กํŠธ๊ฐ€ ํ•ด๋‹น DOM ๋…ธ๋“œ๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์ „์ด๋‚˜ ํ›„์—๋งŒ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋ฆฌ์•กํŠธ๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” ๋‹ค๋ฅธ ๋ถ€๋ถ„๊ณผ ์ถฉ๋Œํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Before Code (Bad)

```jsx
import React from 'react';

function DirectDomManipulator() {
  const handleClick = () => {
    // ๐Ÿšจ ์•ˆํ‹ฐํŒจํ„ด: ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ document ๊ฐ์ฒด๋ฅผ ํ†ตํ•œ ์ง์ ‘ DOM ์กฐ์ž‘
    const element = document.getElementById('my-styled-div');
    if (element) {
      element.style.backgroundColor = 'lightblue';
      element.textContent = 'DOM ์ง์ ‘ ๋ณ€๊ฒฝ๋จ!';
      // ๋งŒ์•ฝ ์ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜๋ฉด,
      // ๋ฆฌ์•กํŠธ๋Š” ์ž์‹ ์˜ ์ƒํƒœ๊ฐ€ ์•„๋‹Œ ์ด ์ง์ ‘ ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์„ ๋ฎ์–ด์”Œ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    }
  };

  return (
    <div>
      <div id="my-styled-div" style={{ backgroundColor: 'lightgray', padding: '20px' }}>
        ์›๋ž˜ ๋‚ด์šฉ
      </div>
      <button onClick={handleClick}>DOM ์ง์ ‘ ๋ณ€๊ฒฝ</button>
    </div>
  );
}

export default DirectDomManipulator;
```

**๋ฌธ์ œ์ **: ์œ„ ์ฝ”๋“œ์—์„œ `my-styled-div` ์š”์†Œ๋Š” ๋ฆฌ์•กํŠธ์— ์˜ํ•ด ๋ Œ๋”๋ง๋˜์ง€๋งŒ, ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ `document.getElementById`๋ฅผ ํ†ตํ•ด ์ง์ ‘ ์กฐ์ž‘๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฆฌ์•กํŠธ์˜ ๊ฐ€์ƒ DOM๊ณผ ์‹ค์ œ DOM ๊ฐ„์˜ ๋ถˆ์ผ์น˜๋ฅผ ์ดˆ๋ž˜ํ•˜๋ฉฐ, ์ถ”ํ›„ `DirectDomManipulator` ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง๋  ๋•Œ(`props`๋‚˜ `state` ๋ณ€๊ฒฝ ๋“ฑ) ์ง์ ‘ ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ์ด ๋ฆฌ์•กํŠธ์˜ ๊ด€๋ฆฌํ•˜์— ์žˆ๋Š” ์ดˆ๊ธฐ ์ƒํƒœ๋กœ ๋˜๋Œ์•„๊ฐ€๊ฑฐ๋‚˜, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘์„ ํ•˜์—ฌ ๋””๋ฒ„๊น…์ด ๋งค์šฐ ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.

After Code (Good)

```jsx
import React, { useState, useRef, useEffect } from 'react';

// โœ… ์˜ฌ๋ฐ”๋ฅธ ํŒจํ„ด: ์ƒํƒœ(state)๋ฅผ ํ†ตํ•ด UI ๋ณ€๊ฒฝ ์ œ์–ด
function StateControlledComponent() {
  const [bgColor, setBgColor] = useState('lightgray');
  const [content, setContent] = useState('์›๋ž˜ ๋‚ด์šฉ');

  const handleClick = () => {
    setBgColor('lightblue');
    setContent('์ƒํƒœ๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ๋จ!');
  };

  return (
    <div>
      <div style={{ backgroundColor: bgColor, padding: '20px' }}>
        {content}
      </div>
      <button onClick={handleClick}>์ƒํƒœ๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ</button>
    </div>
  );
}

// โšก๏ธ (์ฐธ๊ณ ) Refs๋ฅผ ์ด์šฉํ•œ ์ œํ•œ์ ์ธ DOM ์ง์ ‘ ์ ‘๊ทผ ์˜ˆ์‹œ (์ตœํ›„์˜ ์ˆ˜๋‹จ)
function RefDomManipulator() {
  const inputRef = useRef(null);

  useEffect(() => {
    // ์ปดํฌ๋„ŒํŠธ ๋งˆ์šดํŠธ ์‹œ input์— ํฌ์ปค์Šค
    // ์ด์ฒ˜๋Ÿผ ๋ฆฌ์•กํŠธ๊ฐ€ ์ง์ ‘ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ์ €์ˆ˜์ค€ DOM API๊ฐ€ ํ•„์š”ํ•  ๋•Œ useRef๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    if (inputRef.current) {
      inputRef.current.focus();
    }
  }, []); // ๋งˆ์šดํŠธ ์‹œ ํ•œ ๋ฒˆ๋งŒ ์‹คํ–‰๋˜๋„๋ก ๋นˆ ์˜์กด์„ฑ ๋ฐฐ์—ด ์‚ฌ์šฉ

  const handleButtonClick = () => {
    if (inputRef.current) {
      inputRef.current.value = 'Refs๋กœ ๊ฐ’ ์„ค์ •'; // input์˜ value ์†์„ฑ๋„ state๋กœ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ด๋‚˜, ์˜ˆ์‹œ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉ
    }
  };

  return (
    <div>
      <input ref={inputRef} type="text" placeholder="์—ฌ๊ธฐ์— ํฌ์ปค์Šค" />
      <button onClick={handleButtonClick}>Input ๊ฐ’ ์„ค์ •</button>
      <hr />
      <StateControlledComponent />
    </div>
  );
}

export default RefDomManipulator;
```

**์„ค๋ช…**: ์ฒซ ๋ฒˆ์งธ `StateControlledComponent` ์˜ˆ์‹œ๋Š” `useState` ํ›…์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐ๊ฒฝ์ƒ‰๊ณผ ๋‚ด์šฉ์„ ์ƒํƒœ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ์ƒํƒœ๋งŒ ์—…๋ฐ์ดํŠธํ•˜๋ฉด ๋ฆฌ์•กํŠธ๊ฐ€ ์•Œ์•„์„œ ํ•ด๋‹น ์ƒํƒœ์— ๋งž์ถฐ UI๋ฅผ ํšจ์œจ์ ์œผ๋กœ ๋‹ค์‹œ ๋ Œ๋”๋งํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ฆฌ์•กํŠธ์˜ ์„ ์–ธ์  ํŒจ๋Ÿฌ๋‹ค์ž„์— ๋ถ€ํ•ฉํ•˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ์‹์ด๋ฉฐ, ๊ฐ€์ƒ DOM๊ณผ์˜ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋ฅผ ์›์ฒœ์ ์œผ๋กœ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

๋‘ ๋ฒˆ์งธ `RefDomManipulator` ์˜ˆ์‹œ๋Š” `useRef`๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • DOM ๋…ธ๋“œ(input)์— ์ง์ ‘ ์ ‘๊ทผํ•˜๋Š” ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ์—๋„ `useEffect` ํ›… ๋‚ด์—์„œ๋งŒ DOM ์กฐ์ž‘์„ ์ˆ˜ํ–‰ํ•˜์—ฌ ๋ฆฌ์•กํŠธ์˜ ๋ผ์ดํ”„์‚ฌ์ดํด์— ๋งž์ถฐ ์‹คํ–‰๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋ฐฉ์‹์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—ฐ๋™, ํฌ์ปค์Šค ๊ด€๋ฆฌ, ๋ฏธ๋””์–ด ์žฌ์ƒ ์ œ์–ด ๋“ฑ ๋ฆฌ์•กํŠธ๊ฐ€ ์ง์ ‘ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ์ €์ˆ˜์ค€ DOM API๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์—๋งŒ ์ œํ•œ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ UI ์ƒํ˜ธ์ž‘์šฉ์€ ์ƒํƒœ๋ฅผ ํ†ตํ•ด ๊ด€๋ฆฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

You Might Also Like

๋ฆฌ์•กํŠธ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐ€์ƒ DOM์„ ์‚ฌ์šฉํ•˜์—ฌ ์‹ค์ œ DOM์„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ์›๋ฆฌ๋ฅผ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์™œ ์ง์ ‘ DOM ์กฐ์ž‘์ด ๋ฆฌ์•กํŠธ์˜ ์ž‘๋™ ๋ฐฉ์‹๊ณผ ์ถฉ๋Œํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ์•กํŠธ์˜ Reconciliation ๊ณผ์ •์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.
https://react.dev/learn/understanding-your-ui#step-3-react-renders-and-commits-the-dom
๋ฆฌ์•กํŠธ์—์„œ DOM ๋…ธ๋“œ๋‚˜ React ์—˜๋ฆฌ๋จผํŠธ์— ์ง์ ‘ ์ ‘๊ทผํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” `useRef` ํ›…์˜ ์‚ฌ์šฉ๋ฒ•๊ณผ ๋ชฉ์ ์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ง์ ‘ DOM ์กฐ์ž‘์ด ๋ถˆ๊ฐ€ํ”ผํ•œ ๊ฒฝ์šฐ์˜ '์˜ฌ๋ฐ”๋ฅธ' ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ฃผ๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ `useRef`๊ฐ€ ํ•„์š” ์—†์Œ์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.
https://react.dev/reference/react/useRef