๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ““Book

[๋ชจ๋˜ ๋ฆฌ์•กํŠธ Deep Dive] 03์žฅ ๋ฆฌ์•กํŠธ ํ›… ๊นŠ๊ฒŒ ์‚ดํŽด๋ณด๊ธฐ

by s2ylvia 2025. 1. 18.

 

๋ฆฌ์•กํŠธ๋กœ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ํ›…์€ ํ•ญ์ƒ ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ •ํ™•ํžˆ ์ด ํ›…์ด ์–ด๋–ค ์˜๋ฏธ์ด๊ณ  ์™œ ์ด๋ ‡๊ฒŒ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฅด๋Š” ๊ฒƒ ๊ฐ™์•„์„œ ํ•œ๋ฒˆ ๋ชจ๋˜ ๋ฆฌ์•กํŠธ Deep Dive์— ์žˆ๋Š” ๋‚ด์šฉ์„ ์ •๋ฆฌํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


ํ›…(hook)์ด ๋ญ๋ƒ?

ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋งŒ ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ์ƒํƒœ ๊ด€๋ฆฌ์™€ ๋ผ์ดํ”„์‚ฌ์ดํด(์ƒ๋ช…์ฃผ๊ธฐ) ๋ฉ”์„œ๋“œ๋ฅผ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ฃ .

 

๋Œ€ํ‘œ์ ์ธ ํ›…์— ๋Œ€ํ•ด ์•Œ์•„๋ด…์‹œ๋‹ค.

 

1.useState

ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ์ƒํƒœ๋ฅผ ์ •์˜ํ•˜๊ณ , ์ด ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ํ›…์ด๋‹ค.

import {useState} from 'react';

const [state, setState] = useState(initialState);

 

๋ฆฌ์•กํŠธ๋Š” useState๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ์ž์ฒด์ ์œผ๋กœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด ์ƒํƒœ๊ฐ’์„ ๊ด€๋ฆฌํ•˜๋ฉด ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜์ง€ ์•Š๋Š”๋‹ค.

์™œ๋ƒ? ๋ฆฌ์•กํŠธ๋Š” ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์˜ return์„ ์‹คํ–‰ํ•ด ๊ฒฐ๊ณผ๋ฌผ(JSX)์„ ์ €์žฅํ•˜๊ณ  ๊ทธ๊ฑธ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ด์„œ ๊ฐ€์ƒDOM์œผ๋กœ ๋งŒ๋“ ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด์ „์˜ ๊ฐ€์ƒ DOM์ด๋ž‘ ๋น„๊ตํ•ด์„œ ์‹ค์ œ ๋ณ€๊ฒฝ์‚ฌํ•ญ๋งŒ DOM์— ๋ฐ˜์˜ํ•˜๋Š” ๋ Œ๋”๋ง ๊ณผ์ •์„ ๊ฑฐ์น˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

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

๊ทธ๋ ‡๋‹ค๋ฉด useState ํ›…์˜ ๊ฒฐ๊ณผ๊ฐ’์€ ์–ด๋–ป๊ฒŒ ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋ผ๋„ ๊ทธ ๊ฐ’์„ ์œ ์ง€ํ•˜๊ณ  ์žˆ์„๊นŒ?

 

๋ฆฌ์•กํŠธ๋Š” ํด๋กœ์ €๋ฅผ ์ด์šฉํ–ˆ๋‹ค.

 

์–ด๋–ค ํ•จ์ˆ˜(useState) ๋‚ด๋ถ€์— ์„ ์–ธ๋œ ํ•จ์ˆ˜(setState)๊ฐ€ ํ•จ์ˆ˜(useState)์˜ ์‹คํ–‰์ด ์ข…๋ฃŒ๋œ ์ดํ›„์—๋„(useState๊ฐ€ ํ˜ธ์ถœ๋œ ์ดํ›„์—๋„) ์ง€์—ญ๋ณ€์ˆ˜์ธ state๋ฅผ ๊ณ„์† ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

 

ํด๋กœ์ €๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์™ธ๋ถ€์— ํ•ด๋‹น ๊ฐ’์„ ๋…ธ์ถœ์‹œํ‚ค์ง€ ์•Š๊ณ  ์˜ค์ง ๋ฆฌ์•กํŠธ์—์„œ๋งŒ ์“ธ ์ˆ˜ ์žˆ์—ˆ๊ณ , ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งค๋ฒˆ ์‹คํ–‰๋˜๋”๋ผ๋„ useState์—์„œ ์ด์ „์˜ ๊ฐ’์„ ์ •ํ™•ํ•˜๊ฒŒ ๊บผ๋‚ด ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ๋๋‹ค.

 

