Ref / Effect

Ref / Effect

Tags
Frontend
React
Published
Author
์ปดํฌ๋„ŒํŠธ๊ฐ€ ํŠน์ • ์ •๋ณด๋ฅผ โ€˜๊ธฐ์–ตโ€™ํ•˜๋„๋ก ํ•˜๊ณ  ์‹ถ์ง€๋งŒ ํ•ด๋‹น ์ •๋ณด๊ฐ€ ์ƒˆ ๋ Œ๋”๋ง์„ ์ด‰๋ฐœํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ref๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
import { useRef } from โ€˜reactโ€™;
ref.current ์†์„ฑ์„ ํ†ตํ•ด ํ•ด๋‹น ref์˜ ํ˜„์žฌ ๊ฐ’์— ์•ก์„ธ์Šค ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ ์˜๋„์ ์œผ๋กœ ๋ณ€์ด ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ๊ฐ€ ๋ชจ๋‘ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. React๊ฐ€ ์ถ”์ ํ•˜์ง€ ์•Š๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๋น„๋ฐ€ ์ฃผ๋จธ๋‹ˆ์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๐Ÿ“Œ
์ปดํฌ๋„ŒํŠธ๋Š” ref๊ฐ€ ์ฆ๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ๋ฆฌ๋ Œ๋”๋ง๋˜์ง€ ์•Š๋Š”๋‹ค

ref ์™€ state์˜ ์ฐจ์ด์ 

refs
state
useRef(initialValue)๋Š”ย { current: initialValue }์„ ๋ฐ˜ํ™˜
useState(initialValue)๋Š” state ๋ณ€์ˆ˜์˜ ํ˜„์žฌ๊ฐ’๊ณผ state ์„ค์ •์žํ•จ์ˆ˜([value, setValue])๋ฅผ ๋ฐ˜ํ™˜
๋ณ€๊ฒฝ ์‹œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ด‰๋ฐœํ•˜์ง€ ์•Š์Œ
๋ณ€๊ฒฝ ์‹œ ๋ฆฌ๋ Œ๋”๋ง์„ ์ด‰๋ฐœํ•จ
Mutableโ€” ๋ Œ๋”๋ง ํ”„๋กœ์„ธ์Šค ์™ธ๋ถ€์—์„œ current ๊ฐ’์„ ์ˆ˜์ •ํ•˜๊ณ  ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Œ
โ€œImmutableโ€โ€” state setting ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ state ๋ณ€์ˆ˜๋ฅผ ์ˆ˜์ •ํ•ด ๋ฆฌ๋ Œ๋”๋ง์„ ๋Œ€๊ธฐ์—ด์— ์ถ”๊ฐ€ํ•ด์•ผํ•จ
๋ Œ๋”๋ง ์ค‘์—๋Š”ย currentย ๊ฐ’์„ ์ฝ๊ฑฐ๋‚˜ ์“ฐ์ง€ ์•Š์•„์•ผ ํ•จ
์–ธ์ œ๋“ ์ง€ state๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์Œ. ๊ฐ ๋ Œ๋”๋ง์—๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ์ž์ฒด stateย snapshot์ด ์žˆ์Œ

ref๋Š” ๋‚ด๋ถ€์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋‚˜์š”?

// Inside of React function useRef(initialValue) { const [ref, unused] = useState({ current: initialValue }); return ref; }
์ฒซ ๋ฒˆ์งธ ๋ Œ๋”๋ง ์ค‘์— useRef๋Š” {current: initialValue}๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ์ฒด๋Š” React์— ์˜ํ•ด ์ €์žฅ๋˜๋ฏ€๋กœ ๋‹ค์Œ ๋ Œ๋”๋ง ์ค‘์— ๋™์ผํ•œ ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

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

React ๋Š” ๋ Œ๋”๋ง ์ถœ๋ ฅ๊ณผ ์ผ์น˜ํ•˜๋„๋ก DOM์„ ์ž๋™์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋ฏ€๋กœ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž์ฃผ ์กฐ์ž‘ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋•Œ๋กœ๋Š” ๋…ธ๋“œ์— ์ดˆ์ ์„ ๋งž์ถ”๊ฑฐ๋‚˜ ์Šคํฌ๋กคํ•˜๊ฑฐ๋‚˜ ํฌ๊ธฐ์™€ ์œ„์น˜๋ฅผ ์ธก์ •ํ•˜๊ธฐ ์œ„ํ•ด React๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” DOM ์š”์†Œ์— ์ ‘๊ทผํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ธ๋“œ์— ๋Œ€ํ•œ ref ๊ฐ€์ ธ์˜ค๊ธฐ

  1. React๊ฐ€ ๊ด€๋ฆฌํ•˜๋Š” DOM ๋…ธ๋“œ์— ์ ‘๊ทผํ•˜๋ ค๋ฉด, ๋จผ์ € useRef ํ›…์„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
    1. import { useRef } from 'react';
  1. ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ref๋ฅผ ์„ ์–ธ
    1. const myRef = useRef(null);
  1. DOM ๋…ธ๋“œ๋ฅผ ๊ฐ€์ ธ์˜ฌ JSXํƒœ๊ทธ์— ref ์†์„ฑ์œผ๋กœ ์ฐธ์กฐ๋ฅผ ์ „๋‹ฌ
    1. <div ref={myRef}>

