๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

react

React / useRef

์ œ์–ด ์ปดํฌ๋„ŒํŠธ vs useRef

 

useState

  • ์ œ์–ด ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ
  • ์ƒํƒœ๊ฐ€ ๋ณ€ํ™”ํ• ๋•Œ๋งˆ๋‹ค ๋ฆฌ๋ Œ๋”๋ง ๋ฐœ์ƒ
  • ์ž…๋ ฅ ๊ฐ’์˜ ์‹ค์‹œ๊ฐ„ ์ƒํƒœ ๋ฐ˜์˜์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์— ์˜ํ–ฅ์„ ์ค„ ๋•Œ ์‚ฌ์šฉ
  • ํผ ๊ฒ€์ฆ, ์‹ค์‹œ๊ฐ„ ๊ฒ€์ƒ‰, UI ๋ฐ˜์‘ ๋“ฑ์— ์‚ฌ์šฉ

 

useRef

  • ๋น„์ œ์–ด ์ปดํฌ๋„ŒํŠธ์—์„œ ์‚ฌ์šฉ
  • ์ž…๋ ฅ๊ฐ’์€ DOM์—์„œ ์ง์ ‘ ๊ฐ€์ ธ์˜ด
  • ๋ Œ๋”๋ง๊ณผ ๋ฌด๊ด€ํ•ด์„œ, ๋ฆฌ๋ Œ๋”๋ง๋ผ๋„ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ
  • ์ตœ์ข… ์ž…๋ ฅ ๊ฐ’๋งŒ ํ•„์š”ํ•  ๋•Œ, ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ์‹ถ์„ ๋•Œ๋Š” ๊ตณ์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ๋จ
  • ๋กœ๊ทธ์ธ ์ฐฝ, ๋น„๋ฐ€๋ฒˆํ˜ธ ์ž…๋ ฅ ๋“ฑ์— ์‚ฌ์šฉ
  • ๋ฆฌ์•กํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ€์ƒ DOM์„ ํ†ตํ•ด ์‹ค์ œ DOM์„ ์กฐ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ ์ž‘๋™ ๋ฐฉ์‹๊ณผ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ผญ ํ•„์š”ํ•  ๋•Œ๋งŒ ์จ์•ผํ•จ

 

 


 

 

useRef

์‚ฌ์šฉ๋ฐฉ๋ฒ•

1. DOM ์ฃผ์†Œ๋ฅผ ๋‹ด์•„์ค„ ๊ณต๊ฐ„ ์ƒ์„ฑ

const domRef = useRef(null) // ์ฒ˜์Œ์—๋Š” null์„ ๋„ฃ์–ด ๋นˆ ๊ณต๊ฐ„์œผ๋กœ

 

2. DOM ์ฃผ์†Œ๋ฅผ ๋‹ด๊ณ  ์‹ถ์€ ์š”์†Œ์— ref ์†์„ฑ์œผ๋กœ ์—ฐ๊ฒฐ

<element ref={domRef} />

 

3. current ์†์„ฑ์œผ๋กœ ์š”์†Œ์— ์ ‘๊ทผ

domRef.current // = <element ref={domRef} />

 

 


 

์˜ˆ์‹œ - ๋ฆฌ๋ Œ๋”๋ง ์—†์ด ์‹ค์ œ DOM์— ์ ‘๊ทผ

 

useState์™€ useRef๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ž…๋ ฅ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค๊ณ  ํ•  ๋•Œ, ๋ Œ๋”๋ง์—์„œ ์ฐจ์ด๋ฅผ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ๋‹ค.

 

1. useState ์‚ฌ์šฉ

function App() {
  return (
    <>
      <ControlledInput />
    </>
  );
}

// ์ œ์–ด ์ปดํฌ๋„ŒํŠธ
const ControlledInput = () => {
  const [inputValue, setInputValue] = useState('');
  console.log('๋ฆฌ๋ Œ๋”๋ง');
  return (
    <input value={inputValue} onChange={(e) => setInputValue(e.target.value)} />
  );
};

 

๊ฐ์žํŠ€๊น€ ๋„ค๊ธ€์ž๋งŒ ์ผ๋Š”๋ฐ ๋ฆฌ๋ Œ๋”๋ง์ด ์—ฌ๋Ÿฌ๋ฒˆ ๋ฐœ์ƒ๋œ ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค

 

 

2. useRef ์‚ฌ์šฉ

function App() {
  return (
    <>
      <ControlledInput />
      <hr />
      <UseRefInput />
    </>
  );
}

const UseRefInput = () => {
  const inputRef = useRef(null);
  console.log('useRef ๋ฆฌ๋ Œ๋”๋ง');
  return (
    <>
      <input ref={inputRef} />
    </>
  );
};

 

์ฒ˜์Œ ํ™”๋ฉด์ด ๋ Œ๋”๋ง๋์„ ๋•Œ ์™ธ์—๋Š” input์— ๊ฐ’์„ ์ž…๋ ฅํ•ด๋„ ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค.

 

