Ref

1. ref?

reference์˜ ์•ฝ์ž๋กœ, ๋ฆฌ์•กํŠธ์˜ element๊ฐ€ ์ฐธ์กฐํ•˜๋Š” ๋ณ€์ˆ˜์— ์ ‘๊ทผํ•˜์—ฌ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

<body>
	<div id="box">
    	<button>ํด๋ฆญ</button>
    </div>
</body>
  • ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ, ์ผ๋ฐ˜์ ์ธ html์—์„œ๋Š” element์—๋Š” id๋ผ๋Š” ์†์„ฑ๊ฐ’์„ ๋ถ™์—ฌ DOM์— ์ด๋ฆ„์„ ๋ถ™์ด๋ฉฐ, ์ด ๊ฐ’์€ **์ค‘๋ณต๋˜์„œ๋Š” ์•ˆ๋˜๋Š” ์œ ์ผํ•œ ๊ฐ’**์ด๋‹ค.

  • ์ด์™€ ๊ฐ™์ด, ๋ฆฌ์•กํŠธ ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€์—์„œ DOM์— ์ด๋ฆ„์„ ๋ถ™์ด๋Š” ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ด ref์ด๋‹ค.

    • ๋ฆฌ์•กํŠธ์—์„œ ref๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ?

      • ๋งŒ์•ฝ, ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ DOM์— ์ด๋ฆ„์„ ๋ถ™์—ฌ ์‚ฌ์šฉํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์‚ฌ์šฉ์‹œ, ๋™์ผํ•œ id๋ฅผ ๊ฐ€์ง„ DOM ์š”์†Œ๊ฐ€ ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ๋œ๋‹ค.

      • ํ•˜์ง€๋งŒ, ref๋Š” ์ „์—ญ์œผ๋กœ ์œ ํšจํ•œ ๊ฒƒ์ด ์•„๋‹Œ, ์‚ฌ์šฉ๋œ ์ปดํฌ๋„ŒํŠธ ๋‚ด์—์„œ ์ง€์—ญ์ ์œผ๋กœ ์œ ํšจํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค.

  • ๋˜ํ•œ ref๋Š” state์™€ ๊ฐ™์ด ์–ด๋– ํ•œ ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์ด ๋˜๊ธฐ๋„ ํ•œ๋‹ค.

  • ํ•˜์ง€๋งŒ, ref๋Š” state์™€ ๋‹ฌ๋ฆฌ, ๊ฐ’์ด ๋ณ€ํ• ๋•Œ ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ์ „์ฒด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋ง ์‹œํ‚ค์ง€ ์•Š๊ณ , ๋‚ด๊ฐ€ ์›ํ•˜๋Š” ๊ฐ’๋งŒ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์„๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

2. useRef

  • ๋ฆฌ์•กํŠธ์˜ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ ref๋ฅผ ์‰ฝ๊ฒŒ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” Hook์ด๋‹ค.

2 - 1. State์™€ Ref

Code 1

import React, { useState } from "react";

const App = () => {
	const [count, setCount] = useState(0);
    const increaseCountState = () => {
    	setCount(count + 1);
    };

    console.log("๋ฆฌ๋ Œ๋”๋ง");

    return (
    	<div>
        	<p> State : {count} </p>
            <button onClick={increaseCountState}>
            	+1
            </button>
        </div>
    )
}

export default App;
  • ์œ„์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ด ๋ณด๋ฉด, ๋ฒ„ํŠผ์„ ํ•œ๋ฒˆ ๋ˆ„๋ฅผ๋•Œ๋งˆ๋‹ค, count๋ผ๋Š” ์ƒํƒœ์˜ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋ฉด์„œ, ์ฝ˜์†”์— ์ฐ์€ "๋ฆฌ๋ Œ๋”๋ง"์ด๋ผ๋Š” ๋ฌธ์ž๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค.

  • ์ปดํฌ๋„ŒํŠธ(ํ•จ์ˆ˜) ๋‚ด๋ถ€์˜ ์ƒํƒœ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด, ์ปดํฌ๋„ŒํŠธ ์ž์ฒด๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” state๊ฐ’์„ ์‚ฌ์šฉ์‹œ, ์„ฑ๋Šฅ์ ์œผ๋กœ ์ข‹์ง€ ์•Š๋‹ค.

  • ์ด๊ฒƒ์„ useRef๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ณ€๊ฒฝํ•ด ๋ณด๋ฉด,

Code 2

import React, { useRef } from "react";

const App = () => {
	const countRef = useRef(0);
    const increaseCountRef = () => {
    	countRef.current += 1;
        console.log(`Ref : ${countRef.current}`);
    };

    console.log("๋ฆฌ๋ Œ๋”๋ง");

    return (
    	<div>
        	<p> State : {count} </p>
            <button onClick={increaseCountRef}>
            	+1
            </button>
        </div>
    )
}

