
UseEffect Hook
useEffect ๋
๋ฆฌ์กํธ ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง ๋ ๋๋ง๋ค ํน์ ์์
์ ์คํํ ์ ์๋๋ก ํ๋ Hook ์ผ๋ก
ํด๋์คํ ์ปดํฌ๋ํธ์ ๋ง์ดํธ ๋จ๊ณ์ธ componentDidMount + ์
๋ฐ์ดํธ ๋จ๊ณ์ธ componentDidUpdate + ์ธ๋ง์ดํธ ๋จ๊ณ์ธ componentWillUnmount ์ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ ํ
์ด๋ค.
componentDidMount+componentDidUpdate์ ํด๋นํ๋ ์ฝ๋๋ค์ useEffect์ ์ ๋ฌ๋๋ ํจ์ ๋ด์ ์์ฑํ๋ฉด ๋๋ฉฐ, componentWillUnmount์ ํด๋นํ๋ ์ฝ๋๋ค์ ํจ์ ํํ๋ก returnํ๊ฒ๋ ์์ฑํ๋ฉด ๋๋ค.
๊ธ์ด์ด๊ฐ ์์ฑํ UseEffect์ ๊ดํ ๊ธ(1)
์ฌ๊ธฐ์ ๋ ๊ฐ๋จํ ์ค๋ช ์ด ์กฐ๊ธ ์ถ๊ฐ๋์ด ์๊ธด ํ๋ค.
์๋ฌดํผ ์ด๋ ๊ฒ ์ด๋ค ํน์ ์ปดํฌ๋ํธ๊ฐ ๋ฐ๋๋ ๊ฒฝ์ฐ ๋ค์ ๊ทธ๋ฆผ์ ๊ทธ๋ ค์ฃผ๊ณ ์ถ์ ๋ useeffect๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋๋ฐ, ์๊ฐ๋ณด๋ค ์์ฒญ ์ ์ฐ๊ฒ ๋๋ ๊ฒ์ ๋ณด๊ฒ ๋ ๊ฒ์ด๋ค.
๋ฌธ์
ํ์ง๋ง useEffect๋ฅผ ์ฌ์ฉํ์ฌ DOM์ ์กฐ์ํ๋ค ๋ณด๋ฉด ํ๋ฉด์ด ๊น๋นก๊ฑฐ๋ฆฌ๋ ํ์(flicker)์ด ๋ฐ์ํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.

๋์ถฉ ์ด๋ ๊ฒ ๊น๋นก ๊น๋นก ... ๊ฑฐ๋ฆฌ๊ฒ ๋๋๋ฐ ์ซ์๋ ๊ฐ์ ๋ํ๋ด๋ ๊ฒฝ์ฐ์๋ ํฌ๊ฒ ๊ฑฐ์ฌ๋ฆฌ์ง ์๊ฒ ์ง๋ง ํ๋ฉด ๋ฒํผ์ ๋ด์ฉ์ ๊ทธ๋ฆฌ๋ ํ์ ๋ฑ์ ํ๊ฒ ๋๋ฉด
์ฌ์ฉ์์ ์
์ฅ์์๋ ์ด์ ์ฌํญ์ด๋ผ๊ณ ์ฌ๊ธธ ์๋ ์์ ๊ฒ์ด๋ค.
๋ฌธ์ ์ด์
์์ ๊ฐ์ ๋ฌธ์ ๋ useeffect์ ๋์ ํํ๋ฅผ ์์๋ณด๋ฉด ์ ์ฝ๊ฒ ์ ์ ์๋ค.
useEffect ๋ ์ปดํฌ๋ํธ๋ค์ด render์ paint ๋ ํ ์คํ๋๊ฒ ๋๊ณ , ๋น๋๊ธฐ์ (asynchronous)์ผ๋ก ์คํ๋๊ฒ ๋๋ค.
ํ๋ฉด์ paint ๋ ํ ์คํ์ด ๋ ๋ค์ ๋์์ด ์คํ๋๊ธฐ ๋๋ฌธ์, useEffect ๋ด๋ถ์ DOM์ ์ํฅ์ ์ฃผ๋ ์ฝ๋๊ฐ ์์ ๊ฒฝ์ฐ, ์ฌ์ฉ์ ์
์ฅ์์๋ ํ๋ฉด์ ๊น๋นก์์ ๋ณด๊ฒ ๋๋ ๊ฒ์ด๋ค.