๊ฒŒ์œผ๋ฅธ ์ดˆ๊ธฐํ™”

๊ฒŒ์œผ๋ฅธ ์ดˆ๊ธฐํ™”๋Š” useState์— ๋ณ€์ˆ˜ ๋Œ€์‹  ํ•จ์ˆ˜๋ฅผ ๋„˜๊ธฐ๋Š” ๊ฒƒ์ด๋‹ค.

์˜ค๋กœ์ง€ state๊ฐ€ ์ฒ˜์Œ ๋งŒ๋“ค์–ด์งˆ ๋•Œ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค.

์ดํ›„์— ๋ฆฌ๋ Œ๋”๋ง์ด ๋ฐœ์ƒ๋œ๋‹ค๋ฉด ์ด ํ•จ์ˆ˜์˜ ์‹คํ–‰์€ ๋ฌด์‹œ๋œ๋‹ค.

๋ฆฌ์•กํŠธ์—์„œ๋Š” ๋ Œ๋”๋ง์ด ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์˜ ํ•จ์ˆ˜๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋œ๋‹ค๋Š” ์ ์„ ๋ช…์‹ฌํ•˜์ž.

 

๊ฒŒ์œผ๋ฅธ ์ดˆ๊ธฐํ™”๋Š” ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ์ด ์š”๊ตฌ๋  ๋•Œ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.

(์Šคํ† ๋ฆฌ์ง€ ์ ‘๊ทผ, map, filter, find ๊ฐ™์€ ๋ฐฐ์—ด์— ๋Œ€ํ•œ ์ ‘๊ทผ, ์ดˆ๊นƒ๊ฐ’ ๊ณ„์‚ฐ์„ ์œ„ํ•ด ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ํ•„์š”ํ•  ๋•Œ..)


2.useEffect

์ƒ๋ช…์ฃผ๊ธฐ ๋ฉ”์„œ๋“œ๋ฅผ ๋Œ€์ฒดํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ๊ฒŒ ์•„๋‹ˆ๋ผ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด ์ปดํฌ๋„ŒํŠธ์˜ ์—ฌ๋Ÿฌ ๊ฐ’๋“ค์„ ํ™œ์šฉํ•ด ๋™๊ธฐ์ ์œผ๋กœ ๋ถ€์ˆ˜ ํšจ๊ณผ(์‚ฌ์ด๋“œ ์ดํŽ™ํŠธ)๋ฅผ ๋งŒ๋“œ๋Š” ๋งค์ปค๋‹ˆ์ฆ˜์ด๋‹ค.

function Component(){
  useEffect(() => {
   //do something
  }, [props, state]);
}

 

์ฒซ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ๋Š” ์‹คํ–‰ํ•  ๋ถ€์ˆ˜ ํšจ๊ณผ๊ฐ€ ํฌํ•จ๋œ ํ•จ์ˆ˜๋ฅผ, ๋‘๋ฒˆ์งธ ์ธ์ˆ˜๋กœ๋Š” ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ์ „๋‹ฌํ•œ๋‹ค.

์˜์กด์„ฑ ๋ฐฐ์—ด์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค useEffect์˜ ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜์ธ ์ฝœ๋ฐฑ์„ ์‹คํ–‰ํ•œ๋‹ค.

 

ํด๋ฆฐ์—… ํ•ฉ์ˆ˜์˜ ๋ชฉ์ 

์ผ๋ฐ˜์ ์œผ๋กœ ์ด ํด๋ฆฐ์—… ํ•จ์ˆ˜๋Š” ์ด๋ฒคํŠธ๋ฅผ ๋“ฑ๋กํ•˜๊ณ  ์ง€์šธ ๋•Œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์•Œ๋ ค์ ธ ์žˆ๋‹ค.

useEffect๋Š” ์ฝœ๋ฐฑ์ด ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ์ด์ „์˜ ํด๋ฆฐ์—… ํ•จ์ˆ˜๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ๊ทธ ํด๋ฆฐ์—… ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•œ ๋’ค์— ์ฝœ๋ฐฑ์„ ์‹คํ–‰ํ•œ๋‹ค.
๋”ฐ๋ผ์„œ ์ด๋ฒคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ ์ „์— ์ด์ „์— ๋“ฑ๋กํ–ˆ๋˜ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์‚ญ์ œํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ํด๋ฆฐ์—… ํ•จ์ˆ˜์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๊ฐ€ ๋ฌดํ•œํžˆ ์ถ”๊ฐ€๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

