๋‚ด์ผ๋ฐฐ์›€์บ ํ”„

[React/๊ฐœ์ธ๊ณผ์ œ2/TroubleShooting] ๋ฉ”๋ชจ์ด์ œ์ด์…˜, ์•„๋ฌด ๋•Œ๋‚˜ ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค!

Dana10 2025. 2. 6. 15:36

1. ๋ฌธ์ œ ๋ฐœ์ƒ

๊ณผ์ œ๊ฐ€ ์–ผ์ถ” ๋งˆ๋ฌด๋ฆฌ๊ฐ€ ๋๊ณ , ์ œ์ถœ ์ „์— ๋ฆฌํŒฉํ† ๋ง ํ• ๋งŒํ•œ ๊ฒŒ ์žˆ์„์ง€ ์ฐพ์•„๋ณผ๊นŒ?

์ตœ์ ํ™”๋ฅผ ๋จผ์ € ํ•ด๋ณด์ž.

 

๋ณด์ด๋‚˜์š”..?

ํฌ์ผ“๋ชฌ์„ ์ถ”๊ฐ€, ์‚ญ์ œํ•˜๋ฉด ๋‚˜๋งŒ์˜ ํฌ์ผ“๋ชฌ์—๋Š” ํฌ์ผ“๋ชฌ์ด ๋“ค์–ด์™”๋‹ค ๋‚˜๊ฐ€๋‹ˆ๊นŒ ๋‹น์—ฐํžˆ ๋ฆฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜๋Š” ๊ฒƒ์€ ์•Œ๊ฒ ๋Š”๋ฐ,

ํ•˜๋‹จ์— ์žˆ๋Š” ํฌ์ผ“๋ชฌ ๋ฆฌ์ŠคํŠธ ๋„ˆ๋Š” ์™œ....?


2. ์›์ธ ์ถ”๋ก 

(์ •๋ง ํ—ˆ์ ‘ํ•˜์ง€๋งŒ ์ดํ•ด๋ฅผ ๋•๊ธฐ ์œ„ํ•ด ๊ธ‰ํ•˜๊ฒŒ ๊ทธ๋ ค์˜จ..๐Ÿ˜…)

 

ํ˜„์žฌ pokemonSlice์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋Š” state๋Š” ๋นˆ๋ฐฐ์—ด ํ•˜๋‚˜.

reducer๋กœ๋Š” ์ถ”๊ฐ€, ์‚ญ์ œ ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ํ•จ์ˆ˜ 2๊ฐœ.

 

<PokemonList /> ๋‚ด๋ถ€์—์„œ pokemonStore์˜ state๋ฅผ ๊ฐ€์ ธ๋‹ค ์“ฐ๋Š” ๋ถ€๋ถ„์€

์ถ”๊ฐ€ ๋ฒ„ํŠผ ํด๋ฆญ ์‹œ ๋™์ž‘ํ•˜๋Š” handleAddPokemon ํ•จ์ˆ˜ ๋‚ด๋ถ€์—์„œ ํฌ์ผ“๋ชฌ ์ค‘๋ณต ๊ฒ€์‚ฌ๋ฅผ ํ•  ๋•Œ๋ฟ.

 

์‹ฌ์ง€์–ด ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์ธ <My PokemonBook />์œผ๋กœ ๋ฐ›๋Š” props๋„ ์—†๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ์™œ PokemonList๊ฐ€ ๋‹ค์‹œ ๊ทธ๋ ค์งˆ๊นŒ...

์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ž‘๋™๋  ๋•Œ ์–ด๋–ป๊ฒŒ DOM์ด ๊ทธ๋ ค์ง€๋Š”์ง€ ๊ณผ์ •์„ ํ•˜๋‚˜ํ•˜๋‚˜ ๋”ฐ๋ผ๊ฐ€๋‹ค๊ฐ€ ๊นจ๋‹ฌ์Œ์„ ์–ป์—ˆ๋‹ค.

 

pokemonList๊ฐ€ handleAddPokemon ๋‚ด๋ถ€์— ์žˆ๊ณ ,

handleAddPokemon์ด ์‹คํ–‰๋œ ๊ฒƒ์ด ์•„๋‹ˆ๋‹ˆ๊นŒ pokemonList๋ž‘์€ ์ƒ๊ด€์ด ์—†์„ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ

๋ฌธ๋œฉ ๋– ์˜ค๋ฅธ ์ง„๋ฆฌ, ํ•ด๋‹น slice๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ํ•ด๋‹น slice์˜ state๊ฐ€ ๋ฐ”๋€Œ๋ฉด ๋ฆฌ๋ Œ๋”๋ง ํ•œ๋‹ค!

๊ทธ ์ œ์ผ ๊ธฐ๋ณธ์ด ๋˜๋Š” ์‚ฌ์‹ค์„ ์ž ์‹œ ๊นŒ๋จน๊ณ  ์žˆ์—ˆ๋‹ค..๐Ÿซฃ

 

๋‹ค์‹œ ์ •๋ฆฌํ•˜์ž๋ฉด

  1. handleAddPokemon() -> dispatch๋กœ targetPokemon ์ „๋‹ฌ
  2. reducer ํ•จ์ˆ˜์—์„œ targetPokemon์„ ๋ฐ›์•„ ๊ธฐ์กด state์— ์ถ”๊ฐ€ํ•˜์—ฌ state ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•จ
  3. ์ƒˆ๋กœ ์—…๋ฐ์ดํŠธ๋œ state ๊ฐ’์ด store์— ์ €์žฅ๋จ
  4. store๋ฅผ ๊ตฌ๋…ํ•˜๊ณ  ์žˆ๋˜ <Dashboard / >, <PokemonList /> ๋ชจ๋‘ ๋ฆฌ๋ Œ๋”๋ง ๋จ
  5. <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์ด๋ผ๊ธฐ๋ณด๋‹ค๋Š” ์•ฝ๊ฐ„์˜ ์‚ฝ์งˆ(?)์ด๋ผ๊ณ  ํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ

์ด๋ ‡๊ฒŒ ์ญ‰ ๊ณผ์ •์„ ์จ ๋‚ด๋ ค๊ฐ€๋ฉฐ ํ•œ ๋ฒˆ ๋” ๋ฆฌ๋ Œ๋”๋ง์— ๋Œ€ํ•ด ์ •๋ฆฌํ•˜๊ณ ์ž ๊ธ€์„ ์จ๋ดค๋‹ค.

 

๊ฒฐ๋ก ์ด ํ˜„์ƒ์œ ์ง€์ง€๋งŒ ๋งŽ์ด ๋ฐฐ์šธ ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์ด์—ˆ๋‹ค!