React-Hooks

miaยท2023๋…„ 1์›” 1์ผ
0
post-custom-banner

๐Ÿ”ฅ useState()

์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ์ƒํƒœ
์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๊ฐ„ํŽธํ•˜๊ฒŒ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.
ํ˜„์žฌ ์ƒํƒœ๊ฐ’์€ state์—, state๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” setState ํ•จ์ˆ˜๋ฅผ ์ด์šฉ.
state๊ฐ€ ๋ณ€๊ฒฝ์ด ๋˜๋ฉด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋Š” ์ž๋™์œผ๋กœ ์žฌ๋ Œ๋”๋ง ๋œ๋‹ค.

const [state, setState] = useState(์ดˆ๊ธฐ๊ฐ’)
setState(๋ณ€๊ฒฝ)

๐Ÿ’กLazy Initial State
state์˜ ์ดˆ๊ธฐ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๋ฌด๊ฑฐ์šด ์ž‘์—…์„ ํ•ด์•ผ ํ•œ๋‹ค๋ฉด (ex. ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋Š” ๊ณ„์‚ฐ..) ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ๊ทธ ์ž‘์—… ๋˜ํ•œ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

const heavyWork = () => {
	console.log('์—„์ฒญ ์—„์ฒญ ๋ฌด๊ฑฐ์šด ์ž‘์—…!!!!');
    return 12345
}

const [number, setNumber] = useState(heavyWork)

state์˜ ์ดˆ๊ธฐ๊ฐ’์ด ์ฒ˜์Œ ๋ Œ๋”๋ง ์‹œ์—๋งŒ ๋ถˆ๋ ค์ง€๊ฒŒ ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์ดˆ๊ธฐ๊ฐ’์„ ๋„ฃ๋Š” ์ธ์ž์— ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋ฅผ ๋„ฃ์–ด ์ฃผ๊ณ  ๋ฆฌํ„ด๊ฐ’์œผ๋กœ ๋ฌด๊ฑฐ์šด ์ž‘์—…์„ ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๋ถˆ๋Ÿฌ์ฃผ๋ฉด ๋œ๋‹ค.
heayWork๋Š” ์ตœ์ดˆ ๋ Œ๋”๋ง ํ• ๋•Œ๋งŒ ์‹คํ–‰ ๋˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค.

const [number, setNumber] = useState(() => {heavyWork})

โœจ useEffect()

mount(ํ™”๋ฉด์— ์ฒซ ๋ Œ๋”๋ง), update(๋‹ค์‹œ ๋ Œ๋”๋ง), unmount(ํ™”๋ฉด์—์„œ ์‚ฌ๋ผ์งˆ๋•Œ)๋˜์—ˆ์„ ๋•Œ ํŠน์ • ์ž‘์—…์„ ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์‹คํ–‰์‹œ์ผœ์ฃผ๊ณ  ์‹ถ๋‹ค๋ฉด useEffect๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