Effect๋ž€ ๋ฌด์—‡์ด๋ฉฐ ์ด๋ฒคํŠธ์™€๋Š” ์–ด๋–ค๊ฒŒ ๋‹ค๋ฅธ๊ฐ€์š”?

  • ๋ Œ๋”๋ง ์ฝ”๋“œ๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์— ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ props์™€ state๋ฅผ ๊ฐ€์ ธ์™€ ๋ณ€ํ™˜ํ•˜๊ณ  ํ™”๋ฉด์— ํ‘œ์‹œํ•  JSX๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋Š” ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ์žˆ๋Š” ํ•จ์ˆ˜๋กœ, ๊ณ„์‚ฐ๋งŒ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ณ„๋„์˜ ์ž‘์—…๋„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Effect ์ž‘์„ฑ ๋ฐฉ๋ฒ•

  1. Effect๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.
  1. Effect์˜ ์˜์กด์„ฑ์„ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.
  1. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ํด๋ฆฐ์—…์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

Step 1 : Declare an Effect

import { useEffect } from 'react';
function MyComponent() { useEffect(() => { // ์—ฌ๊ธฐ์˜ ์ฝ”๋“œ๋Š” ๋งค ๋ Œ๋”๋ง ํ›„์— ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. }); return <div />;
  1. React์—์„œ useEffect ํ›…์„ importํ•ฉ๋‹ˆ๋‹ค.
  1. ์ปดํฌ๋„ŒํŠธ์˜ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ์—์„œ ํ˜ธ์ถœํ•˜๊ณ  Effect ๋‚ด๋ถ€์— ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ๋งˆ๋‹ค React๋Š” ํ™”๋ฉด์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  useEffect ๋‚ด๋ถ€์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, useEffect๋Š” ํ•ด๋‹น ๋ Œ๋”๋ง์ด ํ™”๋ฉด์— ๋ฐ˜์˜์ด ๋  ๋•Œ๊นŒ์ง€ ์ฝ”๋“œ ์กฐ๊ฐ์˜ ์‹คํ–‰์„ โ€œ์ง€์—ฐโ€ํ•ฉ๋‹ˆ๋‹ค.

Step 2 : Specify the Effect dependencies

  • ๋•Œ๋กœ๋Š” ์†๋„๊ฐ€ ๋Š๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™ธ๋ถ€ ์‹œ์Šคํ…œ๊ณผ์˜ ๋™๊ธฐํ™”๊ฐ€ ํ•ญ์ƒ ์ฆ‰๊ฐ์ ์ธ ๊ฒƒ์€ ์•„๋‹ˆ๋ฏ€๋กœ ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ๋™๊ธฐํ™”๋ฅผ ๊ฑด๋„ˆ๋›ฐ๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
  • ๋•Œ๋กœ๋Š” ์ž˜๋ชป๋œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
useEffect(() => { // ... }, []);
useEffect ํ˜ธ์ถœ์˜ ๋‘ ๋ฒˆ์งธ ์ธ์ž๋กœ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ์ง€์ •ํ•˜์—ฌ React๊ฐ€ ๋ถˆํ•„์š”ํ•˜๊ฒŒ Effect๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•˜์ง€ ์•Š๋„๋ก ์ง€์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
useEffect(() => { // This runs after every render // ๋ Œ๋”์‹œ๋งˆ๋‹ค ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. }); useEffect(() => { // This runs only on mount (when the component appears) // ์˜ค์ง ๋งˆ์šดํŠธ์‹œ(์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‚˜ํƒ€๋‚  ๋•Œ)์—๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. }, []); useEffect(() => { // This runs on mount *and also* if either a or b have changed since the last render // ๋งˆ์šดํŠธ์‹œ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ a ๋˜๋Š” b๊ฐ€ ์ง์ „ ๋ Œ๋”์™€ ๋‹ฌ๋ผ์กŒ์„ ๋•Œ์—๋„ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. }, [a, b]);

Step 3 : Add cleanup if needed

useEffect(() => { const connection = createConnection(); connection.connect(); }, []);
Effect๋Š” ๋งˆ์šดํŠธ ์‹œ์—๋งŒ ์‹คํ–‰๋˜๋ฏ€๋กœ ์ฝ˜์†”์—์„œ๋Š” ํ•œ๋ฒˆ๋งŒ ์ธ์‡„๋  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜์ง€๋งŒ ๋‘๋ฒˆ ์ถœ๋ ฅ๋จ
useEffect(() => { const connection = createConnection(); connection.connect(); return () => { connection.disconnect(); }; }, []);
React๋Š” Effect๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋˜๊ธฐ ์ „์— ๋งค๋ฒˆ ํด๋ฆฐ์—… ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ํ•ด์ œ๋  ๋•Œ ๋งˆ์ง€๋ง‰์œผ๋กœ ํ•œ๋ฒˆ ๋” ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

Effect์˜ ์ƒ๋ช…์ฃผ๊ธฐ

  • ์ปดํฌ๋„ŒํŠธ๋Š” ํ™”๋ฉด์— ์ถ”๊ฐ€๋  ๋•Œ ๋งˆ์šดํŠธ๋ฉ๋‹ˆ๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ๋Š” props๋‚˜ state๋ฅผ ๋ฐ›์œผ๋ฉด ์—…๋ฐ์ดํŠธ๋ฉ๋‹ˆ๋‹ค.
  • ํ™”๋ฉด์—์„œ ์ œ๊ฑฐ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ ํ•ด์ œ๋ฉ๋‹ˆ๋‹ค.