UseLayoutEffect
useLayoutEffect ๋ ์์ useEffect์ ์์ฃผ ์ ์ฌํ ๊ธฐ๋ฅ์ ํ๋๋ฐ,
์ปดํฌ๋ํธ๋ค์ด render ๋ ํ ์คํ๋๋ฉฐ, ๊ทธ ์ดํ์ paint ๊ฐ ์ผ์ด๋๊ฒ ๋๋ค.
์ด ์์
์ ๋๊ธฐ์ (synchronous)์ผ๋ก ์คํ๋๋ฉฐ, Paint๊ฐ ๋๊ธฐ ์ ์ ์คํ๋๊ธฐ ๋๋ฌธ์ DOM์ ์กฐ์ํ๋ ์ฝ๋๊ฐ ์กด์ฌํ๋๋ผ๋ ์ฌ์ฉ์ ์
์ฅ์์๋ ๊น๋นก์์ ๋๋ผ์ง ๋ชปํ๊ฒ ๋๋ค.

UseEffect vs UseLayoutEffect
๋ ํ
์ ์คํ ์์ ์์ ์ฐจ์ด๊ฐ ๋๊ฒ ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก ์ํฉ์ ๋ง๊ฒ ๋ ์ฝ๋๋ฅผ ๊ตฌ๋ถํ์ฌ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ฐ๋์งํ๋ฐ..
useLayoutEffect ๋ ๋๊ธฐ์ ์ผ๋ก ์คํ๋๊ณ ๋ด๋ถ์ ์ฝ๋๊ฐ ๋ชจ๋ ์คํ๋ ํ ํ๋ฉด์ ๊ทธ๋ฆฐ๋คpaint ์์
.
๋ฐ๋ผ์ ๋ก์ง์ด ๋ณต์กํ ๊ฒฝ์ฐ์๋ ์ฌ์ฉ์๊ฐ ๋ ์ด์์์ ๋ณด๋๋ฐ ๊น์ง ์๊ฐ์ด ์์๋ ์ ์๋ค๋ ๋จ์ ์ด ์์ด, ๊ธฐ๋ณธ์ ์ผ๋ก๋ useEffect ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ๋์ ๋ฏ ํ๋ค.
DOM์ ๋ค์ ๊ทธ๋ ค์ผ ํ๋ ๊ฒฝ์ฐ๋ ๊ณ์ฐ๋ state ๊ฐ์ ํ๋ฉด์ ํ์ถํด์ผ ํ๋ ๊ฒฝ์ฐ์๋ useLayoutEffect ๊ฐ ์ ๋ฆฌํ๊ณ ..
๊ทธ ์ธ์ ๋ฐ์ดํฐ fetch ํจ์ ์คํ, ์ด๋ฒคํธ ํธ๋ค๋ฌ, state๋ฅผ ๋ค๋ฃจ๋ ์์ ๋ฑ ๋ชจ๋ ๊ฒฝ์ฐ์๋ useEffect๋ฅผ ์ฌ์ฉํ๋๊ฒ ์ ๋ฆฌํด๋ณด์ธ๋ค.
๊ฒฐ๋ก
์ ๋งํ ์ํฉ์์๋ useEffect ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ์ข๊ณ , ํ๋ฉด ๊น๋นก์์ด ๋ฐ์ํ๋ ๊ฒ ๊ฐ์ ๋ถ๋ถ(ui์ ๋ณ๊ฒฝ์ ๋ถ๋ฌ์์ผํ๋๋ฐ.. ๊ฑฐ์ฌ๋ฆด ๊ฒฝ์ฐ)์์๋ง useLayoutEffect ๋ฅผ ์ฌ์ฉํ๋๋ก ํ์.