useEffect & useLayoutEffect
Reactλ ν΄λμ€ν(Class Component)κ³Ό ν¨μν(Function Cmpoonent) λ μ’ λ₯λ‘ λλλ€. ν¨μν Reactκ° νΈλ λκ° λ μ΄νλ‘, Hookκ³Ό Context λ±, ν¨μν μ»΄ν¬λνΈλ₯Ό μν λ€μν μμκ° μΆκ°λλ€.
κ·Έ μ€ Reactμ λΌμ΄νμ¬μ΄ν΄κ³Ό μ°κ΄λλ Hookμ μ»΄ν¬λνΈ κ°λ°μ μμ΄ μ€μν μμλ€. κ°λ°μκ° μ체μ μΌλ‘ λ€μν ν μ λ§λ€ μ μμ§λ§, React λν κ°λ°μκ° Reactλ₯Ό μ’ λ κ°νΈνκ³ ν¨μ¨μ μΌλ‘ νμ©ν μ μλλ‘ λΌμ΄λΈλ¬λ¦¬ λ¨κ³μμ λ€μν Hookμ μ 곡νκ³ μλ€.
κ·Έ μ€ λ§μ΄ λ λλ§μ μ μ΄νλλ° μ¬μ©νλ ν
μΌλ‘ useEffectμ, λΉμ·νλ©΄μλ λ€μ μμν useLayoutEffectκ° μ‘΄μ¬νλ€.
μ΄ λ¬Έμμμλ useEffectμ useLayoutEffect ν
μ λ΄μ©κ³Ό μ¬μ©λ²μ μμλ΄μΌλ‘μ¨, λ λλ§ μμ
μ μ μ ν μ μ΄ν΄λ³Έλ€.
React κ°λ°μλΌλ©΄ useEffectλ₯Ό λ°λμ ν λ²μ―€ μ¬μ©νμ κ²μ΄λ€. useEffect ν
μ, ν¨μν μ»΄ν¬λνΈμμ React μΈλΆμ μ½λλ₯Ό λμνκΈ° μν΄ μ¬μ©νλ ν
μ΄λΌ μ μλλ€.
μ¬κΈ°μ React μΈλΆμ μ½λλ, API λ°μ΄ν°λ₯Ό κ°μ Έμ¨λ€κ±°λ, νΉμ DOMμ μ‘°μνλ€κ±°λ, λΈλΌμ°μ μμμ μ½λλ₯Ό μ¬μ©νλ λ±μ μ½λλ₯Ό μλ―Ένλ€.
useEffectμ κ°μ₯ ν° νΉμ§μ, useEffectμ μ μΈλ μ½λλ λ°λμ λ λλ§ μμ
μ΄ μλ£λ μ΄νμ μ€νλλ€λ κ²μ΄λ€. μ¦, λ°λμ ν΄λΌμ΄μΈνΈ μ¬μ΄λμμμ λμμ μλ―Ένλ€.
Client Side
λͺ¨λ Reactμμλ μ½λμ λμ μμμ μλ² μ¬μ΄λ(Server Side)μ ν΄λΌμ΄μΈνΈ μ¬μ΄λ(Client Side)λ‘ κ΅¬λΆνλ€.
κ°κ°μ μμμμλ§ λμ κ°λ₯ν μ½λλ€μ΄ μλ€. μλ₯Ό λ€μ΄, ν΄λΌμ΄μΈνΈ μ¬μ΄λλ μΏ ν€λ λ‘컬 μ€ν 리μ§, DOM λ±, λΈλΌμ°μ μ μ°κ΄λ μ½λλ₯Ό μνν μ μλ€.
μΌλ°μ μΈ μΉ νλ‘ νΈ κ°λ°κ³Ό λ¬λ¦¬, React νΉμ κ·Έμ λΉμ·ν νλ‘ νΈμλ νλ μμν¬μ κ²½μ°, μ»΄ν¬λνΈκ° λ λλ§λλ€λ κ°λ μ΄ μκΈ°λ©°, μ¬λ°λ₯΄μ§ μμ λ¨κ³μμ λ‘μ§μ μνν κ²½μ°, λ¬Έμ κ° λ°μν μ μλ€. μλ₯Ό λ€μ΄, μ»΄ν¬λνΈκ° μμ§ λ λλ§λμ§ μμμμλ, DOMμ μ κ·Όνλ€κ±°λ, μΏ ν€λ₯Ό μ¬μ©νλ λ±μ ν΄λΌμ΄μΈνΈ μ½λλ₯Ό μνν κ²½μ°, λ λλ§ μ€ν¨ νΉμ κ·Έμ μ€νλ μ€λ₯κ° λ°μνλ©°, λ λλ§μ μ€ν¨νκ² λλ€.
λ λλ§μ΄ μμ ν λλ μ΄νμ ν΄λΌμ΄μΈνΈ μ¬μ΄λ λ‘μ§μ μνν μ μμΌλ―λ‘, useEffectλ₯Ό ν΅ν΄, ν΄λΌμ΄μΈνΈ μ¬μ΄λμμλ§ λμνλ μ½λλ₯Ό λͺ
μν μ μλ€.
μλλ useEffectμ κΈ°μ΄μ μΈ μ¬μ©λ²μ΄λ€.
TSX1useEffect(callback, arr);
callbackμ μνλ μ½λ°± λ©μλλ₯Ό μ§μ ν μ μλ€. λ³λμ νλΌλ―Έν°λ₯Ό λ°μ μλ μλ€. μ΄ μ½λ°± λ©μλλ λ λλ§ μμ
μ΄ λλ μ΄ν, λΉλκΈ°μ μΌλ‘ μνλ κ²μ΄λ€.
arrμ μμ‘΄μ± λ°°μ΄μ΄λ€. ν΄λΉ λ°°μ΄μλ μ΄λ€ λ³μλ ν λΉν μ μμΌλ©°, ν λΉν λ³μκ° λ³κ²½λλ©΄, useEffectμ μ½λ°± λ©μλκ° λ€μ μνλλ€.
μ΄λ¬ν νΉμ§μΌλ‘ νΉμ λ³μ λ³κ²½ μ, μλμ μΌλ‘ νΉμ λμμ μννμ¬, λ³μμ λ³κ²½μ λμνμ¬ μ μ ν λ λλ§μ μνν μ μλ€.
useEffectλ κΈ°λ³Έμ μΌλ‘ voidλ₯Ό λ°ννμ§λ§, returnμ νμ©νμ¬ μ½λ°± λ©μλλ₯Ό λ°νν μ μλ€. μ΄λ₯Όν
λ©΄ μλμ κ°μ λ°©μμ΄λ€.
TSX1 2 3 4 5 6 7 8 9 10 11useEffect(() => { const handle = () => { console.log(`just resized at ${Date.now()}`) } document.addEventListener('resize', handle); return () => { document.removeEventListener('resize', handle); } }, []);
returnμΌλ‘ μ½λ°± λ©μλλ₯Ό λ€μ λ°ννλ€. μ΄ returnμ ν
μ μ΄κΈ°ννλ μ½λλ‘, returnμ μ½λ°± λ©μλκ° μνλλ 쑰건μ μλμ κ°λ€.
- μ»΄ν¬λνΈκ° μΈλ§μ΄νΈ λ λ.
- λνλμ λ°°μ΄μ κ°μ΄ λ³κ²½λμ΄ λ¦¬λ λλ§ λ λ.
μμ κ°μ΄, μ»΄ν¬λνΈ μΈλ§μ΄νΈ λ° λ¦¬λ λλ§ μ, μ΄κΈ°ννκ±°λ, μ κ±°ν΄μΌν λμμ΄ μμ κ²½μ° μ¬μ©νλ€.
μ μ½λλ₯Ό μλ‘ λ€μλ©΄, μ»΄ν¬λνΈκ° λ λλ§λλ©΄μ, document μ μμ 리μ¬μ΄μ¦ μ΄λ²€νΈλ₯Ό μΆκ°νλ€. λ§μ½, returnμΌλ‘ μ΄λ²€νΈλ₯Ό μ κ±°νμ§ μμ κ²½μ°, μ»΄ν¬λνΈκ° λ§μ΄νΈλκ±°λ, λ λλ§μ΄ λ€μ μΌμ΄λ λλ§λ€ 리μ¬μ΄μ¦ μ΄λ²€νΈκ° λμ λμ΄ λ³΅μλ‘ μνλλ€.
TSX1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19import { 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()μ μν΄ νμλ κ°μ΄ λ°λλ κ±Έ νμΈν μ μλ€.
useEffectλ μμμλ λ€λ€λ€μνΌ, λ λλ§ ν μ½λλ₯Ό λΉλκΈ°μ μΌλ‘ μννλ€. λλ€μμ React κ°λ°μλ€μ΄ λ§μ΄ μ νλ―λ‘, μ΄ κΈμ λ³΄κ³ μλ λΉμ μμ React κ°λ°μλΌλ©΄, λ³λ€λ₯Έ μ€λͺ
μ΄ νμ μμ μ λλ‘ μ΅μν κ²μ΄λ€.
κ·Έλ λ€λ©΄ useLayoutEffectλ 무μμ΄κ³ , μ΄λ»κ² λ€λ£°κΉ?
μλλ useLayoutEffectμ κΈ°μ΄μ μΈ μ¬μ©λ²μ΄λ€.
TSX1useLayoutEffect(callback, arr);
κ²°λ‘ λΆν° μκΈ°νμλ©΄ useEffectμ μ¬μ© λ°©λ²μ΄ μμ ν λμΌνλ€. λ³λ€λ₯Έ μ€λͺ
μ΄ νμ μμ μ λ.
TSX1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19import { 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μ λμ λ°©μμ λμΌνλ€. μ°¨μ΄λ λ€λ₯Έ κ³³μ μλλ°, λ°λ‘ λμμ μμ μ΄λ€.
React νμ΄μ§κ° μ€μ μ°λ¦¬ λμ ννλλ κ³Όμ μ ν¬κ² λ κ°μ§λ‘ λλλ€. νν λ§νλ λ λλ§(rendering) λ¨κ³μ νμΈν (painting) λ¨κ³κ° μ‘΄μ¬νλ€.
- λ λλ§(rendering): DOM νΈλ¦¬λ₯Ό ꡬμ±νκΈ° μν΄, λ μ΄μμ λ° μ€νμΌμ μ°μ°νλ κ³Όμ
- νμΈν (painting): DOM νΈλ¦¬λ₯Ό μ€μ λ‘ νννλ κ³Όμ
보νΈμ μΌλ‘ λ λλ§μ΄λΌ λλ±κ·Έλ € νννμ§λ§, μ€μ λ‘ νμ΄μ§κ° μμ ν ννλλ μμ μ νμΈν μμ μ΄ λλ μ΄νμ΄λ€. μ€ν¬λ¦½νΈμ μμ΄ ν¬κ±°λ 볡μ‘νμ¬, μ°μ°μ΄ μ€λ걸릴 κ²½μ°, μ¬μ©μλ μ₯μκ° ν° νλ©΄μ λ³΄κ² λλ€.
useLayoutEffectλ λ λλ§ μ΄ν, νμΈν
μ΄ μμλκΈ° μ΄μ μ λκΈ°μ μΌλ‘ λμνλ ν
μ΄λ€. λ°λλ‘ useEffectλ νμΈν
μ΄ν λΉλκΈ°μ μΌλ‘ λμνλ€.
κ° ν μ λμ μμ
κ°λ¨νκ² λμννλ©΄ μμ κ°μ λ°©μμ΄λ€. useLayoutEffectλ μ¬μ©μκ° νμ΄μ§λ₯Ό 보기 μ μ μ°μ°μ΄ μΌμ΄λλ―λ‘, μ΄κΈ°κ° μ°μ°μ μ μ©νλ€.
useEffectλ‘ μ΄λ₯Ό ꡬννλ©΄, κΈ°λ³Έκ°μ΄ μ κΉ νμλ μ΄ν, useEffectμ λμμΌλ‘ μ½κ°μ μκ°μ°¨λ₯Ό λκ³ λ°μλλκ±Έ λ³Ό μ μλ€. useLayoutEffectλ μ¬μ©μκ° νμ΄μ§λ₯Ό λ³Ό μ μλ νμΈν
μ΄μ μ λμνλ―λ‘, μ΄κΈ° μ°μ° κ³Όμ μμ λνλλ νμ μ μ¨κΈΈ μ μλ€.
λ¨, useEffectμ λ¬λ¦¬ λκΈ°μ μΌλ‘ λμνλ―λ‘, λ무 볡μ‘ν μ°μ°μ ν λΉν κ²½μ° λ λλ§ μκ°μ΄ κΈΈμ΄μ§λ―λ‘ μ£Όμν΄μΌνλ€.
CodeSandboxλ₯Ό ν΅ν΄ useEffectμ useLayoutEffectλ₯Ό λΉκ΅ν΄λ³΄μ. μμ ν λμΌν λμμ μννλ λ ν
μ μμ±νλ€.
κ° ν μ λ°λ³΅λ¬Έμ 5000λ² μννμ¬, DOMμ ν μ€νΈλ₯Ό νννλ€.
useLayoutEffectλ‘ μΈν΄ μ΄κΈ° λ λλ§ μκ°μ΄ μμλλ©°, νμΈν
μ΄ μλ£λμ΄ νμ΄μ§κ° νμλ μ§ν, useEffectκ° λμνλ€.
λλ¬Έμ μ¬μ©μλ useEffectμ λμμ΄ λλκΈ° μ κΉμ§ μ½κ°μ λΉ κ³΅κ°μ λ³΄κ² λλ€.
useLayoutEffectμ useEffectμ μ¬μ©λ²μ λμΌνμ§λ§, λμ μμ μ μμ΄ν¨μΌλ‘ μΈν΄ μ°¨μ΄κ° λ°μνλ€.
useLayoutEffectμ μκ³ κ°λ¨ν μ΄κΈ° μ°μ°μ μ©μ΄νλ©°, useEffectλ λ°μ΄ν° fetch, μ΄λ²€νΈ ν
λ± λ€μν λ‘μ§μ μννλ λ° μ©μ΄νλ€.
μ©λμ λ§λ ν μ μ¬μ©ν¨μΌλ‘μ¨, νμ΄μ§μ λ λλ§μ ν¨κ³Όμ μΌλ‘ κ΄λ¦¬ν΄λ³΄μ.