input์˜ value๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

 

const UseRefInput = () => {
  const inputRef = useRef(null);
  console.log('useRef ๋ฆฌ๋ Œ๋”๋ง');
  const getInputValue = () => {
    console.log(inputRef.current.value);
  };
  return (
    <>
      <input ref={inputRef} />
      <button onClick={getInputValue}>input ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ</button>
    </>
  );
};

 

์ด ๋•Œ inputRef.current ๋ฅผ ์ถœ๋ ฅํ•˜๋ฉด <Input>๋งŒ ๋œ๋ ..๋‚˜์˜จ๋‹ค

 

 

์œ„์˜ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ, useRef๋กœ input์š”์†Œ๋ฅผ ๋ˆ„๋ฅด์ง€ ์•Š๊ณ ๋„ focus ํšจ๊ณผ๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋‹ค. (๋Œ€์‹  ์˜ˆ์ œ์—์„œ๋Š” ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๊ธด ํ•œ๋‹ค....)

 

function App() {
  return (
    <>
      <UseRefInput />
    </>
  );
}
// useRef
const UseRefInput = () => {
  const inputRef = useRef(null);
  console.log('useRef ๋ฆฌ๋ Œ๋”๋ง');
  const getInputValue = () => {
    console.log(inputRef.current.value);
  };

  // input์— focusํ•˜๋Š” ํšจ๊ณผ!
  const focusInput = () => {
    inputRef.current.focus();
  };
  return (
    <>
      <input ref={inputRef} />
      <button onClick={getInputValue}>input ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ</button>
      <button onClick={focusInput}>input์— focusํ•˜๊ธฐ</button>
    </>
  );
};

 

 


 

์˜ˆ์‹œ - ๋ฆฌ๋ Œ๋”๋ง๊ณผ ๊ด€๊ณ„์—†์ด ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜

 

useRef๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋”๋ง๊ณผ ๊ด€๊ณ„์—†์ด ๊ฐ’์ด ์œ ์ง€๋˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • numberRef๋ผ๋Š” ๋ณ€์ˆ˜์— useRef๋ฅผ ์ƒ์„ฑ
  • keep value ๋ฒ„ํŠผ - ํ˜„์žฌ counter์˜ ๊ฐ’์„ numberRef์— ์ €์žฅ
  • show value ๋ฒ„ํŠผ - numberRef์— ์ €์žฅ๋œ ๊ฐ’์„ ์ฝ˜์†”๋กœ ์ถœ๋ ฅ
function App() {
  return (
    <>
      <Counter />
    </>
  );
}

// counter ๊ฐ’์„ ํŠน์ • ์‹œ์ ์—์„œ ์ €์žฅํ•˜๋Š” useRef ์˜ˆ์ œ
const Counter = () => {
  const [counter, setCounter] = useState(0);
  const numberRef = useRef(null);

  return (
    <>
      <div>counter : {counter}</div>
      <button onClick={() => setCounter((prev) => prev + 1)}>+</button>
      <button onClick={() => setCounter((prev) => prev - 1)}>-</button>
      <button onClick={() => (numberRef.current = counter)}>keep value</button>
      <button onClick={() => console.log(numberRef.current)}>show value</button>
    </>
  );
};

 

useRef๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์•„๋ฌด๋ฆฌ ๋ฆฌ๋ Œ๋”๋ง๋ผ๋„ useRef๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋Š” ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— numberRef.current์˜ ๊ฐ’์ด ์œ ์ง€๋œ๋‹ค. ๋ฌผ๋ก  useRef์— ๊ฐ’์„ ์ €์žฅํ•ด๋„ ๋ Œ๋”๋ง๋˜์ง€ ์•Š์œผ๋ฉฐ ๋”ฐ๋ผ์„œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ทธ๋Œ€๋กœ ์œ ์ง€๋œ๋‹ค.

 

๋ฌผ๋ก  ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ์ƒˆ useState ๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค์–ด์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œํ˜„ํ•ด์ค„ ์ˆ˜๋„ ์žˆ๋‹ค. 

const [savedValue, setSavedValue] = useState(null);
// ์ƒ๋žต.... 
<button onClick={() => setSavedValue(counter)}>keep value</button>

 

์ด ๊ฒฝ์šฐ์—๋Š” ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ๋•Œ๋งˆ๋‹ค ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋ผ๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ๋ Œ๋”๋ง์ด ๊ตณ์ด ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋ฉด useRef๊ฐ€ ํšจ์œจ์ ์ด๋‹ค. 

 

 

'react' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

React / ์Šคํƒ€์ผ๋ง (1) - SCSS  (0) 2025.04.15
React / custom Hook  (1) 2025.04.11
React / ์ƒ๋ช…์ฃผ๊ธฐ  (0) 2025.04.10
React / Router ์‹ค์Šต - ๋™๋ฌผ ์ •๋ณด ์‚ฌ์ดํŠธ ๋งŒ๋“ค๊ธฐ  (0) 2025.04.09
React / Router  (0) 2025.04.09