4. useRef & Custom Hook

useRef

  • ๋ Œ๋”๋ง์ด ๋ถˆํ•„์š”ํ•œ ๊ฐ’์„ ์ฐธ์กฐํ•˜๊ฒŒ ํ•ด์ฃผ๋Š” ํ›…

import { useRef } from 'react';

const ref = useRef(initialValue)
  • initial value๋กœ ์ดˆ๊ธฐํ™”๋œ current ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ref ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ด

  • ๋‹ค์Œ ๋ Œ๋”๋ง์—์„œ๋„ useRef๋Š” ๋™์ผํ•œ ๊ฐ์ฒด๋ฅผ ๋ฆฌํ„ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— current ์†์„ฑ์— ์ €์žฅํ•œ ๊ฐ’์€ ๋‚˜์ค‘์— ์ฝ์–ด๋“ค์ผ ์ˆ˜ ์žˆ์Œ

  • ref์˜ ๋ณ€ํ™”๋Š” ๋ฆฌ๋ Œ๋”๋ง์„ triggerํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์—์„œ state์™€ ์ฐจ์ด๊ฐ€ ์žˆ์Œ

ref์™€ ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋“ค์˜ ์ฐจ์ด

  1. ์ผ๋ฐ˜ ๋ณ€์ˆ˜์™€ ๋‹ฌ๋ฆฌ ๋งค ๋ Œ๋”๋ง๋งˆ๋‹ค ๋ฆฌ์…‹๋˜์ง€ ์•Š๊ณ  ๊ฐ’์ด ์ €์žฅ๋จ

  2. state์™€ ๋‹ฌ๋ฆฌ ๋ฆฌ๋ Œ๋”๋ง๋˜์ง€ ์•Š์Œ

  3. ์™ธ๋ถ€ ๋ณ€์ˆ˜์™€ ๋‹ฌ๋ฆฌ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ๊ณต์œ ๋˜์ง€ ์•Š์Œ

ref๋กœ DOM ์กฐ์ž‘ํ•˜๊ธฐ

function MyComponent() {
  const inputRef = useRef(null);
  // ...
  return <input ref={inputRef} />;
}

function handleClick() {
  inputRef.current.focus();
}
  1. null๊ฐ’์„ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ๊ฐ–๋Š” ref ๊ฐ์ฒด ์ƒ์„ฑ

  2. ref ๊ฐ์ฒด๋ฅผ ref attribute๋กœ ๋„˜๊น€

  3. DOM๋…ธ๋“œ๊ฐ€ ์Šคํฌ๋ฆฐ์— ์ƒ์„ฑ๋˜๊ณ  ๋‚˜๋ฉด current ์†์„ฑ์— DOM ๋…ธ๋“œ๊ฐ€ ์ €์žฅ๋จ

  4. ref์˜ current๊ฐ’์œผ๋กœ DOM ๋…ธ๋“œ๋ฅผ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ์Œ

  5. ๋…ธ๋“œ๊ฐ€ ์Šคํฌ๋ฆฐ์—์„œ ์‚ฌ๋ผ์ง€๋ฉด current๊ฐ’์€ null์ด ๋จ

๋ Œ๋”๋ง ์ค‘์— ref ๊ฐ’์„ read/write ํ•˜์ง€ ์•Š๊ธฐ

  • ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋Š” ํ•ญ์ƒ ์ˆœ์ˆ˜ํ•จ์ˆ˜์—ฌ์•ผํ•จ

  • ์ธํ’‹์ด ๋™์ผํ•˜๋‹ค๋ฉด ํ•ญ์ƒ ๋™์ผํ•œ ๊ฒฐ๊ณผ(JSX)๋ฅผ ๋ฆฌํ„ดํ•ด์•ผํ•จ

  • ๋‹ค๋ฅธ ์ˆœ์„œ๋‚˜ ๋‹ค๋ฅธ ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ˜ธ์ถœํ•ด๋„ ๋‹ค๋ฅธ ํ˜ธ์ถœ์˜ ๊ฒฐ๊ณผ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์•„์•ผ ํ•จ

  • ๋ Œ๋”๋ง ์ค‘์— ๊ฐ’์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค๋ฉด state๋ฅผ ์“ธ ๊ฒƒ