์–ธ๋งˆ์šดํŠธ ๊ฐœ๋…์ด๋ผ๊ธฐ๋ณด๋‹ค๋Š” ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋์„ ๋•Œ ์˜์กด์„ฑ ๋ณ€ํ™”๊ฐ€ ์žˆ์—ˆ์„ ๋‹น์‹œ ์ด์ „ ์ƒํƒœ๋ฅผ ์ฒญ์†Œํ•ด ์ฃผ๋Š” ๊ฐœ๋…์œผ๋กœ ๋ณด๋Š” ๊ฒƒ์ด ์˜ณ๋‹ค.

 

์˜์กด์„ฑ ๋ฐฐ์—ด

1.๋นˆ ๋ฐฐ์—ด

2.์•„๋ฌด๋Ÿฐ ๊ฐ’๋„ ๋„˜๊ธฐ์ง€ ์•Š๊ธฐ

3.์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ์›ํ•˜๋Š” ๊ฐ’์„ ๋„ฃ๊ธฐ

 

๋นˆ๋ฐฐ์—ด์ด๋ฉด ์ตœ์ดˆ ๋ Œ๋”๋ง ์งํ›„์— ์‹คํ–‰๋œ ๋‹ค์Œ๋ถ€ํ„ฐ๋Š” ๋”์ด์ƒ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. (useEffect๋Š” ์–ธ์ œ๋‚˜ ๋ Œ๋”๋ง ๋œ ํ›„์— ์‹คํ–‰)

์•„๋ฌด๋Ÿฐ ๊ฐ’๋„ ๋„˜๊ธฐ์ง€ ์•Š์œผ๋ฉด ๋ Œ๋”๋งํ•  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•ด ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋œ๋‹ค.

๊ฐ’์ด ์žˆ์œผ๋ฉด ๊ทธ ๊ฐ’์ด ๋ณ€ํ•  ๋•Œ๋งˆ๋‹ค ์‹คํ–‰๋œ๋‹ค.

 

(useEffect๋Š” ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•ด์ค€๋‹ค. ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋˜๋ฉด ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฐ˜ํ™˜์„ ์ง€์—ฐ์‹œํ‚ค๊ณ  ๋ฌด๊ฑฐ์šด ์ž‘์—…์ผ ๊ฒฝ์šฐ ๋ Œ๋”๋ง์„ ๋ฐฉํ•ดํ•˜๋ฏ€๋กœ ์„ฑ๋Šฅ์— ์•…์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ๋‹ค.)

 

์ฆ‰, useEffect๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋œํ›„์— ์–ด๋– ํ•œ ๋ถ€์ˆ˜ ํšจ๊ณผ๋ฅผ ์ผ์œผํ‚ค๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ›…์ด๋‹ค.


3.useRef

useRef๋Š” ์ฐธ์กฐ๋ฅผ ์ƒ์„ฑ(๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜)ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ํ›…์ด๋‹ค.

useState์™€ ๋™์ผํ•˜๊ฒŒ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜๋„ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๊ฐ’์„ ์ €์žฅํ•œ๋‹ค๋Š” ๊ณตํ†ต์ ์ด ์žˆ๋‹ค.

ํ•˜์ง€๋งŒ ํฐ ์ฐจ์ด์ ์ด ์žˆ๋‹ค.

 

1. ๋ฐ˜ํ™˜๊ฐ’์ธ ๊ฐ์ฒด ๋‚ด๋ถ€์— ์žˆ๋Š” current๋กœ ๊ฐ’์— ์ ‘๊ทผ ๋˜๋Š” ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

2. ๊ทธ ๊ฐ’์ด ๋ณ€ํ•˜๋”๋ผ๋„ ๋ Œ๋”๋ง์„ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๋Š”๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  useRef๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ๋งŒ ์ƒ์„ฑ๋˜๋ฉฐ, ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ๋ผ๋„ ๊ฐ๊ฐ ๋ณ„๊ฐœ์˜ ๊ฐ’์„ ๋ฐ”๋ผ๋ณธ๋‹ค.

DOM ์š”์†Œ์— ์ง์ ‘ ์ ‘๊ทผํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ณ ,

useRef๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒ์„ฑํ•œ ์ฐธ์กฐ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ ์ƒ์„ฑ๋˜์ง€ ์•Š๊ณ , ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ข…๋ฃŒ๋˜๊ฑฐ๋‚˜ ๊ฐ€๋น„์ง€ ์ปฌ๋ ‰ํŒ…๋˜๊ธฐ ์ „๊นŒ์ง€ ๊ธฐ์กด์— ์ƒ์„ฑํ•œ ์ฐธ์กฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•œ๋‹ค. => ๊ทธ๋ž˜์„œ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐœ์ƒ์‹œํ‚ค์ง€์•Š๋Š”๊ฑฐ๊ตฌ๋‚˜..