useEffect & useLayoutEffect
β° 2024-07-11 (λͺ©) 01:47:46
κ°μ
Reactλ ν΄λμ€ν(Class Component)κ³Ό ν¨μν(Function Cmpoonent) λ μ’ λ₯λ‘ λλλ€. ν¨μν Reactκ° νΈλ λκ° λ μ΄νλ‘, Hookκ³Ό Context λ±, ν¨μν μ»΄ν¬λνΈλ₯Ό μν λ€μν μμκ° μΆκ°λλ€.
κ·Έ μ€ Reactμ λΌμ΄νμ¬μ΄ν΄κ³Ό μ°κ΄λλ Hookμ μ»΄ν¬λνΈ κ°λ°μ μμ΄ μ€μν μμλ€. κ°λ°μκ° μ체μ μΌλ‘ λ€μν ν μ λ§λ€ μ μμ§λ§, React λν κ°λ°μκ° Reactλ₯Ό μ’ λ κ°νΈνκ³ ν¨μ¨μ μΌλ‘ νμ©ν μ μλλ‘ λΌμ΄λΈλ¬λ¦¬ λ¨κ³μμ λ€μν Hookμ μ 곡νκ³ μλ€.
κ·Έ μ€ λ§μ΄ λ λλ§μ μ μ΄νλλ° μ¬μ©νλ ν
μΌλ‘ useEffect
μ, λΉμ·νλ©΄μλ λ€μ μμν useLayoutEffect
κ° μ‘΄μ¬νλ€.
μ΄ λ¬Έμμμλ useEffect
μ useLayoutEffect
ν
μ λ΄μ©κ³Ό μ¬μ©λ²μ μμλ΄μΌλ‘μ¨, λ λλ§ μμ
μ μ μ ν μ μ΄ν΄λ³Έλ€.
useEffect
React κ°λ°μλΌλ©΄ useEffect
λ₯Ό λ°λμ ν λ²μ―€ μ¬μ©νμ κ²μ΄λ€. useEffect
ν
μ, ν¨μν μ»΄ν¬λνΈμμ React μΈλΆμ μ½λλ₯Ό λμνκΈ° μν΄ μ¬μ©νλ ν
μ΄λΌ μ μλλ€.
μ¬κΈ°μ React μΈλΆμ μ½λλ, API λ°μ΄ν°λ₯Ό κ°μ Έμ¨λ€κ±°λ, νΉμ DOMμ μ‘°μνλ€κ±°λ, λΈλΌμ°μ μμμ μ½λλ₯Ό μ¬μ©νλ λ±μ μ½λλ₯Ό μλ―Ένλ€.
useEffect
μ κ°μ₯ ν° νΉμ§μ, useEffect
μ μ μΈλ μ½λλ λ°λμ λ λλ§ μμ
μ΄ μλ£λ μ΄νμ μ€νλλ€λ κ²μ΄λ€. μ¦, λ°λμ ν΄λΌμ΄μΈνΈ μ¬μ΄λμμμ λμμ μλ―Ένλ€.
μΌλ°μ μΈ μΉ νλ‘ νΈ κ°λ°κ³Ό λ¬λ¦¬, React νΉμ κ·Έμ λΉμ·ν νλ‘ νΈμλ νλ μμν¬μ κ²½μ°, μ»΄ν¬λνΈκ° λ λλ§λλ€λ κ°λ μ΄ μκΈ°λ©°, μ¬λ°λ₯΄μ§ μμ λ¨κ³μμ λ‘μ§μ μνν κ²½μ°, λ¬Έμ κ° λ°μν μ μλ€. μλ₯Ό λ€μ΄, μ»΄ν¬λνΈκ° μμ§ λ λλ§λμ§ μμμμλ, DOMμ μ κ·Όνλ€κ±°λ, μΏ ν€λ₯Ό μ¬μ©νλ λ±μ ν΄λΌμ΄μΈνΈ μ½λλ₯Ό μνν κ²½μ°, λ λλ§ μ€ν¨ νΉμ κ·Έμ μ€νλ μ€λ₯κ° λ°μνλ©°, λ λλ§μ μ€ν¨νκ² λλ€.
λ λλ§μ΄ μμ ν λλ μ΄νμ ν΄λΌμ΄μΈνΈ μ¬μ΄λ λ‘μ§μ μνν μ μμΌλ―λ‘, useEffect
λ₯Ό ν΅ν΄, ν΄λΌμ΄μΈνΈ μ¬μ΄λμμλ§ λμνλ μ½λλ₯Ό λͺ
μν μ μλ€.
μ¬μ©λ²
μλλ useEffect
μ κΈ°μ΄μ μΈ μ¬μ©λ²μ΄λ€.
TSX
1
useEffect(callback, arr);
callback
μ μνλ μ½λ°± λ©μλλ₯Ό μ§μ ν μ μλ€. λ³λμ νλΌλ―Έν°λ₯Ό λ°μ μλ μλ€. μ΄ μ½λ°± λ©μλλ λ λλ§ μμ
μ΄ λλ μ΄ν, λΉλκΈ°μ μΌλ‘ μνλ κ²μ΄λ€.
arr
μ μμ‘΄μ± λ°°μ΄μ΄λ€. ν΄λΉ λ°°μ΄μλ μ΄λ€ λ³μλ ν λΉν μ μμΌλ©°, ν λΉν λ³μκ° λ³κ²½λλ©΄, useEffect
μ μ½λ°± λ©μλκ° λ€μ μνλλ€.
μ΄λ¬ν νΉμ§μΌλ‘ νΉμ λ³μ λ³κ²½ μ, μλμ μΌλ‘ νΉμ λμμ μννμ¬, λ³μμ λ³κ²½μ λμνμ¬ μ μ ν λ λλ§μ μνν μ μλ€.
returnμ ν΅ν ν
μ΄κΈ°ν
useEffect
λ κΈ°λ³Έμ μΌλ‘ void
λ₯Ό λ°ννμ§λ§, return
μ νμ©νμ¬ μ½λ°± λ©μλλ₯Ό λ°νν μ μλ€. μ΄λ₯Όν
λ©΄ μλμ κ°μ λ°©μμ΄λ€.
TSX
1 2 3 4 5 6 7 8 9 10 11
useEffect(() => { const handle = () => { console.log(`just resized at ${Date.now()}`) } document.addEventListener('resize', handle); return () => { document.removeEventListener('resize', handle); } }, []);
return
μΌλ‘ μ½λ°± λ©μλλ₯Ό λ€μ λ°ννλ€. μ΄ return
μ ν
μ μ΄κΈ°ννλ μ½λλ‘, return
μ μ½λ°± λ©μλκ° μνλλ 쑰건μ μλμ κ°λ€.
- μ»΄ν¬λνΈκ° μΈλ§μ΄νΈ λ λ.
- λνλμ λ°°μ΄μ κ°μ΄ λ³κ²½λμ΄ λ¦¬λ λλ§ λ λ.
μμ κ°μ΄, μ»΄ν¬λνΈ μΈλ§μ΄νΈ λ° λ¦¬λ λλ§ μ, μ΄κΈ°ννκ±°λ, μ κ±°ν΄μΌν λμμ΄ μμ κ²½μ° μ¬μ©νλ€.
μ μ½λλ₯Ό μλ‘ λ€μλ©΄, μ»΄ν¬λνΈκ° λ λλ§λλ©΄μ, document
μ μμ 리μ¬μ΄μ¦ μ΄λ²€νΈλ₯Ό μΆκ°νλ€. λ§μ½, return
μΌλ‘ μ΄λ²€νΈλ₯Ό μ κ±°νμ§ μμ κ²½μ°, μ»΄ν¬λνΈκ° λ§μ΄νΈλκ±°λ, λ λλ§μ΄ λ€μ μΌμ΄λ λλ§λ€ 리μ¬μ΄μ¦ μ΄λ²€νΈκ° λμ λμ΄ λ³΅μλ‘ μνλλ€.
μμ μ½λ
TSX
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
import { useEffect } from 'react'; function Component(): JSX.Element { useEffect(() => { const tag = document.getElementById('target'); if (tag) { tag.innerHTML = `in client side at ${Date.now()}` } }, [ deps ]) return ( <div> <h1>title</h1> <p id="target">initial</p> </div> ) }
useEffect
μ μ½λλ λ λλ§ μμ
μ΄ λλ μ΄ν λμνλ€. #target
μ HTML λ΄μ©μ λ³κ²½νλ©°, μ¬μ©μλ λ λλ§ λ μ§ν, useEffect
μ μ½λκ° μνλκΈ° μ κΉμ§μ 짧μ μκ°λμ initial
μ΄λΌλ μ΄κΈ° ν
μ€νΈλ₯Ό κ΄μΈ‘ν μ μλ€.
deps
λ³μκ° λ³ν λλ§λ€, μ½λ°± λ©μλκ° λ€μ μ€νλλ©°, κ·Έ λλ§λ€ Date.now()
μ μν΄ νμλ κ°μ΄ λ°λλ κ±Έ νμΈν μ μλ€.
useLayoutEffect
useEffect
λ μμμλ λ€λ€λ€μνΌ, λ λλ§ ν μ½λλ₯Ό λΉλκΈ°μ μΌλ‘ μννλ€. λλ€μμ React κ°λ°μλ€μ΄ λ§μ΄ μ νλ―λ‘, μ΄ κΈμ λ³΄κ³ μλ λΉμ μμ React κ°λ°μλΌλ©΄, λ³λ€λ₯Έ μ€λͺ
μ΄ νμ μμ μ λλ‘ μ΅μν κ²μ΄λ€.
κ·Έλ λ€λ©΄ useLayoutEffect
λ 무μμ΄κ³ , μ΄λ»κ² λ€λ£°κΉ?
μ¬μ©λ²
μλλ useLayoutEffect
μ κΈ°μ΄μ μΈ μ¬μ©λ²μ΄λ€.
TSX
1
useLayoutEffect(callback, arr);
κ²°λ‘ λΆν° μκΈ°νμλ©΄ useEffect
μ μ¬μ© λ°©λ²μ΄ μμ ν λμΌνλ€. λ³λ€λ₯Έ μ€λͺ
μ΄ νμ μμ μ λ.
μμ μ½λ
TSX
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
import { useLayoutEffect } from 'react'; function Component(): JSX.Element { useLayoutEffect(() => { const tag = document.getElementById('target'); if (tag) { tag.innerHTML = `in client side at ${Date.now()}` } }, [ deps ]) return ( <div> <h1>title</h1> <p id="target">initial</p> </div> ) }
μ΄λ μμ μ½λμμλ λνλμλλ°, useEffect
μ useLayoutEffect
μ ν€μλλ§ λ³κ²½ν΄λ μ μμ μΌλ‘ λμν¨μ λ¬Όλ‘ , μ΅μ’
κ²°κ³Όλ¬Όλ§μ λμΌνλ€.
κ·Έλ λ€λ©΄ useEffect
μ useLayoutEffect
λ¨μν μ μ μλ λ΄λΆμ μΈ μ΄μ λ‘ κ°λΌμ‘μ§λ§, λμμ κ°μ μ¨κ²¨μ§ μλ₯μ΄μλκ±ΈκΉ?
useEffectμ useLayoutEffectμ μ°¨μ΄
μμ λ§νλ―μ΄, useEffect
μ useLayoutEffect
μ λμ λ°©μμ λμΌνλ€. μ°¨μ΄λ λ€λ₯Έ κ³³μ μλλ°, λ°λ‘ λμμ μμ μ΄λ€.
React νμ΄μ§κ° μ€μ μ°λ¦¬ λμ ννλλ κ³Όμ μ ν¬κ² λ κ°μ§λ‘ λλλ€. νν λ§νλ λ λλ§(rendering) λ¨κ³μ νμΈν (painting) λ¨κ³κ° μ‘΄μ¬νλ€.
- λ λλ§(rendering): DOM νΈλ¦¬λ₯Ό ꡬμ±νκΈ° μν΄, λ μ΄μμ λ° μ€νμΌμ μ°μ°νλ κ³Όμ
- νμΈν (painting): DOM νΈλ¦¬λ₯Ό μ€μ λ‘ νννλ κ³Όμ
보νΈμ μΌλ‘ λ λλ§μ΄λΌ λλ±κ·Έλ € νννμ§λ§, μ€μ λ‘ νμ΄μ§κ° μμ ν ννλλ μμ μ νμΈν μμ μ΄ λλ μ΄νμ΄λ€. μ€ν¬λ¦½νΈμ μμ΄ ν¬κ±°λ 볡μ‘νμ¬, μ°μ°μ΄ μ€λ걸릴 κ²½μ°, μ¬μ©μλ μ₯μκ° ν° νλ©΄μ λ³΄κ² λλ€.
useLayoutEffect
λ λ λλ§ μ΄ν, νμΈν
μ΄ μμλκΈ° μ΄μ μ λκΈ°μ μΌλ‘ λμνλ ν
μ΄λ€. λ°λλ‘ useEffect
λ νμΈν
μ΄ν λΉλκΈ°μ μΌλ‘ λμνλ€.
κ°λ¨νκ² λμννλ©΄ μμ κ°μ λ°©μμ΄λ€. useLayoutEffect
λ μ¬μ©μκ° νμ΄μ§λ₯Ό 보기 μ μ μ°μ°μ΄ μΌμ΄λλ―λ‘, μ΄κΈ°κ° μ°μ°μ μ μ©νλ€.
useEffect
λ‘ μ΄λ₯Ό ꡬννλ©΄, κΈ°λ³Έκ°μ΄ μ κΉ νμλ μ΄ν, useEffect
μ λμμΌλ‘ μ½κ°μ μκ°μ°¨λ₯Ό λκ³ λ°μλλκ±Έ λ³Ό μ μλ€. useLayoutEffect
λ μ¬μ©μκ° νμ΄μ§λ₯Ό λ³Ό μ μλ νμΈν
μ΄μ μ λμνλ―λ‘, μ΄κΈ° μ°μ° κ³Όμ μμ λνλλ νμ μ μ¨κΈΈ μ μλ€.
λ¨, useEffect
μ λ¬λ¦¬ λκΈ°μ μΌλ‘ λμνλ―λ‘, λ무 볡μ‘ν μ°μ°μ ν λΉν κ²½μ° λ λλ§ μκ°μ΄ κΈΈμ΄μ§λ―λ‘ μ£Όμν΄μΌνλ€.
CodeSandboxλ‘ μ°¨μ΄ λΉκ΅νκΈ°
CodeSandboxλ₯Ό ν΅ν΄ useEffect
μ useLayoutEffect
λ₯Ό λΉκ΅ν΄λ³΄μ. μμ ν λμΌν λμμ μννλ λ ν
μ μμ±νλ€.
κ° ν μ λ°λ³΅λ¬Έμ 5000λ² μννμ¬, DOMμ ν μ€νΈλ₯Ό νννλ€.
useLayoutEffect
λ‘ μΈν΄ μ΄κΈ° λ λλ§ μκ°μ΄ μμλλ©°, νμΈν
μ΄ μλ£λμ΄ νμ΄μ§κ° νμλ μ§ν, useEffect
κ° λμνλ€.
λλ¬Έμ μ¬μ©μλ useEffect
μ λμμ΄ λλκΈ° μ κΉμ§ μ½κ°μ λΉ κ³΅κ°μ λ³΄κ² λλ€.
κ²°λ‘
useLayoutEffect
μ useEffect
μ μ¬μ©λ²μ λμΌνμ§λ§, λμ μμ μ μμ΄ν¨μΌλ‘ μΈν΄ μ°¨μ΄κ° λ°μνλ€.
useLayoutEffect
μ μκ³ κ°λ¨ν μ΄κΈ° μ°μ°μ μ©μ΄νλ©°, useEffect
λ λ°μ΄ν° fetch, μ΄λ²€νΈ ν
λ± λ€μν λ‘μ§μ μννλ λ° μ©μ΄νλ€.
μ©λμ λ§λ ν μ μ¬μ©ν¨μΌλ‘μ¨, νμ΄μ§μ λ λλ§μ ν¨κ³Όμ μΌλ‘ κ΄λ¦¬ν΄λ³΄μ.
π·οΈ νκ·Έ
μ½μ΄μ£Όμ μ κ³ λ§μμ!
λμμ΄ λμ ¨λ€λ©΄, 곡κ°μ΄λ λκΈμ λ¬μμ£Όμλ 건 μ΄λ€κ°μ?
λΈλ‘κ·Έ μ΄μμ ν° νμ΄ λ©λλ€.