1. ๋ฌธ์ ๋ฐ์
๊ณผ์ ๊ฐ ์ผ์ถ ๋ง๋ฌด๋ฆฌ๊ฐ ๋๊ณ , ์ ์ถ ์ ์ ๋ฆฌํฉํ ๋ง ํ ๋งํ ๊ฒ ์์์ง ์ฐพ์๋ณผ๊น?
์ต์ ํ๋ฅผ ๋จผ์ ํด๋ณด์.
๋ณด์ด๋์..?
ํฌ์ผ๋ชฌ์ ์ถ๊ฐ, ์ญ์ ํ๋ฉด ๋๋ง์ ํฌ์ผ๋ชฌ์๋ ํฌ์ผ๋ชฌ์ด ๋ค์ด์๋ค ๋๊ฐ๋๊น ๋น์ฐํ ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋๋ ๊ฒ์ ์๊ฒ ๋๋ฐ,
ํ๋จ์ ์๋ ํฌ์ผ๋ชฌ ๋ฆฌ์คํธ ๋๋ ์....?
2. ์์ธ ์ถ๋ก
(์ ๋ง ํ์ ํ์ง๋ง ์ดํด๋ฅผ ๋๊ธฐ ์ํด ๊ธํ๊ฒ ๊ทธ๋ ค์จ..๐ )
ํ์ฌ pokemonSlice์์ ๊ด๋ฆฌํ๊ณ ์๋ state๋ ๋น๋ฐฐ์ด ํ๋.
reducer๋ก๋ ์ถ๊ฐ, ์ญ์ ๊ธฐ๋ฅ์ ํ๋ ํจ์ 2๊ฐ.
<PokemonList /> ๋ด๋ถ์์ pokemonStore์ state๋ฅผ ๊ฐ์ ธ๋ค ์ฐ๋ ๋ถ๋ถ์
์ถ๊ฐ ๋ฒํผ ํด๋ฆญ ์ ๋์ํ๋ handleAddPokemon ํจ์ ๋ด๋ถ์์ ํฌ์ผ๋ชฌ ์ค๋ณต ๊ฒ์ฌ๋ฅผ ํ ๋๋ฟ.
์ฌ์ง์ด ๋ถ๋ชจ ์ปดํฌ๋ํธ์ธ <My PokemonBook />์ผ๋ก ๋ฐ๋ props๋ ์๋ค.
๊ทธ๋ฐ๋ฐ ์ PokemonList๊ฐ ๋ค์ ๊ทธ๋ ค์ง๊น...
์ปดํฌ๋ํธ๊ฐ ์๋๋ ๋ ์ด๋ป๊ฒ DOM์ด ๊ทธ๋ ค์ง๋์ง ๊ณผ์ ์ ํ๋ํ๋ ๋ฐ๋ผ๊ฐ๋ค๊ฐ ๊นจ๋ฌ์์ ์ป์๋ค.
pokemonList๊ฐ handleAddPokemon ๋ด๋ถ์ ์๊ณ ,
handleAddPokemon์ด ์คํ๋ ๊ฒ์ด ์๋๋๊น pokemonList๋์ ์๊ด์ด ์์ ๊ฑฐ๋ผ๊ณ ์๊ฐํ๋๋ฐ
๋ฌธ๋ฉ ๋ ์ค๋ฅธ ์ง๋ฆฌ, ํด๋น slice๋ฅผ ๊ตฌ๋ ํ๊ณ ์๋ ์ปดํฌ๋ํธ๋ ํด๋น slice์ state๊ฐ ๋ฐ๋๋ฉด ๋ฆฌ๋ ๋๋ง ํ๋ค!
๊ทธ ์ ์ผ ๊ธฐ๋ณธ์ด ๋๋ ์ฌ์ค์ ์ ์ ๊น๋จน๊ณ ์์๋ค..๐ซฃ
๋ค์ ์ ๋ฆฌํ์๋ฉด
- handleAddPokemon() -> dispatch๋ก targetPokemon ์ ๋ฌ
- reducer ํจ์์์ targetPokemon์ ๋ฐ์ ๊ธฐ์กด state์ ์ถ๊ฐํ์ฌ state ๊ฐ์ ์ ๋ฐ์ดํธํจ
- ์๋ก ์ ๋ฐ์ดํธ๋ state ๊ฐ์ด store์ ์ ์ฅ๋จ
- store๋ฅผ ๊ตฌ๋ ํ๊ณ ์๋ <Dashboard / >, <PokemonList /> ๋ชจ๋ ๋ฆฌ๋ ๋๋ง ๋จ
- <PokemonList />์ ์์ ์ปดํฌ๋ํธ์ธ <PokemonCard /> ์ญ์ ๋ฆฌ๋ ๋๋ง ๋จ
3. ํด๊ฒฐ ๊ณผ์
<PokemonList />๋ pokemonSlice๋ฅผ ๊ตฌ๋ ํ๊ณ ์๊ธฐ ๋๋ฌธ์, ๋ ๋๋ง์ ๋ฐฉ์งํ๋ ๊ฒ์ด ์ด๋ ต๋ค๋ฉด
<PokemonCard />๋ผ๋ React.memo๋ก ๋ฉ๋ชจ์ด์ ์ด์ ํ๋ฉด ๋์ง ์์๊น? ๐ค -> ์ฌ์ ํ ๋ฆฌ๋ ๋๋ง ๋จ.
<PokemonCard />๋ pokemonSlice๋ฅผ ๊ตฌ๋ ํ๊ณ ์์ง ์๋ค.
๊ฒฐ๊ตญ ํด๋น ์ปดํฌ๋ํธ๊ฐ ๋ฆฌ๋ ๋๋ง ๋๋ค๋ ๊ฑด ๋ถ๋ชจ ์ปดํฌ๋ํธ๋ก๋ถํฐ ๋๊ฒจ๋ฐ์ props๊ฐ ๋ฐ๋์๋ค๋ ๊ฒ์ธ๋ฐ
props๋ก ๋๊ฒจ ๋ฐ์ 3๊ฐ ์ค์ key, data๋ <PokemonCard />์ ๋ฉ๋ชจ์ด์ ์ด์ ๋ ๊ฐ๊ณผ ๋ฌ๋ผ์ง์ง ์์๋ค๋ฉด
๋ฉ๋ชจ์ด์ ์ด์ ๋ ๊ฐ์ ์ฌ์ฉํ์ฌ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ์ง ์๋๋ค.
ํ์ง๋ง handleAddPokemon์ pokemonSlice์ state๊ฐ ์ ๋ฐ์ดํธ ๋ ๋๋ง๋ค ์๋ก์ด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ์ ์ฅ์ด ๋์ด์
<PokemonCard />๋ ๊ฐ์ด ๋ฌ๋ผ์ก๋ค๊ณ ์ธ์งํ๊ฒ ๋๋ค.
์ด๋ฐ ๊ณผ์ ๋๋ฌธ์ ๋ฉ๋ชจ์ด์ ์ด์ ์ ํ์์๋ ๋ถ๊ตฌํ๊ณ ๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๋ ๊ฒ์ด๋ค.
๊ทธ๋ผ handleAddPokemon ํจ์ ์์ฒด๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํ๋ฉด ๋๊ฒ ๋ค! ๐ -> handleAddPokemon๋ฅผ useCallback()์ผ๋ก ๊ฐ์ธ์ค
์ด์ <PokemonCard />๊ฐ ๋ ๋๋ง ๋์ง ์๋๋ค!
๊ทธ๋ฐ๋ฐ.. ๋๋ ๋๊น์ง ๋๋ ๊ฒ ์๋์ฅฌ? ^^
ESLint ์ค๋ฅ ๋ฐ์ ๐ฅถ
useCallback์ ์์กด์ฑ ๋ฐฐ์ด์๋ useCallback๋ก ์ ๋ฌ๋๋ ์ฝ๋ฐฑํจ์์ ์ํฅ์ ๋ฏธ์น ์ ์๋ ๊ฐ๋ค์ ๋ฃ์ด์ค์ผ ํ๋ค.
๋ฌด์จ ๋ง์ด๋ ํ๋ฉด,
์ฌ์ค ์์ ์ฒจ๋ถํ ๋์์๋ ์ ์์ ์ธ ๋์์ ์๋ ๊ฒ์ด...
๋ ๋๋ง์ด ๋ค์ ๋์ง๋ ์์ง๋ง ์ด๋ฏธ ๋์ ํฌ์ผ๋ชฌ์ ์ถ๊ฐ๋์ด ์๋ ํฌ์ผ๋ชฌ์ ์ถ๊ฐํ ์ ์๋ค๋ ๊ฒฝ๊ณ alert๊ฐ ๋ ์ผ ํ๋๋ฐ
๊ทธ๋ฅ ์ถ๊ฐ๊ฐ ๋์ด๋ฒ๋ฆฐ๋ค.
์๋ํ๋ฉด useCallback์ ์์กด์ฑ ๋ฐฐ์ด์ pokemonList(store์ state)๊ฐ ๋น ์ก๊ธฐ ๋๋ฌธ์ด๋ค.
handleAddPokemon ํจ์๊ฐ ์ ์ธ๋ ๋น์์ pokemonList ๊ฐ์ ๊ธฐ์ตํ๊ธฐ ๋๋ฌธ์
์๋กญ๊ฒ ๋ฐ๋ ํ์ฌ์ ๊ฐ์ ๊ฐ์ ธ์ค์ง ๋ชปํ๋ ๊ฒ์ด๋ค.๐ฐ
๊ทธ๋ ๋ค๊ณ useCallback์ ์์กด์ฑ ๋ฐฐ์ด์ pokemonList๋ฅผ ๋ฃ์ด์ฃผ๊ธฐ์
<PokemonList />์ ๋ฆฌ๋ ๋๋ง์ ์ผ์ผํค๋ ํธ๋ฆฌ๊ฑฐ๊ฐ ์ด์ฐจํผ pokemonList ํ๋์ด๊ธฐ ๋๋ฌธ์
๋ฆฌ๋ ๋๋ง์ด ๋ฐ์ํ๋ฉด useCallback์ ์์ฐ์ค๋ฝ๊ฒ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์์ ํ ๋น ๋์ด ๋ฉ๋ชจ์ด์ ์ด์ ์ ํ๋ ์๋ฏธ๊ฐ ์์ด์ ธ๋ฒ๋ฆฐ๋ค.
<PokeCard /> ์ญ์ ์ ๋ฌ๋ฐ๋ handleAddPokemon์ ๊ฐ์ด (์ ํํ๋ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์๊ฐ) ๋ ๋๋ง๋ง๋ค ๋ณํ๊ธฐ ๋๋ฌธ์,
๋ฉ๋ชจ์ด์ ์ด์ ๋ ํฐ ์๋ฏธ๊ฐ ์๋ค.
๊ทธ๋์ ์ต์ข ๊ฒฐ๋ก ์!! ํ์ฌ์ ๊ตฌ์กฐ์์๋ ๋ฆฌ๋ ๋๋ง์ด ์ผ์ด๋๋ ๊ฒ์ด ์์ฐ์ค๋ฌ์ด ํ๋ฆ์ด๋ค. ๋ผ๊ณ ๋งํ ์ ์๊ฒ ๋ค.
ํด๊ฒฐ๋ฐฉ์ ์ด๋ฌ๋๋ฐ ํด๊ฒฐ์ ๋ชป ํจใ ..
4. ๊ฒฐ๊ณผ
๊ฒฐ๊ณผ๋ ํ ์ค๋ก ์์ฝํด์ ํ ์ ์ ์ง !
ํญ์ ์ด๋ป๊ฒ ํ๋ฉด ์ข ๋ ๋์ UX๋ฅผ ์ ๊ณตํ ๊น๋ฅผ ๊ณ ๋ฏผํ๋ฉด์ ์ฝ๋๋ฅผ ์์ฑํ๋ ์ต๊ด์ ๊ฐ์ง๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์๋ค.
์ด๋ฒ์๋ ๋ ๋๋ง์ ์ต์ํํด์ ์ข ๋ ์ข์ UX๋ฅผ ๊ตฌํํ์๋ผ๋ ์๊ฐ์ผ๋ก ์๋ํด ๋ณด์๋๋ฐ,
์ด๋ค ๊ฒฝ์ฐ์์๋ ์์ฐ์ค๋ฌ์ด ๋ ๋๋ง์ ์ต์ง๋ก ๋ง๋ ๊ฒ์ด ๊ผญ ์ต์ ์ ๋ฐฉ๋ฒ์ ์๋๋ผ๋ ์๊ฐ์ด ๋ค์๋ค.
์ด๋ป๊ฒ ๋ณด๋ฉด TroubleShooting์ด๋ผ๊ธฐ๋ณด๋ค๋ ์ฝ๊ฐ์ ์ฝ์ง(?)์ด๋ผ๊ณ ํ ์๋ ์๊ฒ ์ง๋ง
์ด๋ ๊ฒ ์ญ ๊ณผ์ ์ ์จ ๋ด๋ ค๊ฐ๋ฉฐ ํ ๋ฒ ๋ ๋ฆฌ๋ ๋๋ง์ ๋ํด ์ ๋ฆฌํ๊ณ ์ ๊ธ์ ์จ๋ดค๋ค.
๊ฒฐ๋ก ์ด ํ์์ ์ง์ง๋ง ๋ง์ด ๋ฐฐ์ธ ์ ์๋ ์๊ฐ์ด์๋ค!