function MyComponent() {
  // ...
  // ๐Ÿšฉ Don't write a ref during rendering
  myRef.current = 123;
  // ...
  // ๐Ÿšฉ Don't read a ref during rendering
  return <h1>{myOtherRef.current}</h1>;
}

function MyComponent() {
  // ...
  useEffect(() => {
    // โœ… You can read or write refs in effects
    myRef.current = 123;
  });
  // ...
  function handleClick() {
    // โœ… You can read or write refs in event handlers
    doSomething(myOtherRef.current);
  }
  // ...
}

ref contents์˜ ์žฌ์ƒ์„ฑ ํ”ผํ•˜๊ธฐ

๋ณดํ†ต ref์˜ ์ดˆ๊ธฐ๊ฐ’์€ ์žฌ๋ Œ๋”๋ง์‹œ ๋ฌด์‹œ๋จ

๊ทธ๋Ÿฌ๋‚˜ ์•„๋ž˜ ์ฝ”๋“œ๋Š” ๋งค๋ฒˆ new VideoPlayer()๋ฅผ ์ƒ์„ฑํ•˜๊ฒŒ ๋จ

function Video() {
  const playerRef = useRef(new VideoPlayer());
  // ...

๋ถˆํ•„์š”ํ•œ ๊ฐ์ฒด๋ฅผ ๋งค๋ฒˆ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ๋‚ญ๋น„์ด๋ฏ€๋กœ ์•„๋ž˜์™€ ๊ฐ™์ด ์ž‘์„ฑ

function Video() {
  const playerRef = useRef(null);
  if (playerRef.current === null) {
    playerRef.current = new VideoPlayer();
  }
  // ...

์ผ๋ฐ˜์ ์œผ๋กœ ref ๊ฐ’์„ ๋ Œ๋”๋งํ•˜๋Š” ๋™์•ˆ ์“ฐ์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์ง€๋งŒ ์—ฌ๊ธฐ์„œ๋Š” ์‹คํ–‰๊ณผ๊ฐ€ ํ•ญ์ƒ ๋™์ผํ•œ ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๊ธฐ ๋•Œ๋ฌธ์— OK

Custom Hook

๋‚˜๋งŒ์˜ ํ›…์„ ๋งŒ๋“ค์–ด ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ๋กœ์ง์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ

์ƒํƒœ ๊ด€๋ จ ๋กœ์ง์„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ณต์œ ํ•˜๋Š” ๋‘๊ฐ€์ง€ ์ „ํ†ต์ ์ธ ๋ฐฉ๋ฒ• : render props, ๊ณ ์ฐจ์ปดํฌ๋„ŒํŠธ

-> ์ปค์Šคํ…€ ํ›…์„ ํ†ตํ•ด ๋‘๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๋Œ€์‹ ํ•  ์ˆ˜ ์žˆ์Œ

์ปค์Šคํ…€ ํ›… ๋งŒ๋“œ๋Š” ๋ฒ•

  • ์ด๋ฆ„์ด use๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋˜๋‹ค๋ฅธ ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌ

    • use๋กœ ์‹œ์ž‘ํ•ด์•ผ Hook์˜ ๊ทœ์น™์„ ์ง€ํ‚ค๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ์Œ

  • ์ปค์Šคํ…€ํ›…์€ ๋ฆฌ์•กํŠธ์˜ ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์ด๋ผ๊ธฐ๋ณด๋‹ค hook์˜ ๋””์ž์ธ์„ ๋”ฐ๋ฅด๋Š” ๊ด€์Šต

  • ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ™์€ Hook์„ ์‚ฌ์šฉํ•ด๋„ state๋‚˜ effect๋ฅผ ๊ณต์œ ํ•˜์ง€๋Š” ์•Š์Œ(๋…๋ฆฝ์ )

    • ๊ฐ๊ฐ์˜ Hook์— ๋Œ€ํ•œ ํ˜ธ์ถœ์€ ์„œ๋กœ ๋…๋ฆฝ์ ์œผ๋กœ useState๋‚˜ useEffect๋ฅผ ํ˜ธ์ถœํ•œ ๊ฒƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€

Hook์˜ ๊ทœ์น™

์•„๋ž˜์˜ ๊ทœ์น™์„ ์ง€์ผœ์•ผ ์ปดํฌ๋„ŒํŠธ์˜ ๋ชจ๋“  ์ƒํƒœ ๊ด€๋ จ ๋กœ์ง์„ ์†Œ์Šค์ฝ”๋“œ์—์„œ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์ด๋„๋ก ํ•  ์ˆ˜ ์žˆ์Œ

  1. ์ตœ์ƒ์œ„์—์„œ๋งŒ Hook์„ ํ˜ธ์ถœํ•ด์•ผํ•จ

  2. ์˜ค์ง React ํ•จ์ˆ˜๋‚ด์—์„œ๋งŒ ํ˜ธ์ถœํ•ด์•ผํ•จ

  • ๋ฐ˜๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ, ์ค‘์ฒฉ๋œ ํ•จ์ˆ˜์•ˆ์—์„œ Hook์„ ํ˜ธ์ถœํ•˜๋ฉด ์•ˆ๋จ

    • ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ํ•ญ์ƒ ๋™์ผํ•œ ์ˆœ์„œ๋กœ Hook์ด ํ˜ธ์ถœ๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•จ

  • React ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋‚˜ Custom Hook์•ˆ์—์„œ๋งŒ Hook์„ ํ˜ธ์ถœํ•ด์•ผํ•จ

Hook์ด ์ตœ์ƒ์œ„์—์„œ ํ˜ธ์ถœ๋˜์–ด์•ผ ํ•˜๋Š” ์ด์œ 

ํ•œ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ์˜ useState์™€ useEffect๊ฐ€ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ์Œ

๋ฆฌ์•กํŠธ๋Š” ์–ด๋–ค state๊ฐ€ ์–ด๋–ค useState์™€ ๋Œ€์‘ํ•˜๋Š”์ง€ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์„๊นŒ?

  • ํ›…์ด ํ˜ธ์ถœ๋œ ์ˆœ์„œ์— ๋”ฐ๋ฆ„

  • ๋ชจ๋“  ๋ Œ๋”๋ง์—์„œ Hook์˜ ํ˜ธ์ถœ ์ˆœ์„œ๊ฐ€ ๊ฐ™๊ธฐ ๋•Œ๋ฌธ์— ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์Œ

  • ๊ทธ๋Ÿฌ๋‚˜ ์กฐ๊ฑด๋ฌธ ์•ˆ์—์„œ ํ›…์„ ํ˜ธ์ถœํ•˜๋ฉด ๋‹ค์Œ ๋ Œ๋”๋ง์‹œ ํ›…์˜ ํ˜ธ์ถœ์ˆœ์„œ๊ฐ€ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Œ

  • ๋ฆฌ์•กํŠธ๋Š” ์ด์ „ ๋ Œ๋”๋ง๊ณผ ๋™์ผํ•œ ์ˆœ์„œ๋กœ ํ›…์ด ์‹คํ–‰๋  ๊ฑฐ๋ผ๊ณ  ์˜ˆ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„๊ทธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Œ

  • ์กฐ๊ฑด๋ถ€๋กœ effect๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ๋ฅผ ์›ํ•œ๋‹ค๋ฉด ์กฐ๊ฑด๋ฌธ์„ Hook ๋‚ด๋ถ€์— ๋„ฃ์–ด์•ผ ํ•จ

Last updated