1. useEffect(() => {//์ž‘์—…})
2. useEffect(() => {//์ž‘์—…}, [value])
  1. useEffect์˜ ์ธ์ž๋กœ ํ•˜๋‚˜์˜ ์ฝœ๋ฐฑํ•จ์ˆ˜๋งŒ ๋ฐ›๋Š” ํ˜•ํƒœ
    : ๋ Œ๋”๋ง ๋ ๋•Œ๋งˆ๋‹ค ์‹คํ–‰
  2. useEffect์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ ์ฝœ๋ฐฑํ•จ์ˆ˜, ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ ๋ฐฐ์—ด(dependency array)๋ฅผ ๋ฐ›๋Š” ํ˜•ํƒœ
    : ํ™”๋ฉด์— ์ฒซ ๋ Œ๋”๋ง ๋ ๋•Œ ์‹คํ–‰, value์˜ ๊ฐ’์ด ๋ฐ”๋€”๋•Œ ์‹คํ–‰
    ๋งŒ์•ฝ ๋นˆ ๋ฐฐ์—ด์ด ์ฃผ์–ด์ง„๋‹ค๋ฉด ์ฒซ ๋ Œ๋”๋ง์‹œ์—๋งŒ ์‹คํ–‰๋œ๋‹ค.

CleanUp
์ •๋ฆฌํ•˜๊ณ  ์‹ถ์€ ํ•จ์ˆ˜(์‹œ๊ฐ„ or ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ)๊ฐ€ ์žˆ๋‹ค๋ฉด return ๋’ค์— ์ •๋ฆฌํ•˜๋Š” ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

useEffect(() => {
	// ๊ตฌ๋…...
    return () => [
    	// ๊ตฌ๋… ํ•ด์ง€..
    }
}, []);

๐Ÿชจ useRef()

ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ useRef๋ฅผ ๋ถˆ๋ฅด๋ฉด ref๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ด์ค€๋‹ค.
์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์„ค์ •ํ•ด์ค€ ๊ฐ’์€ ref๊ฐ์ฒด์˜ current๊ฐ’์œผ๋กœ ์ €์žฅ๋˜๋ฉฐ ๊ฐ’์€ ์–ธ์ œ๋“  ๋ณ€๊ฒฝํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.
๋ฐ˜ํ™˜๋œ ref์˜ ๊ฐ’์€ ์ปดํฌ๋„ŒํŠธ์˜ ์ „ ์ƒ์• ์ฃผ๊ธฐ๋™์•ˆ ์œ ์ง€๋œ๋‹ค. ์ฆ‰, ๋ฆฌ๋ Œ๋”๋ง๋˜๋”๋ผ๋„ unmount ๋ ๋•Œ๊นŒ์ง€ ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

const ref = useRef(value)
ref = { current: 'value'}

1. ref๋Š” state์™€ ๋น„์Šทํ•˜๊ฒŒ ๊ฐ’์„ ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ๋ณ€๊ฒฝ์‹œ ๋ Œ๋”๋ง์„ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ๋ง์•„์•ผํ•˜๋Š” ๊ฐ’์„ ๋‹ค๋ฃฐ๋•Œ ํŽธ๋ฆฌํ•˜๋‹ค.

  • state์˜ ๋ณ€ํ™” -> ๋ Œ๋”๋ง -> *์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€ ๋ณ€์ˆ˜๋“ค ์ดˆ๊ธฐํ™”
  • ref์˜ ๋ณ€ํ™” -> no ๋ Œ๋”๋ง -> ๋ณ€์ˆ˜๋“ค์˜ ๊ฐ’์ด ์œ ์ง€๋จ
  • state์˜ ๋ณ€ํ™” -> ๋ Œ๋”๋ง -> ๊ทธ๋ž˜๋„ ref์˜ ๊ฐ’์€ ์œ ์ง€๋จ

๐Ÿ’ก Ref์™€ ๋ณ€์ˆ˜์˜ ์ฐจ์ด!

๋ฆฌ๋ Œ๋”๋ง ์‹œ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ๋Š” ์ดˆ๊ธฐ์— ์ž‘์„ฑํ•ด๋‘์—ˆ๋˜ ์„ ์–ธ๋“ค์ด ๋‹ค์‹œ ๋ฐœ์ƒํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ณ€์ˆ˜์— ์ž‘์„ฑํ•ด๋‘์—ˆ๋˜ ์ดˆ๊ธฐ๊ฐ’๋„ ๋‹ค์‹œ ์„ ์–ธ๋˜์–ด ๋ฆฌ๋ Œ๋”๋ง์„ ๊ฑฐ์น˜๋ฉด์„œ ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ๋Œ์•„๊ฐ€๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ Ref๋Š” ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ๋‹ค์‹œ ๋Œ์•„๊ฐ€์ง€ ์•Š์•„ ๊ทธ๋Œ€๋กœ ์œ ์ง€ ๋œ๋‹ค.

2. DOM ์š”์†Œ์— ์ ‘๊ทผ

document.querySelector()๊ณผ ๋น„์Šทํ•œ ๊ธฐ๋Šฅ.
์ ‘๊ทผํ•˜๊ณ ์ž ํ•˜๋Š” ํƒœ๊ทธ์— ref์†์„ฑ์„ ๋„ฃ์–ด์ฃผ๊ฒŒ ๋˜๋ฉด ์ ‘๊ทผ๊ฐ€๋Šฅํ•˜๋‹ค.

๐Ÿ“„ useContext()

React๋กœ ๋งŒ๋“ค์–ด์ง„ ์•ฑ์€ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ปดํฌ๋„ŒํŠธ๋“ค๋กœ ๊ตฌ์„ฑ์ด ๋˜์–ด์žˆ๋‹ค. ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์‹œ์ž‘ํ•ด์„œ ํŠธ๋ฆฌํ˜•ํƒœ๋กœ ๋ป—์–ด๋‚˜๊ฐ€๋Š”๋ฐ ๋ฐ์ดํ„ฐ ํ๋ฆ„์€ ์œ„์—์„œ ์•„๋ž˜๋กœ ์ฆ‰, props๋ฅผ ํ†ตํ•ด ๋ถ€๋ชจ์—์„œ ์ž์‹์—๊ฒŒ ์ „๋‹ฌ์ด ๋˜๋Š” ํ˜•ํƒœ์ด๋‹ค.

์ด๋•Œ ์ „์—ญ์ ์œผ๋กœ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ(ex. User, Theme, Language)๋ฅผ props๋กœ ์ผ์ผ์ด ๋‹จ๊ณ„์ ์œผ๋กœ ๋„˜๊ฒจ์ฃผ์–ด์•ผํ•œ๋‹ค๋ฉด ๊ต‰์žฅํžˆ ๋ณต์žกํ•œ ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ ํ•  ๊ฒƒ์ด๋‹ค. ์œ ์ง€๋ณด์ˆ˜ ๋˜ํ•œ ๋งˆ์ฐฌ๊ฐ€์ง€์ด๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‚˜ํƒ€๋‚œ ๊ฒƒ์ด Context๋กœ ์•ฑ์•ˆ์—์„œ ์ „์—ญ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” data๋ฅผ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋“ค์ด ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.
Context๋Š” props๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ผ์ผ์ด ์ „๋‹ฌํ•˜์ง€ ์•Š์•„๋„ ํŠธ๋ฆฌ ์•ˆ์— ์–ด๋””์— ์œ„์น˜ํ•ด ์žˆ๋˜ ์ƒ๊ด€์—†์ด ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ”ฉ Prop Drilling
props๋ฅผ ์˜ค๋กœ์ง€ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ๋งŒ ์ „๋‹ฌํ•˜๋Š” ์šฉ๋„๋กœ ์“ฐ์ด๋Š” component๋ฅผ ๊ฑฐ์น˜๋ฉด์„œ React component ํŠธ๋ฆฌ์˜ ํ•œ ๋ถ€๋ถ„์—์„œ ๋‹ค๋ฅธ ๋ถ€๋ถ„์˜ ๋ฐ์ดํ„ฐ๋กœ ์ „๋‹ฌํ•˜๋Š” ๊ณผ์ •.

props์ „๋‹ฌ์ด ๋„ˆ๋ฌด๋‚˜๋„ ๋งŽ์€ ๊ณผ์ •์„ ๊ฑฐ์น˜๊ฒŒ ๋œ๋‹ค๋ฉด ๋‚˜์ค‘์— ์ถ”์ ์ด ์–ด๋ ค์›Œ์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜์— ์ข‹์ง€ ์•Š๋‹ค.

๊ณผ๋„ํ•œ prop drilling์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์€ ๋‹ค์–‘ํ•˜์ง€๋งŒ ๊ทธ ์ค‘ ํ•˜๋‚˜๋กœ useContext๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค๋งŒ Context๋Š” ๋‹ค์–‘ํ•œ ๋ ˆ๋ฒจ์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์—๊ฒŒ ์ „์—ญ์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•จ์ด ์ฃผ๋œ ๋ชฉ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ผญ ํ•„์š”ํ•  ๋•Œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
Context๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์›Œ ์งˆ ์ˆ˜ ์žˆ๊ณ  Prop drilling์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•œ ๋ชฉ์ ์ด๋ผ๋ฉด Component Composition(์ปดํฌ๋„ŒํŠธ ํ•ฉ์„ฑ)์ด ๋” ์ข‹์€ ๋ฐฉ๋ฒ•์ผ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๐Ÿ’ฝ useMemo()

์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” Component, ๊ทธ ์ค‘ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋Š” ๋ง๊ทธ๋Œ€๋กœ ํ•จ์ˆ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ Œ๋”๋ง์ด ๋  ๊ฒฝ์šฐ ๋ชจ๋‘ ๋‚ด๋ถ€์˜ ๋ณ€์ˆ˜๊ฐ€ ์ดˆ๊ธฐํ™”๋œ๋‹ค. state์™€ props์˜ ๋ณ€ํ™”๋กœ ์žฆ์€ ๋ Œ๋”๋ง์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋˜๋ฉด ๋‚ด๋ถ€์˜ ๋ฌด๊ฑฐ์šด ์ž‘์—…์ด ์žˆ์„ ๊ฒฝ์šฐ ํ”„๋กœ๊ทธ๋žจ์—๊ฒŒ ๋ถ€๋‹ด์ด ์ปค์งˆ ๊ฒƒ์ด๋‹ค.

Component ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•œ hook์œผ๋กœ๋Š” useMemo์™€ useCallback์ด ์žˆ๋‹ค.
๊ทธ ์ค‘ useMemo์˜ Memo๋Š” Memoization์„ ๋œปํ•œ๋‹ค. ์ฆ‰, ํ•จ์ˆ˜๊ฐ€ ๋™์ผํ•œ ๊ณ„์‚ฐ์„ ๋ฐ˜๋ณตํ•ด์•ผ ํ•  ๋•Œ, ์ด์ „์— ๊ณ„์‚ฐํ•œ ๊ฐ’์„ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•จ์œผ๋กœ์จ ๋™์ผํ•œ ๊ณ„์‚ฐ์˜ ๋ฐ˜๋ณต ์ˆ˜ํ–‰์„ ์ œ๊ฑฐํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰ ์†๋„๋ฅผ ๋น ๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

useMemo๋Š” ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ ์ฝœ๋ฐฑํ•จ์ˆ˜(memoizationํ•ด์ค„ ๊ฐ’์„ ๊ณ„์‚ฐํ•ด์„œ ๋ฆฌํ„ดํ•ด์ค„ ๊ฐ’)๋ฅผ ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋ฐ›๋Š”๋‹ค. ์ฝœ๋ฐฑํ•จ์ˆ˜์—๋Š” ์ž์ฃผ ์“ฐ์ด๋Š” ๊ฐ’์„ memoization ํ•ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

const value = useMemo(() => {
	return calculate();
}, [item]);

useMemo๋„ ์ž์ฃผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์˜คํžˆ๋ ค ์„ฑ๋Šฅ์ด ์•…ํ™”๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ ์ ˆํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

๐Ÿ“ž useCallback()

useCallback์€ useMemo์™€ ๋น„์Šทํ•˜์ง€๋งŒ ์ธ์ž๋กœ ์ „๋‹ฌํ•œ ์ฝœ๋ฐฑํ•จ์ˆ˜ ๊ทธ ์ž์ฒด๋ฅผ memoization ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
useCallback์€ ์ฒซ๋ฒˆ์งธ ์ธ์ž๋กœ memoization ํ•ด์ค„ ์ฝœ๋ฐฑํ•จ์ˆ˜, ๋‘๋ฒˆ์งธ ์ธ์ž๋กœ๋Š” ์˜์กด์„ฑ ๋ฐฐ์—ด์„ ๋ฐ›๋Š”๋‹ค.

useCallback(() => {
	return value;
}, [item])
profile
๋…ธ ํฌ๊ธฐ ํ‚พ๊ณ ์ž‰
post-custom-banner

0๊ฐœ์˜ ๋Œ“๊ธ€