export default App;
  • Code 1๊ณผ ๋‹ค๋ฅธ์ ์€ ์ด์ „์— useState๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋˜ ์ƒํƒœ๊ฐ’์„ useRef๋กœ ๋ณ€๊ฒฝํ•œ ๊ฒƒ์ด๋‹ค.

  • ๋ฒ„ํŠผ์„ ํด๋ฆญ์‹œ, "๋ฆฌ๋ Œ๋”๋ง"์ด๋ผ๋Š” ๋ฌธ์ž๊ฐ€ ์ „ํ˜€ ์ถœ๋ ฅ๋˜์ง€ ์•Š๋Š”๋‹ค. state์™€ ๋‹ค๋ฅด๊ฒŒ ๊ฐ’์ด ๋ณ€๊ฒฝ๋˜๋„ ์ปดํฌ๋„ŒํŠธ (ํ•จ์ˆ˜)์˜ ๋ฆฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š” ๊ฒƒ์ด๋‹ค.

  • ํ•˜์ง€๋งŒ ๋ฆฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋”๋ผ๋„, increaseRef ํ•จ์ˆ˜ ๋‚ด๋ถ€์— ์ ํ˜€์žˆ๋Š” console.log์— ์˜ํ•˜์—ฌ ๋ณ€๊ฒฝ๋˜๋Š” ref์˜ ๊ฐ’์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค

console.log(countRef)๋ฅผ ์‹คํ–‰ํ•ด ๋ณด๋ฉด {current : 0}์ด๋ผ๋Š” ๊ฐ์ฒด ๊ฐ’์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ๊ฒƒ์€ ํ•ด๋‹น ๊ฐ์ฒด์˜ value ๊ฐ’์ด๋ฏ€๋กœ, increaseRef์˜ ์‹คํ–‰ ๊ตฌ๋ฌธ์— countRef.current๋กœ ์ž‘์„ฑํ•œ ๊ฒƒ.

2 - 2. ์ผ๋ฐ˜ ๋ณ€์ˆ˜์™€ Ref

Code 3

import React, { useRef, useState } from "react";

const App = () => {
	const [render, setRender] = useState(0);
   	const countRef = useRef(0);
    let countVar = 0;

    const increaseRef = () => {
    	countRef.current += 1;
        console.log(`countRef = ${countRef}`);
    };

    const increaseVar = () => {
    	countVar += 1;
        console.log(`countVar = ${countVar}`);
    }

    const doRendering = () => {
    	serRender(render + 1);
    }

    return (
    	<div>
        	<p>Ref : {countRef}</p>
            <p>Var : {countVar}</p>

            <button onClick={doRendering}> Rendering </button>
            <button onClick={increaseRef}> + Ref </button>
            <button onClick={increaseVar}> + Var </button>
        </div>
    )
}

export default App;
  • ์šฐ์„  Code 3์— ๋Œ€ํ•œ ์„ค๋ช…์„ ๊ฐ„๋žตํ•˜๊ฒŒ ํ•˜์ž๋ฉด, App ์ปดํฌ๋„ŒํŠธ ๋‚ด์˜ ์ผ๋ฐ˜๋ณ€์ˆ˜ countVar, **ref์ธ countRef**๋ฅผ ๋ณ€๊ฒฝ์‹œ์ผœ์ฃผ๋Š” ํ•จ์ˆ˜ increaseVar, increaseRef๋ฅผ ๊ฐ๊ฐ ์„ ์–ธํ•œ ๋’ค, **๋ธŒ๋ผ์šฐ์ €๋ฅผ ๋ฆฌ๋ Œ๋”๋ง ์‹œ์ผœ์ค„ ํ•จ์ˆ˜ doRendering**์„ ์„ ์–ธ ํ•ด๋†จ๋‹ค.

  • Code 3์„ ์‹คํ–‰ ํ•ด ๋ณด๋ฉด, ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜๊ธฐ ์ „, countVar, countRef๋Š” 1์”ฉ ์ฆ๊ฐ€ํ•˜๋ฉด์„œ ์ž˜ ์ž‘๋™ํ•œ๋‹ค.

  • ํ•˜์ง€๋งŒ, doRenderingํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋œ ํ›„์—๋Š” countVar๋ณ€์ˆ˜๋Š” 0์œผ๋กœ ์ดˆ๊ธฐํ™” ๋˜๊ณ , countRef๋Š” ์ด์ „์— ๋”ํ•ด์ง„ ๊ฐ’์ด ๊ทธ๋Œ€๋กœ ์œ ์ง€๋œ๋‹ค.

  • ๋ฆฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜๋ฉด, ์ปดํฌ๋„ŒํŠธ(ํ•จ์ˆ˜)์˜ ๋ชจ๋“  ๋กœ์ง์ด ์žฌ์‹คํ–‰๋˜๋Š”๋ฐ, ์ด ๊ณผ์ •์—์„œ ์ปดํฌ๋„ŒํŠธ ๋‚ด์˜ ์ผ๋ฐ˜ ๋ณ€์ˆ˜ countVar๋Š” 0์œผ๋กœ ์ดˆ๊ธฐํ™”๋˜์ง€๋งŒ, ref๋Š” ๊ทธ๋ ‡์ง€ ์•Š๊ณ  ์ด์ „์˜ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•œ๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด, useRef๋Š” ์–ด๋– ํ•œ ๊ฐ’์„ ๋ณ€ํ™”์‹œ์ผœ์•ผ ํ•˜์ง€๋งŒ, ๊ทธ ๊ฐ’์ด ๋ Œ๋”๋ง์„ ๋ฐœ์ƒ์‹œ์ผœ์•ผ ํ•˜์ง€ ์•Š์•„์•ผ ํ• ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

Last updated