240106_useEffect_useRef
Last updated
Last updated
์ฝ๋ฉ ์์ด ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ๋ฉด python ์ฝ๋๋ก ๋ณํํ์ฌ ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ๋ง๋ค๊ณ
์๋ฒ์์ ๋ฅ๋ฌ๋ ๋ชจ๋ธ์ ํ์ต์ ์ํค๊ณ ,
๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์๊ฐ์ ์ผ๋ก ํ์ธ
ํ ์ ์๋ ์๊ฐ์ ํ๋ก๊ทธ๋๋ฐ ์๋น์ค์ ๋๋ค.
๊ทธ ์ค ๋ ธ๋๋ฅผ ์ฐ๊ฒฐํ๊ณ , ๊ฐ ๋ ธ๋์ property๋ฅผ ์ค์ ํ๋ UI๋ฅผ ๋ง๋๋ ์์ ์ค ๋ง๋ ๋ฌธ์ ์ํฉ ์ ๋๋ค.
์บ๋ฒ์ค์ ๊ทธ๋ ค์ง๋ ๋ ธ๋ UI๋ ํธ๋ฆฌ ํํ ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก rete.js ํ๋ ์์ํฌ๋ฅผ ํ์ฉํด ๊ทธ๋ ธ๊ณ , right panel๋ก ํธ๋ฆฌ์ ๊ฐ ๋ ธ๋์ ์ ์ฅ๋ property(options)๋ฅผ ์กฐ์ํ๋ UI๋ฅผ ๋ง๋๋ ์์ ์ ๋๋ค.
์ด ๋, ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ํ์ํด์ผํ ์ง ๊ตฌ๋ถ์ด ํ์ํ์ต๋๋ค.
์๋ฒ์์ ๋ณด๋ด์ค ํธ๋ฆฌ ๋ฐ์ดํฐ์ ์ ์ฅ๋ ๋ด์ฉ์ UI์ ๋ฐ์
FE์์ preset์ผ๋ก ์ค์ ํ ๋ชจ๋ธ ๋ฐ์ดํฐ๋ฅผ UI์ ๋ฐ์
์ ์ ๋ก ์ธํด ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ UI์ ๋ฐ์
์ ๋ชจ๋ ์ํฉ์ ํด๋น๋์ง ์์ผ๋ฉด ์ด๊ธฐ๊ฐ์ ๋ฐ์
๋ ธ๋์ options
๋ฐ์ดํฐ ์ ์ฅ
๋ฐ์ดํฐ ์ ๋ฐ์ดํธ
-
โฌ๏ธ ์ ์ฅ๋ ๋ฐ์ดํฐ ์ ๋ฌ
โฌ๏ธ ์ฌ์ฉ์ ์ ๋ ฅ๊ฐ ์ ๋ฌ
์ธํ ์ปดํฌ๋ํธ
์ ์ฅ๋ ๋ฐ์ดํฐ ํ์
์ฌ์ฉ์ ์ ๋ ฅ๊ฐ ๋ฐ๊ธฐ
์ด ๊ณผ์ ์์ ๊ฒช์๋ ์ด๋ ค์์ ๊ธฐ๋กํ๋ ค๊ณ ํฉ๋๋ค.
๋ฌธ์ ์ : ๋ฌดํ๋ฃจํ ์์ฑ
input๊ฐ์ด ๋ฐ๋ ๋๋ง๋ค Node์ option์ ์ ๋ฌ
input์ด ๋ฐ๋๋๋ง๋ค Node์ setValue
Node์์ ๋ฐ์์จ prevOption์ด ๋ณํ ๊ฐ์ง
์ด๊ธฐํ ํจ์๊ฐ ๋ค์ ์๋
ํด๊ฒฐ ๋ฐฉ๋ฒ:
๋ฐ์์ค๋ ๋ฐ์ดํฐ์ ์ฌ๋ ค๋ณด๋ด๋ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฆฌ (prevOption <-> Option)
loading ์ํ ์ถ๊ฐ
์ด๊ธฐ๊ฐ์ด ์ ๋ฌ์ด ์๋ฃ๋๋ฉด loading์ false๋ก ์ค์
์๋ ๋ฐฉ์:
์ต์์ ์ปดํฌ๋ํธ์์ loading
, setLoading
์ ์ ์ธํ๊ณ
๋
ธ๋์์ ๋ฐ์์ค๋ option์ prevOption
, useRef์ผ๋ก,
setValue๋ก ์ฌ๋ ค์ฃผ๋ option์
useState ์ํ๋ก ๋ถ๋ฆฌ๋ฅผ ํด์ค ๋ค์
prevOption
์ด ์ตํ์ ์ปดํฌ๋ํธ input ui์ ํ์๋๊ณ ,
์ตํ์ ์ํ setTuple
์ ์ ์ฅ๋ ๋๊น์ง loading
์ true
๋ก ๋ง๋ค์๊ณ ,
๊ทธ๋์ setValue
์ ๊ฐ์ ๊ฐ์ ์ค์ ํด์ฃผ๋ ํจ์๋ค์ loading์ด false์ฌ์ผ๋ง ์๋
์ด๋ ๊ฒ ํ๋ ๊ธฐ์กด์๋ node์ option์ ์ด๋ฏธ ๊ฐ์ด ์ค์ ๋์ด ์๋ ๊ฒฝ์ฐ์ ์ด๊ฒ์ input์ ํ์๋ฅผ ํด์ฃผ๊ณ , ์ด๋ฅผ state์ ์ ์ฉ์ ์ํค๋ฉด setValue๊ฐ ์ผ์ด๋ฌ์ง๋ง, loading์ด true์ฌ์ ๋ ธ๋์ ์ ๋ฐ์ดํธ๊ฐ ๋์ง ์์์ต๋๋ค.
๋ฌธ์ ์
๋ ธ๋์ ์ ์ฅ๋ ๊ฐ์ด ์๋๋ฐ๋ ๋ถ๊ตฌํ๊ณ ,
๊ฐ์ด ์์ ๋ ์๋์ผ๋ก ์ค์ ๋๋ ์ด๊ธฐ๊ฐ์ด ๋ํ๋จ
์์ธ
option์ ๊ฐ์ useRef๋ก prevOption
์ ์ ๋ฌํ๋ ์์ ๋ณด๋ค
์ตํ์์ input ์ปดํฌ๋ํธ๋ค์ด ๋ ๋๋ง์ด ์๋ฃ๋๊ณ componentDidMount()์ฒ๋ผ ์ฌ์ฉํ๋ ๋น useEffect๊ฐ ์คํ๋์ด prevOption
์ ๊ฐ์ ํ์ธํ๋ ์์ ์ด ๋ ์์ด๋ค.
ํด๊ฒฐ ๋ฐฉ์
์ด๋ฅผ ํด๊ฒฐํ๊ณ ์ useEffect์ ์คํ ์์ ,
๊ทธ์ ๋ฐ๋ฅธ ์ํ์ props ๊ฐ์ ์ ๋ฌ ๋ฐ๋ ์์ ์ ๋ํด์ ์์๋ณด์๊ณ ,
input์ปดํฌ๋ํธ์์ prevOption
์ ๊ฐ์ ํ์ธํ๋ ์์ ์ ์์
As-is: ์ปดํฌ๋ํธ๊ฐ ๋ ๋๋ง์ด ์๋ฃ๋ ์์ === useEffect ์์กด ๋ฐฐ์ด์ด ๋น ๋ฐฐ์ด
To-be: ์ต์์ ์ปดํฌ๋ํธ์์ ์ ๋ฌ๋ฐ๋ option
์ ํน์ ๊ฐ์ด ๋ณ๊ฒฝ๋๋ ์์ === useEffect์ ์์กด ๋ฐฐ์ด์ด option.current[id]
useEffect์ ์๋ฏธ๋ ๋ ๋๋ง์ ๋ถ์ํจ๊ณผ์ด๋ค.
๋ ๋๋ง์ด ๋๋ฉด(!) ๋ฐ๋ผ์ค๋ ๋์์ผ๋ก ๋ ๋๋ง์ด ๋๋ ์ดํ์ ์คํ๋๊ธฐ ๋๋ฌธ์ ref์ DOM ๋ ธ๋๊ฐ ๋ฐ์ธ๋ฉ ๋์๋ค๊ณ ๊ฐ์ ํ ์ ์๋ค.
useEffect์ ๋ชฉ์ ์ ๋๊ธฐํ๋ค.
์์กด ๋ฐฐ์ด์ ๊ฐ์ฒด๋ฅผ ๋ฃ์ง ๋ง์.
์ด๋ค effect๊ฐ prevOption
๋ด์ ํน์ ํค์ (๊ฐ์ฒดํ์
์ด ์๋)๊ฐ์ด ๋ฐ๋ ๋๋ง๋ค ์๋ํ๋๋ก ํ๊ณ ์ถ๋ค๋ฉด, ์ฝ ์ง์ด์ prevOption.current.name
๊ณผ ๊ฐ์ด ์์กด ๋ฐฐ์ด์ ๋ช
์ํด์ฃผ์. prevOption๋ง ๋ฃ์ ๊ฒฝ์ฐ์ ๊ฐ์ฒด๋ ๋ณํด๋ useEffect๊ฐ ๊ฐ์งํ ์ ์๋ค.
useRef๋ฅผ ์ฐ๋ ๊ฒฝ์ฐ์ ์ฃผ์ํ์. ๋ฆฌ๋ ๋๋ง์ ์ ๋ํ์ง ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ ๊ฐ์ฒด์ด๋ฏ๋ก ๋ฆฌ๋ ๋๋ง์ ์ ๋ํ๊ณ ์ถ๋ค๋ฉด useState๋ฅผ ์ฌ์ฉํด์ผ ๋๋ค.
state๋ const, ์์์ด๋ค. ์ฆ, ํ๋์ ๋ฆฌ๋ ๋ ์์ ์ ๊ฐ์ ๋ฐ๊พธ๊ณ ํด๋ const ๋ณ์๋ ์ฌํ ๋น์ด ๋ถ๊ฐ๋ฅ ํ๋ค. ๊ฐ์ ๋ฐ๊พธ๊ณ ์ถ๋ค๋ฉด ๋ฆฌ๋ ๋๊ฐ ํ ๋ฒ ๋ ์ผ์ด๋๊ฒ ํด์ผํ๋ค.
effects์ ๋ํด์ ์ด์ผ๊ธฐํ๊ธฐ ์ ์, ์ฐ๋ฆฌ๋ rendering์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ Counter๊ฐ ์์ต๋๋ค. ๊ฐ์กฐํ์๋ ์ค์ ์์ธํ ๋ค์ฌ๋ค ๋ณด์ธ์.
์ด ์ค์ด ์๋ฏธํ๋ ๋ฐ๊ฐ ๋ฌด์์ผ๊น์? count๊ฐ ์ด๋ป๊ฒ๋ ์ฐ๋ฆฌ์ ์ํ์ ๋ณํ๋ฅผ "์ง์ผ๋ณด๊ณ " ์๊ณ , ์๋์ผ๋ก updateํด์ฃผ๋ ๊ฑธ๊น์? ์ฒ์ ๋ฐฐ์ธ๋์๋ ์ ์ฉํ ๋น์ ์์์ง ๋ชจ๋ฅด์ง๋ง ์ด๊ฒ์ ์ ํํ ๋ฉํ ๋ชจ๋ธ์ ์๋๋๋ค.
์ด ์์์์ count๋ ๊ทธ์ ํ๋์ ์ซ์์ผ ๋ฟ์ ๋๋ค. ๊ทธ๊ฒ์ "data binding", "watcher", "proxy" ๊ณผ ๊ฐ์ ๋ง์ ์ด ์๋๋๋ค. ์๋์ ๊ฐ์ ์ข์ ์ค๋๋ ์ซ์์ ๋๋ค.
์ฐ๋ฆฌ์ ์ปดํฌ๋ํธ๊ฐ ์ฒ์ ๋ ๋๋ง ๋ ๋, ์ฐ๋ฆฌ๊ฐ useState()๋ก ๋ถํฐ ์ป์ด์จ count ๋ณ์๋ 0 ์ ๋๋ค. ์ฐ๋ฆฌ๊ฐ setCount(1)ํจ์๋ฅผ ํธ์ถํ ๋, ๋ฆฌ์กํธ๋ ์ฐ๋ฆฌ์ ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ํธ์ถํด์. ์ด๋ฒ์๋ count ๋ณ์์ ๊ฐ์ด 1์ด ๋ ๊ฒ๋๋ค. ์ด๊ฑธ ๊ณ์ ๋ฐ๋ณต ํฉ๋๋ค.
์ฐ๋ฆฌ๊ฐ ์ํ๋ฅผ ์ ๋ฐ์ดํธ ํ ๋๋ง๋ค, ๋ฆฌ์กํธ๋ ์ฐ๋ฆฌ์ ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ํธ์ถํด์. ๋งค ๋ ๋ ๊ฒฐ๊ณผ๋ ๊ทธ ์์ฒด์ counter ์ํ ๊ฐ์ "๋ณด๊ณ " ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ ์ํ๊ฐ์ ์ฐ๋ฆฌ์ ํจ์ ์์ ์๋ ์์์ฃ .
๊ทธ๋ฌ๋ ์์ ์ฝ๋ ํ ์ค์ ์ด๋ ํ ํน๋ณํ data binding์ ํ๋๊ฒ ์๋๋๋ค. ๊ทธ์ ํ๋์ ์ซ์ ๊ฐ์ ๋ ๋ ๊ฒฐ๊ณผ์ ํฌํจ์ํค๋ ๊ฒ ๋ฟ์ด์ฃ . ๊ทธ ์ซ์๋ ๋ฆฌ์กํธ๋ก๋ถํฐ ์ ๊ณต๋์๊ณ ์.
์ฐ๋ฆฌ๊ฐ count๋ฅผ setํ ๋(setCountํ ๋), ๋ฆฌ์กํธ๋ ์ฐ๋ฆฌ์ ํจ์๋ฅผ ๋ค์ ํธ์ถํฉ๋๋ค. ์ด ๋ count ์ ๊ฐ์ ๋ฌ๋ผ์ ธ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ฆฌ์กํธ๋ ์ฐ๋ฆฌ์ ๊ฐ์ฅ ์ต๊ทผ ๋ ๋ ๋ ฌ๊ณผ์ ๋ง์ถ๊ธฐ ์ํด์ DOM์ ์ ๋ฐ์ดํธ ํฉ๋๋ค.
์ค์ํ๊ฒ ๊ฐ์ ธ๊ฐ์ผํ ์ ์ ์ด๋ค ํน์ ๋ ๋ ์์ ์๋ count ์์๊ฐ ์๊ฐ์ด ์ง๋๋ ๋ณํ์ง ์์ ๊ฒ์ด๋ผ๋ ์ ์ ๋๋ค. ๋ค์ ํธ์ถ๋ ๊ฒ์ "์ฐ๋ฆฌ์ ์ปดํฌ๋ํธ"์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋งค ๋ ๋ ๋ง๋ค ๊ทธ ์์ฒด์ count ๊ฐ์ "๋ณด๊ณ " ์๋ ๊ฑฐ์์. ๋ ๋ ์ฌ์ด์ ๊ณ ๋ฆฝ๋์ด์๋.
์ง๊ธ๊น์ง ์ ๋ฐ๋ผ์ค์ จ๋์? ์ข์์. ๊ทธ๋ ๋ค๋ฉด event handler๋ ์ด๋ค๊ฐ์?
์๋์ ์์๋ฅผ ๋ด ์๋ค. count ๋ณ์์ ํจ๊ป 3์ด ๋ค์ ๊ฒฝ๊ณ ์ฐฝ์ ๋ณด์ฌ์ฃผ๋ค์.
์ ๊ฐ ์ด ์ผ๋ จ์ ๊ณผ์ ์ ์คํํด๋ณธ๋ค๊ณ ํด๋ด ์๋ค.
์นด์ดํฐ๋ฅผ 3๊น์ง ์ฆ๊ฐ์ํต๋๋ค.
alert ๋ณด์ฌ์ฃผ๊ธฐ ๋ฒํผ์ ๋๋ฆ ๋๋ค.
timeout ๋ฒ์ ๊ฐ ์ธ๋ฆฌ๊ธฐ ์ ์ 5๊น์ง ์ฆ๊ฐ์ํต๋๋ค.
๊ฒฝ๊ณ ์ฐฝ์ด ๋ญ๋ผ๊ณ ๋ณด์ฌ์ค ๊ฒ ๊ฐ์ผ์ ๊ฐ์? ๊ฒฝ๊ณ ์ฐฝ์ด ๋จ๋ ๋น์์ ์นด์ดํฐ ์ํ ๊ฐ์ธ 5์ผ๊น์? ์๋๋ฉด show alert ๋ฒํผ์ ํด๋ฆญํ ์์ ์ ์ํ๊ฐ์ธ 3์ผ๊น์?
์คํฌ ์ฃผ์
๊ฐ์ ์ง์ ํด๋ณด์ธ์!
๋ง์ฝ ์ด ํ๋์ด ์ดํด๊ฐ ๋์ง ์๋๋ค๋ฉด ํ์ฌ ์์ ์์ id๊ฐ ์ํ๋ก ์ ์ฅ๋์ด ์๊ณ send ๋ฒํผ์ด ์๋ ์ฑํ ์ฑ๊ณผ ๊ฐ์ ๋ ์ค์ฉ์ ์ธ ์์๋ฅผ ์์ํด ๋ด ์๋ค. ๊ฒฝ๊ณ ์ฐฝ์ ๊ทธ ๋ฒํผ์ด ํด๋ฆญ๋๋ ๋น์์ ์ํ๊ฐ์ "ํฌ์ฐฉ"ํฉ๋๋ค. ๋ค๋ฅธ ํ๋์ ์คํํ ์ ์๋ ๋ฐฉ๋ฒ๋ค๋ ์์ง๋ง, ์ ๋ ์ง๊ธ์ผ๋ก์จ๋ ๊ธฐ๋ณธ์ ์ธ ์ํฉ์๋ง ์ง์คํ๋ ค๊ณ ํฉ๋๋ค. ๋ฉํ ๋ชจ๋ธ์ ๊ตฌ์ถํ ๋๋ opt-in escape hatches(์ํ ๋ ์์คํ ์ ์ผ๋ถ๋ฅผ ๋นํ์ฑํํ๊ฑฐ๋ ๋ณ๊ฒฝํ๊ธฐ ์ํ ์ต์ , ์์คํ ์ ์ผ๋ถ๋ฅผ ์ ์ฐํ๊ฒ ์ปจํธ๋กค ํ๋ ๋ฐฉ๋ฒ, ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ ์ ์ํ๋ ๋ฐฉ๋ฒ)๋ก๋ถํฐ ์ ํญ์ ์ต์ํํ๋ ๊ฒฝ๋ก๋ฅผ ๊ตฌ๋ถํด๋ด๋ ๊ฒ(๊ทธ๋ฅ ๋น ๋ฅด๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ฐพ๋ ๊ฒ์ด๋ผ๋ ๋ป)์ด ์ค์ํฉ๋๋ค.
ํ์ง๋ง ๊ทธ๊ฒ ์ด๋ป๊ฒ ์๋ํ๋์?
์ฐ๋ฆฌ๋ count ๊ฐ์ด ๋งค ํน์ ํธ์ถ๋ง๋ค ์ฐ๋ฆฌ์ ํจ์์์ ์์๋ผ๊ณ ์ด์ผ๊ธฐ ํด์์ต๋๋ค. ์ด๊ฒ์ ๊ฐ์กฐํ๋ ๊ฒ์ ์ค์ํฉ๋๋ค. ์ฐ๋ฆฌ์ ํจ์๋ ํธ์ถ ๋ฉ๋๋ค ์ฌ๋ฌ๋ฒ, ๋งค ๋ ๋๋ง๋ค ํ ๋ฒ์ฉ, ํ์ง๋ง ๊ทธ ๋ง์ ํ์ ์ค ๋งค ๋ฒ ๊ทธ ์์ ์๋ count ๊ฐ์ ์์์ด๊ณ ํน์ ํ ๊ฐ, ๊ทธ ๋ ๋๋ฅผ ์ํ ์ํ๊ฐ ์ผ๋ก ์ค์ ๋์ด ์์ง์.
์ด๊ฒ์ ๋ฆฌ์กํธ์๋ง ๊ตญํ๋ ๊ฒ์ด ์๋๋๋ค. ์ผ๋ฐ์ ์ธ ํจ์๋ ๋น์ทํ ๋ฐฉ์์ผ๋ก ๋์ํด์.
์ด ์์์์ ์ธ๋ถ ๋ณ์์ธ someone ๋ณ์๋ ๋ช ๋ฒ ์ฌ ํ ๋น ๋์์ต๋๋ค. ๋ฆฌ์กํธ์ ์ด๋๊ฐ์์์ ๊ฐ์ด, "ํ์ฌ" ์ปดํฌ๋ํธ์ ์ํ๋ ๋ณํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ sayHi ํจ์ ์์๋ ํน์ ํ ํธ์ถ๋ก๋ถํฐ person์ผ๋ก ์ฐ๊ด๋์ด์ง ์ง์ญ ์์์ธ name ์ด ์์ต๋๋ค. ๊ทธ ์์๋ ์ง์ญ์ ์ด๊ณ , ๊ทธ๋์ ๋งค ํธ์ถ ์ฌ์ด์์ ๋ ๋ฆฝ์ ์ ๋๋ค! ๊ฒฐ๊ณผ์ ์ผ๋ก ์๊ฐ์ด ๋ค ๋์์ ๋, ๋งค ๊ฒฝ๊ณ ์ฐฝ์ ๊ทธ ์์ฒด์ name ๋ณ์๋ฅผ "๊ธฐ์ต"ํฉ๋๋ค.
์ด๊ฒ์ ์ฐ๋ฆฌ์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ค์ด ์ด๋ป๊ฒ ํด๋ฆญ ๋น์์ count๋ฅผ ํฌ์ฐฉํ๋์ง๋ฅผ ์ค๋ช ํด์ค๋๋ค. ๋ง์ฝ ์ฐ๋ฆฌ๊ฐ ๊ฐ์ ๋์ฒด ์์น์ ์ ์ฉํ์๋ค๋ฉด, ๋งค ๋ ๋๋ ๊ทธ ์์ฒด์ count๋ฅผ ๋ค์๊ณผ ๊ฐ์ด "๋ณด์์" ๊ฒ์ ๋๋ค.
๊ทธ๋์ ํจ๊ณผ์ ์ผ๋ก, ๋งค ๋ ๋๋ ๊ทธ ์์ฒด์ "๋ฒ์ "์ handleAlertClick ํจ์๋ฅผ ๋ฐํํฉ๋๋ค. ๊ทธ ๋ฒ์ ๋ค์ ๊ฐ๊ฐ์ ๊ทธ ์์ฒด์ count ๊ฐ์ "๊ธฐ์ต"ํฉ๋๋ค.
๊ทธ๋์ ์ด ์์์์ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ํน์ ๋ ๋์ "์์"๋์ด ์๊ณ , ์ฌ๋ฌ๋ถ์ด ํด๋ฆญํ์ ๋ ์ปดํฌ๋ํธ๊ฐ ๊ทธ ๋ ๋"๋ก ๋ถํฐ ๊ฐ์ ธ์จ" counter ์ํ๋ฅผ ๊ณ์ํด์ ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค.
ํน์ ๋ ๋ ์์์ props์ ์ํ๋ ์์ํ ๊ฐ์ ์ํ๋ก ๋จ์์์ต๋๋ค. ํ์ง๋ง props์ state๊ฐ ๋งคใ ๋ ๋ ์ฌ์ด์ ๋ ๋ฆฝ์ ์ด๊ณ , ๊ทธ๊ฒ๋ค์ ์ฌ์ฉํ๋ ์ด๋ค ๊ฐ๋ค(์ด๋ฒคํธ ํธ๋ค๋ฌ๋ ํฌํจ)๋ ๊ทธ๋ฌํฉ๋๋ค. ๊ทธ๋ค ๋ํ ํน์ ํ ๋ ๋์ "์ํด" ์๋ ๊ฒ์ด์ฃ . ๊ทธ๋์ ์ด๋ฒคํธ ํธ๋ค๋ฌ ์์ ์๋ async ํจ์ ์กฐ์ฐจ๋ ๊ฐ์ count ๊ฐ์ "๋ณผ" ๊ฒ์ ๋๋ค.
Side Note: ๋๋ handleAlertClick ํจ์ ์์์ ํจ์ ๋ฐ๋ก ์์ผ๋ก ๊ตฌ์ฒด์ ์ธ count ๊ฐ์ inline ํ๋๋ฐ์. ์ด ๋ฉํ ๋์ฒด๋ ์์ ํ์ฃ ์๋ํ๋ฉด count๊ฐ ํน์๋ผ๋ ๋ณํ ๋ฆฌ ์์ผ๋๊น์. ํน์ ๋ ๋ ์์์. ๊ทธ๊ฒ์ ์์๋ก์จ ์ ์ธ๋์๊ณ , ์ซ์ ์ ๋๋ค. ์ด๊ฒ ๋ํ ใ ๊ฐ์ฒด ์ฒ๋ผ ๋ค๋ฅธ ๊ฐ๋ค์ ๋ํด์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ์๊ฐํ๊ธฐ์ ์์ ํฉ๋๋ค. ํ์ง๋ง ์ค์ง ์ํ๋ฅผ ๋์ฐ๋ณ์ด ํ๋ ๊ฒ์ ํผํ๋ ๊ฒ์ ๋์ํ ์ํฉ์์๋ง์. rmrjtdmf qusgudtlzlsms rjt eotlsdp ์๋กญ๊ฒ ์์ฑ๋ ๊ฐ์ฒด๋ก setStateํจ์๋ฅผ ํธ์ถํ๋ ๊ฒ์ ๊ด์ฐฎ์ต๋๋ค. ์๋ํ๋ฉด ์ด์ ๋ ๋์ ์ํด์๋ ์ํ๊ฐ ์จ์ ํ๋๊น์.
์ด ๊ธ์ด effects์ ๊ด๋ จ๋ ๊ธ์ด์ด์ผ ํ๋๋ฐ ์ฐ๋ฆฌ๋ ์ด์ ์์ผ ์ดํํธ์ ๋ํ ์ด์ผ๊ธฐ๋ฅผ ํ๋ค์. ์ฐ๋ฆฌ๋ ์ด์ ๋ฐ๋ก์ก์ ๊ฒ์ ๋๋ค. ๊ฒฐ๊ณผ์ ์ผ๋ก, ์ดํํธ๋ ์ ๋ง๋ก ์ ํ ๋ค๋ฅด์ง ์์ต๋๋ค.
๋ฌธ์์ ์์ ์ค ํ๋๋ก ๋์๊ฐ ๋ด ์๋ค.
๋น์ ์๊ฒ ์ง๋ฌธ ํ๋ ๋๋ฆฌ๊ฒ ์ต๋๋ค. ์ดํํธ๋ ์ด๋ป๊ฒ ์ต๊ทผ count ์ํ๋ฅผ ์ฝ์๊น์?
์๋ง๋, effect ํจ์ ์์ ์ค์๊ฐ์ผ๋ก count๋ฅผ ์ ๋ฐ์ดํธ ํ๋ ์ผ์ข ์ "data binding"์ด๋ผ๊ฑฐ๋ "watching" ๊ฐ์ ๊ฒ์ด ์๊ฒ ์ฃ ? ์๋ง๋ count๋ ๋ฆฌ์กํธ๊ฐ ์ฐ๋ฆฌ์ ์ปดํฌ๋ํธ ์์์ ์ค์ ํด์ ์ฐ๋ฆฌ์ ์ดํํธ๊ฐ ํญ์ ์ต๊ทผ์ ๊ฐ์ ๋ณด๋๋ก ํ๋ ๋ณํ๊ฐ๋ฅํ ๋ณ์๊ฒ ์ฃ ?
์๋์.
์ฐ๋ฆฌ๋ ์ด๋ฏธ count๊ฐ ํน์ ํ ์ปดํฌ๋ํธ ๋ ๋ ์์์ ๋ณ์น ์๋ ์์๋ผ๋ ๊ฒ์ ์๋๋ค. ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ count ์ํ๋ฅผ ๊ทธ๋ค์ด ์ํ ๋ฐ๋ก ๊ทธ ๋ ๋๋ก๋ถํฐ ๋ด ๋๋ค. ์๋ํ๋ฉด count๊ฐ์ ๊ทธ๋ค์ scope ์์ ๋ณ์๋๊น์. ์ดํํธ์์๋ ๋ง์ฐฌ๊ฐ์ง ์ ๋๋ค!
๊ทธ๊ฒ์ ๋ณํ์ง ์๋ effect ์์์ ์ด์ฐ๋๋ ๋ณํํ๋ ๋ณ์๋ count๊ฐ ์๋๋๋ค. ๋งค ๋ ๋๋ง๋ค ๋ค๋ฅธ ๊ฒ์ effect ํจ์ ๊ทธ์์ฒด์ ๋๋ค.
๋งค ๋ฒ์ ์ ๊ทธ๊ฒ์ด ์ํ ๋ ๋๋ก ๋ถํฐ ๊ฐ์ ธ์จ count value๋ฅผ ๋ฐ๋ผ๋ด ๋๋ค.
๋ฆฌ์กํธ๋ ์ฌ๋ฌ๋ถ์ด ์ ๊ณตํ ์ดํํธ ํจ์๋ฅผ ๊ธฐ์ตํ๊ณ ๋ณํ๋ฅผ DOM์ flushingํ๊ณ , ๋ธ๋ผ์ฐ์ ๊ฐ ์คํฌ๋ฆฐ์ ๊ทธ๋ฆฌ๋๋ก ํ ํ์ ์คํ์ํต๋๋ค. ๊ทธ๋์ ์ฐ๋ฆฌ๊ฐ ํ๋์ ๊ฐ๋ ์ ์ธ ์ดํํธ๋ฅผ ์ฌ๊ธฐ์ ์ด์ผ๊ธฐ ํ๋ค๊ณ ํ๋๋ผ๋ ๊ทธ๊ฒ์ ๋ค๋ฅธ ํจ์๋ฅผ ๋งค ๋ ๋๋ง๋ค ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์ ๋งค ์ดํฉํธ ํจ์๋ ํ๋กญ์ค์ ์ํ๋ฅผ ๊ทธ๊ฒ์ด ์ํ ํน์ ๋ ๋๋ก๋ถํฐ ๋ฐ๋ผ๋ด ๋๋ค.
๊ฐ๋ ์ ์ผ๋ก ์ดํํธ๊ฐ ๋ ๋ ๊ฒฐ๊ณผ์ ์ผ๋ถ๋ผ๋ ๊ฒ์ ์์ํ ์ ์์ ๊ฒ์ ๋๋ค.
์๊ฒฉํ ๋งํ๋ฉด ๊ทธ๊ฒ๋ค์ ๋ณต์กํ ๋ฌธ๋ฒ์ด๋ ๋ฐํ์ ์ค๋ฒํค๋ ์์ด ํ ๊ตฌ์ฑ์ ํ์ฉํ๊ธฐ ์ํ ๊ฒ์ด ์๋๋๋ค. ๊ทธ๊ฒ์ ๋ฉํ ๋ชจ๋ธ๋ด์์ ์ฐ๋ฆฌ๊ฐ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ๋์ํ๋ ๊ฒ๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํน์ ๋ ๋์ ์ํ๋ ์ดํํธ ํจ์๋ฅผ ๊ตฌ์ถํ ์ ์๊ฒ ํ๋ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๊ฒฌ๊ณ ํ ์ดํด๋ฅผ ํ์คํ ํ๊ธฐ ์ํด์ ์ฐ๋ฆฌ์ ์ฒซ ๋ฒ์งธ ๋ ๋๋ฅผ ๋ณต๊ธฐํด ๋ด ์๋ค.
๋ฆฌ์กํธ: state๊ฐ 9์ผ ๋ UI๋ฅผ ๋ด๊ฒ ์ค. ์ฌ๋ฌ๋ถ์ ์ปดํฌ๋ํธ: ์ฌ๊ธฐ ๋ ๋ ๊ฒฐ๊ณผ์ผ <p>You clicked 0 times</p>
๋ ํ ์ผ ๋ง์น๋ฉด ์ด ์ดํํธ๋ฅผ ์คํ ์ํค๋๋ก ํ๋ ๊ฒ๋ ๊ธฐ์ตํด์ค. () => { document.title = 'You clicked 0 times' }
๋ฆฌ์กํธ: ๋ฌผ๋ก ์ด์ง. UI๋ฅผ ์
๋ฐ์ดํธ ํ๊ณ ์์ด. ๋ธ๋ผ์ฐ์ ์ผ, ๋ DOM์ ๋ช๊ฐ์ง๋ฅผ ์ถ๊ฐํ๋ ค๊ณ ํด. ๋ธ๋ผ์ฐ์ : ์ข์, ์คํฌ๋ฆฐ์ ๊ทธ๊ฑธ ๊ทธ๋ ธ์ด. ๋ฆฌ์กํธ: ์ข์, ์ด์ ๋๊ฐ ๋ด๊ฒ ์ค ์ดํํธ๋ฅผ ์คํ์ํฌ๊ฒ. () => { document.title = 'You clicked 0 times' }
๋ฅผ ์คํ์ํค๊ณ ์์ด.
์ด์ ์ฐ๋ฆฌ๊ฐ ํด๋ฆญํ ํ์ ์ด๋ค ์ผ์ด ์ผ์ด๋๋์ง ๋ณต๊ธฐํด ๋ณด์.
์ปดํฌ๋ํธ: ๋ฆฌ์กํธ์ผ, ๋ด ์ํ๋ฅผ 1 ๋ก ์ค์ ํด. ๋ฆฌ์กํธ: ์ํ๊ฐ 1์ผ ๋ UI๋ฅผ ๋ด๊ฒ ์ค. ์ปดํฌ๋ํธ: ๋ ๋ ๊ฒฐ๊ณผ์ผ. <p>You clicked 1 times</p>
๋ ํ ์ผ ๋ง์น๋ฉด ์ด ์ดํํธ๋ฅผ ์คํ ์ํค๋๋ก ํ๋ ๊ฒ๋ ๊ธฐ์ตํด์ค. () => { document.title = 'You clicked 0 times' }
๋ฆฌ์กํธ: ๋ฌผ๋ก ์ด์ง. UI๋ฅผ ์
๋ฐ์ดํธ ํ๊ณ ์์ด. ๋ธ๋ผ์ฐ์ ์ผ, ๋ DOM์ ๋ฐ๊ฟจ์ด. ๋ธ๋ผ์ฐ์ : ์ข์, ๋ด๊ฐ ๋๊ฐ ๋ณํ์ํจ ๊ฑธ ์คํฌ๋ฆฐ์ ํ์ํ์ด. ๋ฆฌ์กํธ: ์๊ฒ ์ด, ์ด์ ๋ด๊ฐ ๋ฐฉ๊ธ ํ ๋ ๋์ ์ํ ์ดํํธ๋ฅผ ์คํ ์ํค์. () => { document.title = 'You clicked 1 times' }
.๋ฅผ ์คํ์ํค๊ณ ์์ด.
์ฐ๋ฆฌ๋ ์ด์ effect ๋ค์ด๋งค ๋ ๋ ์ดํ์ ์คํ๋๊ณ , effect๋ค์ ๊ฐ๋ ์ ์ผ๋ก ์ปดํฌ๋ํธ์ ๊ฒฐ๊ณผ๋ฌผ์ ์ผ๋ถ์ด๋ฉฐ, ๊ทธ๊ฒ๋ค์ ๊ทธ ํน์ ๋ ๋๋ก๋ถํฐ์ props์ ์ํ๊ฐ์ "๋ณธ๋ค"๋ ๊ฒ์ ์๋๋ค.
์๊ฐ ์คํ์ ํด๋ด ์๋ค. ์๋์ ์ฝ๋๋ฅผ ๋ณด์ธ์.
์ ๊ฐ ์ฝ๊ฐ์ ๋๋ ์ด๋ฅผ ๊ฐ์ง๊ณ ์ฌ๋ฌ๋ฒ ํด๋ฆญํ๋ฉด ๋ก๊ทธ์ ์ด๋ค ๊ฒ์ด ํ์๋ ๊น์? (๋ก๊ทธ๊ฐ ์ด๋ป๊ฒ ์๊ฒผ์๊น์? ๋ก๊ทธ๊ฐ ์ด๋ป๊ฒ ๋ณด์ผ๊น์?)
์ด๊ฒ ํ๋ฅ ๊ฒ์์ด๊ณ ๋ง์ง๋ง ๊ฒฐ๊ณผ๋ ์ง๊ด์ ์ด์ง ์๋ค๊ณ ์๊ฐํ ์ง๋ ๋ชจ๋ฆ ๋๋ค. ๊ทธ๋ ์ง ์์ต๋๋ค! ์ผ๋ จ์ ๋ก๊ทธ๋ฅผ ๋ณด๊ฒ ๋ ๊ฑฐ์์. ๊ฐ๊ฐ์ ํน์ ๋ ๋์ ์ํด์์ผ๋ฏ๋ก ๊ทธ ์์ฒด์ count ๊ฐ๊ณผ ํจ๊ป์.
์ฌ๋ฌ๋ถ์ ๋น์ฐํ ๊ทธ๋ ๊ฒ ์๋ํ๊ฒ ์ง, ์๋๋ฉด ์ด๋ป๊ฒ ์๋ํ๊ฒ ์ด? ๋ผ๊ณ ์๊ฐํ ์ง๋ ๋ชจ๋ฆ ๋๋ค. ์, ๊ทธ๊ฑด this.state๊ฐ ํด๋์ค์์ ์๋ํ๋ ๋ฐฉ์์ด ์๋์์. ์ด ํด๋์ค ์คํ์ด ์๋์ ์ฝ๋์ ๊ฐ๋ค๋ ์๊ฐ๊ณผ ๊ฐ์ ์ค์๋ฅผ ๋ง๋ค๊ธฐ ์ฝ์ต๋๋ค.
hook๋ค์ด ์๋ฐ์คํฌ๋ฆฝํธ์ ํด๋ก์ ์ ์ ๋ง ๋ง์ด ์์กดํ๋ค๋ ๊ฒ์ด ๋ชจ์์ ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํ์ง๋ง ์บ๋ ธ๋์ปฌ ํ์์์ ํผ๋์์์ ์๋ชป๋ ๊ฐ์ผ๋ก ๊ณ ํต๋ฐ๋ ํด๋์ค ์คํ์ด์์. ์ข ์ข ํด๋ก์ ์ ๊ด๋ จ์ด ์๋. ์ด ์์์์์ ํผ๋์ ์ค์ ์์ธ์ ๋ณํ์ด๊ณ ํด๋ก์ ๊ทธ ์์ฒด๊ฐ ์๋๋๋ค. ๋ฆฌ์กํธ๊ฐ ์ด ํด๋์ค ์์์์ this.state๊ฐ ๊ฐ์ฅ ์ต์ ์ ์ํ๋ฅผ ๊ฐ๋ฆฌํฌ ์ ์๋๋ก this.state๋ฅผ ๋ณํํ์ด์.
ํด๋ก์ ๋ ๋๊ฐ ๋ซ์ ๊ฐ์ด ์ ๋๋ก ๋ฐ๋์ง ์์ ๋ ํ๋ฅญํ์ฃ . ๊ทธ๊ฒ์
๋ฆฌ์กํธ์๊ฒ ์์กด๋ฐฐ์ด์ ์ ๋๋ก ์๋ ค์ฃผ์ง ์๋ ๊ฒ์ ๋์ ๊ฒฐ๋ง์ ์ด๋ํฉ๋๋ค. ์ง๊ด์ ์ผ๋ก ๋ฌด์จ ๋ง์ธ์ง ์ดํด๊ฐ ๋์์ฃ . ํ์ง๋ง ํด๋์ค๋ก๋ถํฐ์ ๋ฉํ๋ชจ๋ธ์ ๊ฐ์ง๊ณ ๊ฝค ๋ง์ ์ฌ๋๋ค์ด useEffect๋ฅผ ์ฌ์ฉํ์๋ ค๋ ์ฌ๋๋ค์ด ์ด ๊ท์น์ ์๋ฐํ๋ ค๊ณ ํ์ญ๋๋ค. ์ ๋ ์ฒ์์ ๊ทธ๋ฌ์ด์.
๋ง์ดํธ ๋์์ ๋ ํ ๋ฒ๋ง ์คํ์ํค๊ณ ์ถ๋ค๊ณ ์? ์ด์ ๋ถํฐ๋ ๊ธฐ์ตํ์ธ์. ์์กด๋ฐฐ์ด์ ๋ช ์ํด์ฃผ๋ฉด ์ดํํธ์ ์ํด์ ์ฌ์ฉ๋๋ ์ฌ๋ฌ๋ถ์ ์ปดํฌ๋ํธ ์์์์ ๋ชจ๋ ๊ฐ๋ค์ ๊ฑฐ๊ธฐ ์์ด์ผ๋ง ํฉ๋๋ค. props, ์ํ, ํจ์๋ฅผ ํฌํจํด์ ์ปดํฌ๋ํธ ์์ ์ -๋ถ ๋ค์.
๋๋๋ก ๋น์ ์ด ๊ทธ๋ ๊ฒ ํ ๋, ๋ฌธ์ ๋ฅผ ์ผ์ผํค์ฃ . ์๋ฅผ ๋ค๋ฉด ๋ฌดํ ๋ฃจํ๋ฅผ ๋๋ค๊ฑฐ๋, ์์ผ์ด ๋๋ฌด ์์ฃผ ์ฌ์์ฑ ๋๋ค๊ฑฐ๋์. ๊ทธ๋ฌํ ๋ฌธ์ ๋ค์ ๋ํ ํด๊ฒฐ์ฑ ์ ์์กด ๋ฐฐ์ด์ ์ง์ฐ๋ ๊ฒ์ด ์๋์์. ๊ณง ํด๊ฒฐ์ฑ ์ด ๋์ต๋๋ค. ํด๊ฒฐ์ฑ ์ผ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ๋ฌธ์ ์ ๋ํด์ ๋ ์ ์ดํดํด ๋ณด์๊ตฌ์.
์์กด๋ฐฐ์ด์ด ์ดํํธ ์์์ ์ฌ์ฉ๋๋ ๋ชจ๋ ๊ฐ์ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ๋ฆฌ์กํธ๋ ์ธ์ ์ฌ์คํ๋์ด์ผ ํ๋์ง๋ฅผ ์๊ฒ๋๋ค.
ํ์ง๋ง ์์กด๋ฐฐ์ด์ []
์ด๋ ๊ฒ ๋ช
์ํ๋ค๋ฉด, ์๋ก์ด effect๊ฐ ์คํ๋์ง ์๊ฒ ์ฃ . ์ด๋ฐ ๊ฒฝ์ฐ์ ๋ฌธ์ ๋ ๋ช
ํํ ๋ณด์ด์ฃ . ํ์ง๋ง ์ง๊ด์ ์ฌ๋ฌ๋ถ์ ์์ฌ์. ํด๋์ค solution์ด ์ฌ๋ฌ๋ถ์ ๊ธฐ์ต ์์์ "ํ์ด ๋์ค๋" ๋ค๋ฅธ ๊ฒฝ์ฐ์ ๋ง์ด์ฃ .
์๋ฅผ ๋ค์ด์, ๋งค ์ด๋ง๋ค ์นด์ดํฐ๊ฐ ์ฆ๊ฐํ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ๋ค๊ณ ํด๋ด ์๋ค. ํด๋์ค๋ก, ์ฐ๋ฆฌ์ ์ง๊ด์ "setInterval ํ๊ณ , ๋์ค์ destory ํ ๋ฒ ํด์ฃผ๋ฉด ๋๋ ๊ฑฐ ์๋?" ์ด๋ผ๊ณ ์๊ฐํ ์๋ ์์ฃ . ํ์ง๋ง ์๋์ ์์๋ฅผ ๋ด ์๋ค? ์ฐ๋ฆฌ๊ฐ ์๊ฐํ๊ธฐ์ ์ด ์ฝ๋๋ฅผ useEffect๋ก ๋ฒ์ญํ๋ค๋ฉด ์ฐ๋ฆฌ๋ ์ง๊ด์ ์ผ๋ก ์์กด๋ฐฐ์ด์ ๋น ๋ฐฐ์ด์ ์ง์ด ๋ฃ๊ฒ ์ฃ . ํ ๋ฒ๋ง ์คํ๋์ผ๋ฉด ํ์์์?
ํ์ง๋ง, ์ด ์์๋์. ์ฆ๊ฐ๋ฅผ ํ ๋ฒ ๋ฐ์ ์ํค์ง ์์์.
๋น์ ์ ๋ฉํ๋ชจ๋ธ์ด '์์กด๋ฐฐ์ด์ ๋ด๊ฐ ์ด ์ดํํธ๋ฅผ ์ธ์ ๋ค์ ์ด๋ฐํ ์ง ๋ช ์ํ๋๋ก ํ๋ค'๋ผ๋ฉด, ์ด ์์๋ ๋น์ ์๊ฒ ์กด์ฌ์ ์๊ธฐ๋ฅผ ์๊ฒจ์ค์ง๋ ๋ชจ๋ฅด๊ฒ ๋ค์. ๋น์ ์ ์ด๊ฑธ ํ ๋ฒ๋ง ํธ๋ฆฌ๊ฑฐํ๊ณ ์ถ์์์์. ์ด๊ฑด Interval์ด๋๊น์. ๊ทธ๋์, ์ ์ด๊ฒ ๋ฌธ์ ๋ฅผ ์ผ์ผํค๋ ๊ฑฐ์ฃ ?
์์กด๋ฐฐ์ด์ ์ดํํธ๊ฐ ๊ทธ ๋ ๋ ์ค์ฝํ์์ ์ฌ์ฉํ๋ ๋ชจ๋ ๊ฒ์ ๋ํ ํํธ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด๋ผ๋ ๊ฒ์ ์๋ค๋ฉด ์ดํด๊ฐ ๋ ๊ฒ์ ๋๋ค. ์ด ์ดํํธ๋ count ์ํ๋ฅผ ์ฌ์ฉํ๋๋ฐ, ์ฐ๋ฆฌ๊ฐ ์ ํ๋ค๊ณ ๊ฑฐ์ง๋ง์ ์น ๊ฒ ๋๋ ๊ฒ์ด์ฃ . ์ด๊ฒ ์ฐ๋ฆฌ๋ฅผ ๊ณต๊ฒฉํ๋ ๊ฒ์ ์๊ฐ ๋ฌธ์ ์์. (์ด์ ๊ณง ๋์์ผ์ด ์ผ์ด๋ ๊ฑฐ์์!!!)
์ฒซ ๋ฒ์งธ ๋ ๋์์ count์ ๊ฐ์ 0์ด์์. ๊ทธ๋ฌ๋ฏ๋ก, ์ฒซ ๋ฒ์งธ ๋ ๋์ ์ดํํธ๋ setCount(0+1)์ ์๋ฏธํ์ฃ . ๋น ์์กด๋ฐฐ์ด ๋๋ฌธ์ ์ฐ๋ฆฌ๋ never ๋ค์ ์ดํํธ๋ฅผ ์คํ์ํค์ง ์์ผ๋ฏ๋ก, ์ดํํธ๋ ๊ณ์ํด์ setCount(0+1)์ ํธ์ถ ํ๋ ๊ฑฐ์์ ๋งค ์ด๋ง๋ค์!
์ฐ๋ฆฌ๊ฐ ๋ฆฌ์กํธ์๊ฒ ์ฐ๋ฆฌ ์ดํํธ๊ฐ ์ฐ๋ฆฌ ์ปดํฌ๋ํธ ์์ ์ด๋ค ๊ฐ์๋ ์์กดํ์ง ์๋๋ค๊ณ ๊ฑฐ์ง๋ง์ ํ์ด์. ์ค์ ๋ก๋ ์์กด ํ๋๋ฐ์.
์ฐ๋ฆฌ์ ์ดํํธ๋ ์นด์ดํธ๋ฅผ ์ฌ์ฉํด์. ์ปดํฌ๋ํธ ์์ ์กด์ฌํ๋ ๊ฐ์ด์ฃ . ํ์ง๋ง effect ๋ฐ์ ์กด์ฌํด์.
๊ทธ๋ฌ๋ฏ๋ก, ์์กด ๋ฐฐ์ด๋ก ๋น ๋ฐฐ์ด์ ๋ช ์ํ๋ ๊ฒ์ ๋ฒ๊ทธ๋ฅผ ๋ง๋ค์ด ๋ผ๊ฒ๋๋ค. ๋ฆฌ์กํธ๋ ์์กด ๋ฐฐ์ด์ ๋น๊ตํ๊ณ ์ด ์ดํํธ๋ฅผ ์ ๋ฐ์ดํธ ํ๋ ๊ฒ์ ๊ฑด๋ ๋ธ ๊ฒ์ด์์.
์ด๋ฌํ ์ด์๋ค์ ์๊ฐํ๊ธฐ์ ์ด๋ ต์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก, effect ์์กด ๋ฐฐ์ด์ ๋ํด์ ํญ์ ์์งํ ๊ฒ์ ๊ฐ๋ ฅํ ๊ท์น์ผ๋ก์จ ์ฑํํ ๊ฒ์ ๊ถ๊ณ ๋๋ฆฝ๋๋ค. ์ฐ๋ฆฌ๋ lint rule์ ์ ๊ณตํ๊ณ ์์ต๋๋ค. ๋น์ ์ ํ์ ๊ฐํํ๊ธธ ์ํ์ ๋ค๋ฉด์.
๋จผ์ ์ผ๋ฐ์ ์ผ๋ก ์ฒซ ๋ฒ์งธ ๋ฐฉ๋ฒ์ผ๋ก ์์๋ค ํ์ญ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ ๋ฒ ์งธ ๊ฒ์ ํ์ํ๋ค๋ฉด ์ ์ฉํ์์ฃ .
์ฒซ ๋ฒ์งธ ์ ๋ต์ ์์กด ๋ฐฐ์ด์ ์ปดํฌ๋ํธ ์์์ ์ดํํธ ์์์ ์ฌ์ฉ๋ ๋ชจ๋ ๊ฐ๋ค์ ํฌํจํ๋ ๊ฑฐ์์. count๋ฅผ ํฌํจํด๋ด ์๋ค.
์์กด ๋ฐฐ์ด์ ์ณ๊ฒ ๋ง๋ค์์ต๋๋ค. ์ด์์ ์ด์ง๋ ์์์ง ๋ชฐ๋ผ๋์ฐ๋ฆฌ๊ฐ ๊ณ ์ณ์ผํ๋ ์ฒซ ๋ฒ์ฌ ์ด์์๋ ๊ฑฐ์ฃ . ์ด์ count๋ฅผ ๋ณํ์ํค๋ ๊ฒ์ ๋งค ๋ฒ ๋ค์ ์ธํฐ๋ฒ์ ๊ทธ๋์ ๋ ๋์์ setCount(count+1)๋ก๋ถํฐ count๋ฅผ ์ฐธ์กฐํ๋ฉด์ ์ดํํธ๋ฅผ ์ฌ์คํ ์ํฌ๊ฒ๋๋ค.
๊ทธ๊ฑด ์๋ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ฒ ์ง๋ง, ์ฐ๋ฆฌ์ ์ธํฐ๋ฒ์ ์นด์ดํธ๊ฐ์ด ๋ฐ๋ ๋๋ง๋ค ์ง์์ง๊ณ , ๋ค์ ์ค์ ๋๊ฒ ์ฃ . ์ ๊ฐ ๋ณ๋ก ์ํ๋ ๋ฐฉ์์ ์๋๋ค์.
๋ ๋ฒ์งธ ์ ๋ต์ ์ฐ๋ฆฌ์ ์ดํํธ ์ฝ๋๊ฐ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ฒ๋ณด๋ค ๋๋ฌด ์์ฃผ ๋ณํ๋ ๊ฐ์ ํ์๋ก ํ์ง ์๋๋ก ์์ ํ๋ ๊ฑฐ์์. ์ฐ๋ฆฌ๋ ์์กด๋ฐฐ์ด์ ๊ฑฐ์ง๋ง์ ํ๊ณ ์ถ์ง ์์์. ๊ทธ์ ์ฐ๋ฆฌ์ ์ดํํธ๊ฐ ๊ทธ ๊ฐ๋ค์ ๋ ์ ๊ฒ ๊ฐ๋๋ก ์์ ํ๊ณ ์ถ์ ๊ฒ ๋ฟ์ด์์.
์์กด ๋ฐฐ์ด์ ์ญ์ ํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ๊ธฐ์ ๋ค์ ์ดํด๋ด ์๋ค.
์ฐ๋ฆฌ๋ ์ฐ๋ฆฌ์ ์ดํํธ ์์์ count์ ๋ํ ์์กด์ ์ ๊ฑฐํ๊ณ ์ถ์ด์.
๊ทธ๋ฌ๋ ค๋ฉด, ์ค์ค๋ก์๊ฒ ๋ฌผ์ด๋ด์ผ๋ผ์. ์ฐ๋ฆฌ๊ฐ count๋ฅผ ๋ฌด์์ ์ํด์ ์ฐ๊ณ ์๋๊ฐ? ์ฐ๋ฆฌ๊ฐ ๊ทธ๋ฌ ์ค์ง setCount๋ฅผ ํธ์ถํ๊ธฐ ์ํด์ ์ฌ์ฉํ๊ณ ์์์์. ์ด๋ฐ ๊ฒฝ์ฐ์๋ ์ฐ๋ฆฐ ์ฌ์ค count๋ฅผ ์ด ์ค์ฝํ์์ ์ ํ ํ์ํ์ง ์๊ฑฐ๋ ์. ์ฐ๋ฆฌ๊ฐ ์ด์ ์ํ์ ๊ธฐ๋ฐํด์ ์ํ๋ฅผ ์ ๋ฐ์ดํธ ํ๊ณ ์ถ์ ๋๋ ํจ์ํ ์ ๋ฐ์ดํธ๋ฅผ ์ฌ์ฉํ ์ ์์ด์.
ํ์ง๋ง ํจ์ํ ์ ๋ฐ์ดํธ๋ ๋ง ๊ทธ๋ ๊ฒ ์ข์ง๋ ์์์. ์กฐ๊ธ ์ด์ํด๋ณด์ด๊ณ ์ฌ์ฉ ๋ฒ์ ์์ฒด๋ ๋งค์ฐ ์ ํ์ ์ด์์. ์๋ฅผ ๋ค์ด์, ์ฐ๋ฆฌ๊ฐ ๊ทธ ๊ฐ์ด ์๋ก์๊ฒ ์์กดํ๋ ๋๊ฐ์ ์ํ ๋ณ์๊ฐ ์๋ค๋ฉด, ํน์ ์ฐ๋ฆฌ๊ฐ ๋ค์ state๋ฅผ props์ ๊ธฐ๋ฐํด์ ๊ณ์ฐํด์ผ ํ๋ค๋ฉด, ์ด ํจ์ํ ์ ๋ฐ์ดํธ๊ฐ ๋์์ด ๋์ง ์์ ๊ฑฐ์์. ๋คํํ๋, ์ด๋ฌํ ํจ์ํ ์ ๋ฐ์ดํธ๋ ๊ฐ๋ ฅํ ์๋งค ํจํด์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ด๋ฆํ์ผ useReducer.
์์ ์์๋ฅผ ๋ ๊ฐ์ ๋ณ์๋ฅผ ๊ฐ๋๋ก ์์ ํด๋ด ์๋ค. ์นด์ดํธ์ ์คํ . ์ฐ๋ฆฌ์ interval์ ์นด์ดํธ๋ฅผ ์คํ ์ธํ ๊ฐ ๋งํผ ์ฆ๊ฐ์ํฌ ๊ฒ๋๋ค.
์ฐ๋ฆฌ๊ฐ ๋ฐ์น์ ์ฐ์ง ์์ ๊ฒ์์ ๋ช ์ฌํ์ธ์. ์ฐ๋ฆฌ๊ฐ step์ effect ์์์ ์ฌ์ฉ์ ์์ํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ ๋ ์์กด๋ฐฐ์ด์ ์ถ๊ฐํ ๊ฒ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋์ ์ฝ๋๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ ๊ฒ๋๋ค.
์ด ์์์์์ ํ์ฌ ํ๋์ ์คํ ์ ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ธํฐ๋ฒ์ ์ฌ์์ํ๋ค๋ ๊ฒ์ ๋๋ค. ์๋ํ๋ฉด ์์กด ๋ฐฐ์ด์ ํฌํจ๋์ด ์์ผ๋๊น์. ๊ทธ๋ฆฌ๊ณ ๋ง์ ๊ฒฝ์ฐ์ ๊ทธ๊ฒ์ ์ ํํ ๋น์ ์ด ์ํ๋ ๊ฒ์ด์ฃ . ๋ฌธ์ ๋ ๊ฒ์ด ์์ด์. ์ดํํธ๋ฅผ ์ชผ๊ฐ๊ณ ์๋กญ๊ฒ ์ธํ ํ๋ ๊ฒ์, ์ฐ๋ฆฌ๋ ํผํด์๋ ์๋ฉ๋๋ค. ์ฐ๋ฆฌ์๊ฒ ํฉ๋นํ ์ด์ ๊ฐ ์๋ค๋ฉด์.
๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๊ฐ ์ธํฐ๋ฒ์ ์๊ณ๋ฅผ ์คํ ์ ๋ณํ๋ง๋ค ๋ฆฌ์ ์ํค๊ณ ์ถ์ง ์๋ค๊ณ ํด๋ด ์๋ค? ์ฐ๋ฆฌ์ ์ดํํธ์์ ์คํ ์์กด์ ์ด๋ป๊ฒ ์ ๊ฑฐํ ์ ์์ฃ ?
์ํ ๋ณ์๋ฅผ ๋๋ค๋ฅธ ์ํ ๋ณ์์ ํ์ฌ ๊ฐ์ ์์กดํ๋๋ก ์ธํ ํ ๋์๋ useReducer๋ฅผ ํตํด์ ๋ ๋ค ๊ต์ฒดํ๋๋ก ์๋ํ๊ณ ์ถ์ ๊ฒ์ ๋๋ค.
ํจ์ํ setStateํจ์๋ฅผ ์ฐ๊ณ ์๋ค๋ฉด ๊ทธ ๋์ ๋ฆฌ๋์๋ฅผ ์ฐ๋๋ก ๊ณ ๋ คํด๋ณด๊ธฐ์ ์ข์ ํ์ด๋ฐ ์ ๋๋ค. ๋ฆฌ๋์๋ ๋์ ์ปดํฌ๋ํธ ์์์ ์ผ์ด๋๋ ์ก์ ์ ํํํ๋ ๊ฒ๊ณผ ์ํ๊ฐ ๊ทธ๊ฒ์ ๋ํ ๋ฐ์์ผ๋ก ์ด๋ป๊ฒ ์ ๋ฐ์ดํธ ๋์ด์ผ ํ ์ง๋ฅผ ๋ถ๋ฆฌํ๋๋ก ํด์ค๋๋ค.
์คํ ๋ํ๋์๋ฅผ ์ฐ๋ฆฌ์ ์ดํํธ ์์์ ๋์คํจ์น ๋ํ๋์๋ก ๊ตํํด์ค์๋ค.
์ด๊ฒ ๋ญ๊ฐ ์ด๋ป๊ฒ ๋ ์ข์ ๊ฑด์ง ์ง๋ฌธํ์ค ์๋ ์์ง๋ง, ๊ทธ ๋๋ต์ ๋ฆฌ์กํธ๊ฐ ๋์คํจ์น ํจ์๊ฐ ์ปดํฌ๋ํธ์ ์๋ช ์ฃผ๊ธฐ ์ ์ฒด๋ฅผ ํตํ์ด์ ์์์ด๋๋ก ๋ณด์ฅํ๋ค๋ ์ ์ ๋๋ค. ๊ทธ๋์ ์์ ์์๋ ์ธํฐ๋ฒ์ ์ฌ ๊ตฌ๋ ํ ํ์๊ฐ ๋ค์๋ ์์ต๋๋ค.
์ฐ๋ฆฌ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค์!
์ดํํธ ์์ ์ํ๋ฅผ ์ฝ๋ ๊ฒ ๋์ ์, ์ดํํธ๋ ๋ฌด์์ด ์ผ์ด๋ฌ๋์ง์ ๋ํ ์ ๋ณด๋ฅผ ํด๋ ํ๋ ์ด๋ค ์ก์ ์ ๊ฐ์ํฉ๋๋ค. ์ด๊ฒ์ ์ฐ๋ฆฌ์ ์ดํํธ๊ฐ ์คํ ์ํ๋ก๋ถํฐ ๋ถ๋ฆฌ๋์ด ์ ์ง๋ ์ ์๋๋ก ๋ง๋ค์ด์ฃผ์ฃ . ์ฐ๋ฆฌ์ ์ดํํธ๋ ์ฐ๋ฆฌ๊ฐ ์ํ๋ฅผ ์ด๋ป๊ฒ ์ ๋ฐ์ดํธ ํ๋์ง์ ๋ํด์๋ ๊ด์ฌ ์์ด์, ๊ทธ์ ์ฐ๋ฆฌ์๊ฒ ๋ฌด์์ด ์ผ์ด๋ฌ๋์ง์ ๋ํด์ ์๊ธฐํ ๋ฟ์ด์ฃ . ๊ทธ๋ฆฌ๊ณ ๋ฆฌ๋์๋ ์ ๋ฐ์ดํธ ๋ก์ง์ centralize(์ค์์ง์คํ) ํฉ๋๋ค.
์๋๋ JavaScript์ ์๋ ๋ฐฉ์์ ๋ํด์ ๊ณต๋ถํ ๋ด์ฉ๊ณผ useEffect์ ๋ํด์ ๊ณต๋ถํ๊ธฐ ์ํด ๋ผ๋ ๊ธ์ ํ๊ธ๋ก ๋ฒ์ญํ ๋ด์ฉ์ ๋๋ค.