Render phrase์์ ๋ฆฌ์กํธ๋ ์๋ก์ด props์ state๋ฅผ ๋ฐํ์ผ๋ก Virtual DOM์ ๋ฐ์ํ ๋ถ๋ถ์ ๊ณ์ฐํ๋ฉฐ, Virtual-DOM์ ์์ฑํ๋ค.
(์ถ๊ฐ๋ก ๊ฐฑ์ ์ ๊ฒฝ์ฐ์๋ ์ด๋ค ์ฐจ์ด๊ฐ ์๋์ง ํ์
ํ๋ค.)
ํ๋ง๋๋ก state์ props๋ฅผ ๋ฐํ์ผ๋ก ์ด๋ค ํ๋ฉด์ด ๋ํ๋์ผ ํ๋์ง ๋ฆฌ์กํธ๊ฐ ํ์
ํ๋ ๊ณผ์ ์ด๋ค.
์ปดํฌ๋ํธ๋ฅผ DOM์ ๋ง์ดํธํ๋ ๊ณผ์ ์ ๊ฑฐ์น๋ค.(ํธ๋ฆฌ์ ์ฝ์ )
ํด๋์ค ์ปดํฌ๋ํธ์์๋ componentDidMount(ํ๋ฒ๋ง)๊ฐ, function ์ปดํฌ๋ํธ์์ useEffect ์์์ state๊ฐ์ด ์ ๋ฐ์ดํธ ๋์๋ค๋ฉด, ๋ณ๊ฒฝ๋ state๋ฅผ ๋ฐํ์ผ๋ก ๋ค์ render์ commit ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํ๋ ๊ณผ์
ํจ์ ๋ด์์ ์ด๋ค ๊ตฌํ์ด ํจ์ ์ธ๋ถ์ ์ํฅ์ ๋ผ์น๋ ๊ฒฝ์ฐ ํด๋น ํจ์๋ Side Effect๊ฐ ์๋ค๊ณ ์ด์ผ๊ธฐํ๋ค.
์์ ํจ์๋, ์ค์ง ํจ์์ ์ ๋ ฅ๋ง์ด ํจ์์ ๊ฒฐ๊ณผ์ ์ํฅ์ ์ฃผ๋ ํจ์๋ฅผ ์๋ฏธํ๋ค. ํจ์์ ์ ๋ ฅ์ด ์๋ ๋ค๋ฅธ ๊ฐ์ด ํจ์์ ๊ฒฐ๊ณผ์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒฝ์ฐ, ์์ ํจ์๋ผ๊ณ ๋ถ๋ฅผ ์ ์๋ค. ๋ํ ์์ ํจ์๋, ์ ๋ ฅ์ผ๋ก ์ ๋ฌ๋ ๊ฐ์ ์์ ํ์ง ์๋๋ค.
์์ ํจ์์๋ ๋คํธ์ํฌ ์์ฒญ๊ณผ ๊ฐ์ Side Effect๊ฐ ์๋ค. ์์ ํจ์์ ํน์ง ์ค ํ๋๋, ์ด๋ ํ ์ ๋ฌ ์ธ์๊ฐ ์ฃผ์ด์ง ๊ฒฝ์ฐ, ํญ์ ๋๊ฐ์ ๊ฐ์ด ๋ฆฌํด๋จ์ ๋ณด์ฅํ๋ค. ๊ทธ๋์ ์์ธก ๊ฐ๋ฅํ ํจ์์ด๊ธฐ๋ ํ๋ค.
side effect๊ฐ ์๋ ํจ์์ฒ๋ฆฌ
function UserProfile({ name }) { const message = `${name}๋ ํ์ํฉ๋๋ค!`; //ํจ์ ๋ฐํ ๊ฐ ์์ฑ // BAD document.title = `${name}์ ๊ฐ์ธ์ ๋ณด`; //ํจ์ ์ธ๋ถ์ ์ํธ์์ฉํ๋ Side-effect ์ฝ๋ return <div>{message}</div>; }
์์ ์ฝ๋๋ ํจ์ํ ์ปดํฌ๋ํธ๊ฐ ์คํ๋๊ณ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ๋ฌด๊ดํ document.title์ ์์ ํ๊ณ ์๋ค.
์์ ์ฝ๋๋ฅผ useEffect()๋ก ๋ถ๋ฆฌํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
function UserProfile({ name }) { const message = `${name}๋ ํ์ํฉ๋๋ค!`; //Side-Effect ์ฝ๋๋ฅผ UseEffect๋ก ๋ถ๋ฆฌ useEffect(() => { document.title = `${name}์ ๊ฐ์ธ์ ๋ณด`; }, [name]); return <div>{message}</div>; }
์ฐธ๊ณ )
useEffect์ Side-Effect
ํด๋์ค ์ปดํฌ๋ํธ์ ๋ผ์ดํ ์ฌ์ดํด ์ค componentDidMount์ componentDidUpdate, ComponentWillUnMount์ ๊ธฐ๋ฅ์ ํฌํจํ๋ค.
์ปดํฌ๋ํธ๊ฐ Render๋ ํ, useEffect๊ฐ ์คํ๋๋ค.
(์ ๋ฆฌํ ๋ด์ฉ์ด๋ ์ ํํ์ง ์์ ์ ์๋ค)
์ฐ์ , Side Effect์ด๋ ๋ฌด์์ธ๊ฐ.
Side Effect๋ ํจ์ ์คํ์ด ํจ์ ์ธ๋ถ์ ์ํฅ์ ๋ฏธ์น๋ ๊ฒ์ด๋ค.
์๋ฅผ ๋ค๋ฉด, ํจ์ ์ธ๋ถ์ ๋ณ์์ ์ํฅ์ ์ฃผ๋ ๊ฒ, ๋ค๋ฅธ ํจ์๋ฅผ ์คํ์ํค๋ ๊ฒ, ๋์ผํ ๊ฒฐ๊ณผ๊ฐ์ ๋ฆฌํดํ์ง ์๋ ๊ฒ, ์์ ๊ฐ๋ฅํ์ง ์์ ๊ฒฐ๊ณผ๋ฅผ ๋ฆฌํดํ๋ ๊ฒ, ์ธ๋ถ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ ๊ฒ ๋ฑ์ด ์์ ๊ฒ์ด๋ค.
์์ํจ์๋ ์ค์ง ํจ์์ ์ ๋ ฅ๋ง์ด ํจ์์ ๊ฒฐ๊ณผ์ ์ํฅ์ ์ฃผ๋ ํจ์์ด๋ค.
์ฆ, ์ ๋ฆฌํ๋ฉด ์์ํจ์๋ ๋ค์๊ณผ ๊ฐ๋ค.
๋์ผํ ์ธ์๊ฐ ๋ค์ด๊ฐ ๊ฒฝ์ฐ ํญ์ ๊ฐ์ ๊ฐ์ด ๋์์ผ ํ๋ค.(์์ธก์ด ๊ฐ๋ฅํด์ผ ํ๋ค.)
๋ถ์์ ์ธ ํจ๊ณผ๊ฐ ์ผ์ด๋๋ฉด ์ ๋๋ค.
return ๊ฐ์ผ๋ก๋ง ์ํตํ๋ค.
๊ทธ๋ ๋ค๋ฉด, fetch์ ๊ฒฝ์ฐ๋ ์ด๋ ํ๊ฐ?
fetch๋ ์ฒซ๋ฒ์งธ ์ธ์๋ก ๋ฐ์ URL๋ก ํด๋น ๋ฐ์ดํฐ๋ฅผ ๋ฐํ๋ฐ๊ฒ ๋๋๋ฐ,
๋คํธ์ํฌ ์์ฒญ์ ํ๋ ๊ฒฝ์ฐ ์๋ต๋ฐ๋ ์๋๊ฐ ๋ค๋ฅผ ์ ์๊ณ , ์๋ต์ด ๋ค๋ฅผ ์ ์๊ธฐ ๋๋ฌธ์, ์์ํจ์๊ฐ ์๋ ๊ฒ์ด๋ค.
๋ํ, ์ธ๋ถ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ธฐ ๋๋ฌธ์, side effect๊ฐ ์๋ ๊ฒ์ด๊ณ , react์์๋ ๋ณดํต fetch๋ก ๋ฐ์์จ ๋ฐ์ดํฐ๋ก state๊ฐ์ ๋ณ๊ฒฝํด ์ค๋ค. ๊ทธ๋ ๋ค๋ฉด ํจ์ ์ธ๋ถ์ setState๋ฅผ ํธ์ถํ๊ณ state๋ฅผ ๋ณ๊ฒฝํด ์ค ๊ฒ์ด๊ธฐ ๋๋ฌธ์, side effect๊ฐ ์๋ค๊ณ ๋งํ๋ ๊ฒ์ด๋ค.
๋๋ฌธ์, fetch๋ useEffect์์ ์จ์ฃผ๊ฒ ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋ ๋ค๋ฉด ์ Side Effect๊ฐ ๋ฐ์ํ๋ฉด useEffect ์์ ์จ์ฃผ๋ ๊ฒ์ผ๊น?
์ธ๋ถ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์(Side Effect) state, prop์ด ์ ๋ฐ์ดํธ๊ฐ ๋๋ฉด ์ปดํฌ๋ํธ๊ฐ ์์ฑ๋ ๋์ ์ด๊ธฐ๊ฐ์ ๋ฐํ์ผ๋ก Virtual-DOM์ ์์ฑํ๊ณ (render phrase) ์ค์ DOM์ ๋ง์ดํธ ํ๋ ๊ณผ์ ์ ๊ฑฐ์น๊ฒ ๋๋ค. ๋ง์ฝ ๋ณ๊ฒฝ๋ state๊ฐ ์๋ค๋ฉด ๋ค์ render์ commit ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํ๋ ๊ณผ์ ์ ์ํํ๋ค.
๊ทธ๋ฌ๋ฉด, ์์ render ์ ์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๋ฉด(๋ถ์ํจ๊ณผ๋ฅผ ๋ง๋ค๊ณ ) ๋๋๋ฐ ์ ๊ตณ์ด ๋๋ฒ ์ํํ๋ ๊ฒ์ผ๊น?
๊ฒฐ๋ก ๋ถํฐ ์ด์ผ๊ธฐํ๋ฉด ์ฑ๋ฅ์ด ์ ํ๋๋ค.
๊ฐ์๋์ ๊ทธ๋ฆฌ๋ ๊ณผ์ ์์๋ ์ค์ง ์ปดํฌ๋ํธ์ "์์ํ ๋ถ๋ถ"๋ง ํฌํจ๋์ด์ผ ํ๋ค. ๊ทธ๋์ผ ๋ฆฌ์กํธ์ ํต์ฌ์ธ ์ด์ ๋ ๋๋ง ๊ฒฐ๊ณผ์ ์ด๋ฒ ๋ ๋๋ง ๊ฒฐ๊ณผ๋ฅผ ๋น๊ตํด ๋ฐ๋ ๊ฒ๋ง ๋น๊ตํด ์ปดํฌ๋ํธ๋ฅผ ์ ๋ฐ์ดํธ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
Side Effect๋ฅผ ์ผ๊ธฐํ๋ ๊ณผ์ ์ ๊ฐ์๋์ ๋ง๋๋ ๊ณผ์ (render phrase)์ ํฌํจ๋๋ฉด ๋ถ์ ํจ๊ณผ๊ฐ ๋ฐ์ํ ๋ ๋ง๋ค Virtual-DOM์ ๋ค์ ๊ทธ๋ ค์ผ ํ๋ค. ๋ํ ๋ฐ์ดํฐ ์์ฒญ์ ๊ฒฝ์ฐ์๋ ๋๊ธฐ์ ์ผ๋ก ๋คํธ์ํฌ ์๋ต์ ๋ฐ์์ผ๋ง ๋ค์ ๊ณผ์ ์ด ์งํ๋ ์ ์๋ค.
๋ฐ๋ผ์ ๋ฆฌ์กํธ๋ ์ปดํฌ๋ํธ ๋ด๋ถ์ ์์ํ ๋ถ๋ถ์ ์ฌ์ฉํด ํ๋ฉด์ ๊ทธ๋ฆฌ๊ณ ๋ ํ ๋ถ์ํจ๊ณผ๋ฅผ ๋ฐ์์ํจ๋ค. ์ดํ์ ์ปดํฌ๋ํธ ๊ฐฑ์ ์ด ํ์ํ๋ค๋ฉด ๋ค์ ๋ชจ๋ ๊ณผ์ ์ ๊ฑฐ์ณ ๋ค์ ๋ ๋๋งํ๋ ๊ณผ์ ์ ๊ฑฐ์ณ๋ ๊ฐ์๋์ ํ์ฉํด ํ์ํ ๋ถ๋ถ๋ง ์ ๋ฐ์ดํธ ํ์ฌ ์ฑ๋ฅ์ ํฐ ์ํฅ์ ์ฃผ์ง ์๋๋ค.
์ฐธ๊ณ )
https://oowgnoj.dev/react/side-effect
์ด ์ง๋ฌธ์ ์์์ useEffect๊ฐ ๋ง์น ๋น๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ ๋ชจ์ต์ ๋ณด์ฌ์์๋ค. ํ์ง๋ง, useEffect๊ฐ ๋น๋๊ธฐ๋ก ๋์ํ๋ ๊ฒ์ด ์๋๋ผ, life cycle์ ๋ฐ๋ผ ๋๋๋ง ๋ ํ์ ์์๋๋ hook์ธ ๊ฒ์ด๋ค.
์ฆ, useEffect๋ ๋๋๋ง ํ ์คํ๋๊ณ , ์ฌ๋ฌ ๋ฆฌ์กํธ๊ฐ ์๋ ๊ฒฝ์ฐ ๋๊ธฐ์ ์ผ๋ก ์คํ๋๋ค.
https://ko.reactjs.org/docs/hooks-effect.html#example-using-hooks