useReducer()
1. ๊ฐ์
๋ฆฌ์กํธ์์๋ ๋ณดํต ์ํ๋ฅผ ์
๋ฐ์ดํธ ํ๊ธฐ ์ํด useState()
ํ
์ ์ฌ์ฉํ๋ค. ํ์ง๋ง useReducer()
ํ
์ ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ๊ด๋ฆฌํ ์๋ ์๋ค.
useReducer()
ํ
์ด ๊ฐ์ง๊ณ ์๋ ํน๋ณํ ํน์ง์ ํ ์ปดํฌ๋ํธ ๋ด์์ state
๋ฅผ ์
๋ฐ์ดํธํ๋ ๋ก์ง ๋ถ๋ถ์ ๊ทธ ์ปดํฌ๋ํธ๋ก๋ถํฐ ๋ถ๋ฆฌ์ํค๋ ๊ฒ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค. ์ํ ์
๋ฐ์ดํธ ๋ก์ง์ ์ปดํฌ๋ํธ ๋ฐ๊นฅ์ ์์ฑ ํ ์๋ ์๊ณ , ์ฌ์ง์ด ๋ค๋ฅธ ํ์ผ์ ์์ฑ ํ ๋ถ๋ฌ์์ ์ฌ์ฉ ํ ์๋ ์๋ค.
์ด๋ฌํ useReducer()
ํ
์ ๋ํด useState()
ํ
๊ณผ ๋น๊ตํ๋ ๊ฒ์ ์์ํ์ฌ ์ดํด๋ณด์.
2. useState() vs useReducer()
์ธ์ useState()
ํ
์ ์ฌ์ฉํ๋์ง ์ธ์ useReducer()
ํ
์ ์ฌ์ฉํ๋์ง๋ ์ ํด์ง ๊ธฐ์ค์ ์์ง๋ง ๋ณดํต ์๋์ ์ํฉ์ ๋ฐ๋ผ ๋๋์ด state
๋ฅผ ๊ด๋ฆฌํ๋ค.
useState()
ํ ์ ์ฌ์ฉํ ๊ฒฝ์ฐ๊ด๋ฆฌํด์ผ ํ
state
๊ฐ 1๊ฐ์ผ ๊ฒฝ์ฐ๊ทธ
state
๊ฐ ๋จ์ํ ์ซ์, ๋ฌธ์์ด ๋๋boolean
๊ฐ์ผ ๊ฒฝ์ฐ
useReducer()
ํ ์ ์ฌ์ฉํ ๊ฒฝ์ฐ๊ด๋ฆฌํด์ผ ํ
state
๊ฐ 1๊ฐ ์ด์, ๋ณต์์ผ ๊ฒฝ์ฐํน์ ํ์ฌ๋ ๋จ์ผ
state
๊ฐ๋ง ๊ด๋ฆฌํ์ง๋ง, ์ถํ ์ ๋์ ์ผ ๊ฐ๋ฅ์ฑ์ด ์๋ ๊ฒฝ์ฐ์ค์ผ์ผ์ด ํฐ ํ๋ก์ ํธ์ ๊ฒฝ์ฐ
state
์ ๊ตฌ์กฐ๊ฐ ๋ณต์กํด์ง ๊ฒ์ผ๋ก ๋ณด์ด๋ ๊ฒฝ์ฐ
3. useReducer()ํ
์ ๊ธฐ๋ณธ ๊ตฌ์กฐ
์๋๋ useReducer()ํ ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ์ด๋ค.
state: ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ์ํ
dispatch:
reducer
ํจ์๋ฅผ ์คํ์ํจ๋ค. ์ปดํฌ๋ํธ ๋ด์์ state์ ์ ๋ฐ์ดํธ๋ฅผ ์ผ์ผํค๊ธฐ ์ํด ์ฌ์ฉํ๋ค.reducer:
(state, action) =-> newState
์ ํํ๋ฅผ ๊ฐ์ง๋ค. ์ปดํฌ๋ํธ ์ธ๋ถ์์state
๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ก์ง์ ๋ด๋นํ๋ ํจ์์ด๋ค.initalArg: ์ด๊ธฐ
state
init: ์ด๊ธฐ ํจ์
4. initialArg๋ฅผ ํตํ ์ด๊ธฐ state๊ฐ ์ค์
initialArg
๋ฅผ ํตํด ์ด๊ธฐ state
๊ฐ์ ์ค์ ํ ์ ์๋ค. ๊ทธ๋ฌ๋ฉด useCallback()
์ฑํฐ์์ ๋ค๋ฃจ์๋ ์ ์ฃผ๋ ์ฌํ ์ปดํฌ๋ํธ ๋ฐํ์ผ๋ก ์๋กญ๊ฒ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์ด๋ณด์.
์์ ๊ฐ์ด ์ฐ์ initialArg
๋ฅผ ๋ง๋ค๊ณ App
์ปดํฌ๋ํธ์์๋ useReducer()
ํ
์ ๋ถ๋ฌ์ ๊ธฐ๋ณธ ์ฝ๋๋ฅผ ์์ฑํ์. reudecer()
ํจ์๋ ์๋์์ ๋ค๋ฃฌ๋ค.
๋จผ์ ๊ถ๊ธํ ์ ์ด ์๊ฒผ๋ค. useReducer()
ํ
์ ํตํด ๋ถ๋ฌ์จ state
์๋ ์ด๋ค ๊ฐ์ด ์ ์ฅ๋์ด ์์๊น? ์ฝ์์ ์ฐ์ด ๊ทธ ๋ด์ฉ์ ํ์ธํ์.
initialArg
์์ ์ ์ธํ ๊ฐ์ฒด๊ฐ ๊ทธ๋๋ก ์ฐํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
5. state๊ฐ์ ๊ฐ์ ธ์ ํ๋ฉด์ ๊ทธ๋ฆฌ๊ธฐ
์ด๋ฒ์ initialArg
๊ฐ์ฒด์ gift
๋ฐฐ์ด์ "ํ๋ผ๋ด"๊ณผ "์ด์ฝ๋ฆฟ"์ ์ถ๊ฐํ ํ state
๊ฐ์ ๊ฐ์ ธ์ ํ๋ฉด์ ์ถ๋ ฅํ์. ์๋์ ์ฝ๋ ์ฒ๋ผ ์ฝ๋๋ฅผ ์ถ๊ฐ ์์ฑํด๋ณด์.
state
๋ฅผ ๊ตฌ์กฐ๋ถํด ํ ๋น์ ํ์ฌ isSunny
์ gift
์ ๊ฐ์ ธ์๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น ๊ฐ์ ๋ฐํ์ผ๋ก ํ๋ฉด์ ๊ทธ๋ฆฌ๊ณ ์๋ค.
useCallback()
์ฑํฐ์์ ๋ค๋ฃจ์๋ ์ ์ฃผ๋ ์ฌํ๊ณผ ๊ด๋ จ๋ ์ปดํฌ๋ํธ๋ค. ๋ณ์์ ์ด๋ฆ์ ๋ณํ์ง ์์์ผ๋ ๊ทธ๋๋ก ๋ณต๋ถํ๊ณ ์ฌ์ฉํ์ง ์๋ ํจ์๊ฐ ์ง์ฐ๋ฉด ๋๋ค.
6. state๋ฅผ ์
๋ฐ์ดํธํ๊ธฐ ์ํ ์ฒซ ๋ฒ์งธ ๊ณผ์ ์ธ dispatchํจ์ ์์ฑ
dispatch
ํจ์๋ state
์ ์
๋ฐ์ดํธ๋ฅผ ์ผ์ผํค๊ธฐ ์ํด ์ฌ์ฉ๋๋ฉฐ dispatch
ํจ์์ ์ธ์๋ก์จ ์
๋ฐ์ดํธ๋ฅผ ์ํ ์ ๋ณด๋ฅผ ๊ฐ์ง aciton
๋ฅผ ์ด์ฉํ๋ค. ๋ํ dispatch
ํจ์๋ ๋ฐ๋ก ์๋์์ ๋ค๋ฃจ๊ฒ ๋๋ reducer
ํจ์๋ฅผ ์คํ์ํจ๋ค.
์ด๋ฒคํธ๋ฅผ ์ฐ๊ฒฐํ์ฌ dispatch
ํจ์๋ฅผ ์์ฑํด๋ณด์.
button
ํ๊ทธ์ form
ํ๊ทธ์ ๊ฐ๊ฐ onClick
๊ณผ onSubmit
์ด๋ฒคํธ๋ฅผ ์ฐ๊ฒฐํ์๊ณ onClickChangeBtn()
ํจ์์ onSubmitFrom()
ํจ์๋ฅผ ํตํด ์ด๋ฒคํธ๊ฐ ์คํ๋๋ค. ํ๋ํ๋ ์ดํด๋ณด์.
onClickChangeBtn():
dispatch
ํจ์๊ฐ ์คํ๋๊ณ ์ธ์๋ก ๊ฐ์ฒด{type: "changeWeather"}
๊ฐ ์ ๋ฌ๋์๋ค.onSubmitFrom(): ์ฌ๊ธฐ์๋
dispatch
ํจ์์ ์ธ์๋ก ๊ฐ์ฒด{ type: "submitGift", gift }
๊ฐ ์ ๋ฌ ๋์๋ค.
7. state๋ฅผ ์
๋ฐ์ดํธํ๊ธฐ ์ํ ๋ ๋ฒ์งธ ๊ณผ์ ์ธ reducerํจ์ ์์ฑ
dispatch
ํจ์์ ์คํ์ผ๋ก reducer
ํจ์๊ฐ ํธ์ถ๋๋ค. reducer
ํจ์๋ ๋ ๊ฐ์ ์ธ์๋ฅผ ๋ฐ๋๋ฐ ์ฒซ ๋ฒ์งธ๋ ํ์ฌ(๋ฐ๋๊ธฐ ์ )์ state
์ด๊ณ ๋ ๋ฒ์งธ๋ action
์ด๋ค. ์ฆ ์๋์ ๊ฐ์ ๊ธฐ๋ณธ ํํ๋ฅผ ๊ฐ์ง๊ณ ์๋ค.
reudcer
ํจ์๋ฅผ ์๋์ ๊ฐ์ด ์์ ํ์ฌ ์ ๋ฌ ๋ฐ์ state
์ action
๋ฅผ ์ฝ์๋ก ์ฐ์ด๋ณด์
๋ ์จ ๋ฐ๊พธ๊ธฐ
๋ฒํผ์ ๋๋ ๋๋ ์์ ๊ฐ์ ์๋ฌ๊ฐ ๋ด๋ค. ๋คํํ ์ฐ๋ฆฌ๊ฐ ์ํ๋ state
์ action
์ ์ฝ์๋ก ์ ์ฐํ๋ค. ์๋ฌ๋ฅผ ํํด์น๊ธฐ ์ ํด๋น ๊ฐ์ ์ดํด๋ณด์.
state: ํ์ฌ์
state
action:
dispatch
ํจ์์ ์ธ์๋ก ์ ๋ฌํ ๊ฐ์ฒด
์๋ฌ๋ ๋๋์ฒด ์? ๋ฐ์ํ ๊ฒ์ผ๊น? ๊ทธ ์ด์ ๋ ๊ฐ๋จํ๋ค. useReducer()
ํ
์ reducer
ํจ์๋ state
๋ฐํํด์ผ ํ๋ค. ๋น์ฐํ ์ธ์๋ก ๋ฐ์ state
๋ฅผ ๊ทธ๋๋ก ๋ฐํํ๋ ๊ฒ์ด ์๋๋ผ(๋ฌผ๋ก ๊ฐ๋ฅ์ ํ์ง๋ง ๊ทธ๋ ๊ฒ ๋๋ฉด state
๊ฐ์ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ useReducer()
ํ
์ ์๋ฏธ๊ฐ ์์ด์ง๋ค.) ์ด๋ ํ ๋ก์ง์ ํตํด ๋ฐ๋๋ state
๊ฐ์ ๋ฐํํด์ผ ํ๋ค.
์์ ์ฝ๋์์๋ ๋ฐํ๋๋ state
๊ฐ ์๊ธฐ ๋๋ฌธ์ ์๋ฌ๊ฐ ๋ฐ์ํ ๊ฒ์ด๋ค. ์์๋ฐฉํธ์ผ๋ก ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ์๋์ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
reducer
ํจ์์ ์ธ์๋ก ๋ฐ๋ state
์ action
์ ๋ํด ์์๋ดค์ผ๋ ์ด๋ฅผ ๊ฐ์ง๊ณ state
๋ฅผ ์
๋ฐ์ดํธ ํ๋ ์ฝ๋๋ฅผ ์์ฑํ์.
reducer
ํจ์๋ฅผ ์๋์ ๊ฐ์ด ์ถ๊ฐ ์์ฑํ๋ค.
๊ตฌ์กฐ๋ถํด ํ ๋น์ผ๋ก
state
๊ฐ์ ๋ด๋ถ์ ์กด์ฌํ๋isSuuny
์gift
์ ๊ฐ์ ธ์จ๋ค.action
๊ฐ์ฒด์๋type
์ด ์กด์ฌํ๋ฉฐ ์ด๋ ์ด๋ฒคํธ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋ค.onSubmitForm
์ด๋ฒคํธ์ธ ๊ฒฝ์ฐtype
๋ฟ ์๋๋ผ ์ ๋ฌผ์ ์ด๋ฆ์ ๊ฐ์ผ๋ก ๊ฐ์ง๋gift
๋ ์กด์ฌํ๋ค.switch
๋ฌธ์ผ๋ก ์ฌ์ฉํ์ฌaction.type
๊ณผ ์ผ์นํ๋ case๋ฅผ ์ฐพ์ ๋ณ๊ฒฝ๋state
๋ฅผ ๋ฐํํ๋ค.๊ฐ๊ฐ์
case
์์ ๋ฆฌํด๋๋ ๊ฐ์ฒด๋ฅผ ๋ณด๋ฉด ๊ธฐ์กดstate
๋ฅผ spread ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์๋ค. ์ด๋reducer
ํจ์์์ ์๋ก์ด ์ํ๋ฅผ ๋ง๋ค ๋์๋ ๋ถ๋ณ์ฑ์ ์ง์ผ์ฃผ์ด์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.์ถ๊ฐ๋ก
default
๋ฅผ ์ค์ ํ์ฌcase
์ ์กด์ฌํ์ง ์๋aciton.type
์ด ๋ค์ด์์ ๋ ์๋ฌ๋ฅผ ๋ฐ์์ํค๊ณ ์๋ค.
reducer
ํจ์์์ ์ฃผ์ํด์ผ ํ ์ ์ ๊ธฐ์กด์ state
๋ฅผ ์๋ก์ด state
๋ก ๋์ฒด(replace)๋ฅผ ํด์ผ ํ๋ค๋ ๊ฒ์ด๋ค. ์ฆ, ๊ธฐ์กด์ state
๋ฅผ ๋ณ๊ฒฝ(modify)ํ๊ฑฐ๋, ์ถ๊ฐ(add)ํ๊ฑฐ๋, ๋ฎ์ด์ฐ์ง(overwrite) ์์์ผ ํ๋ค.
8. Conclusion
์ฌ์ค ์์ ์์ ๋
useReducer()
ํต์ธ ์ฌ์ฉํ๋ ๊ฒ ๋ณด๋คuseState()
ํ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ ์ ํ๋ค. ํ์ง๋ง ๊ฐ๋จํ ์์ ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ฌ์ฉํ ์ ์ ์ฐธ๊ณ ํด์ฃผ์์ผ๋ฉด ํ๋ค.useReducer()
ํ ์ ์ฌ๋ฌ ๋ฆฌ์กํธ ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ์ฌ์ฉํ์ง ์์๋ ํ ์ด๋ค. ํ์ง๋ง ์์ ์redux
๋ฅผ ๋ฐฐ์ธ ๋ ๋น์ทํ ๊ฐ๋ ์ ๋ํด ๊ณต๋ถํ๋ ๊ธฐ์ต์ด ๋ ์ฌ๋ผ ์ฝ๊ฒ ์ดํด๊ฐ ๋์๋ ๊ฑฐ ๊ฐ๋ค. ๋์ค์redux
๋ฅผ ๋ค์ ๊ณต๋ถํ ๋ ์ค๋ ๋ฐฐ์ด ๋ด์ฉ์ด ํฐ ๋์์ด ๋์์ ํ๋ค.
์ฐธ๊ณ
20. useReducer ๋ฅผ ์ฌ์ฉํ์ฌ ์ํ ์ ๋ฐ์ดํธ ๋ก์ง ๋ถ๋ฆฌํ๊ธฐ React Hooks :: useReducer์ ๋ํด ์์๋ณด๊ธฐ
๐ 2022-08-09
Last updated