๋‚˜์˜ ๋‹ค์ง,๊ธฐ๋ก,์ผ์ƒ/์šฐ๋ฆฌFISA2๊ธฐ_์„ฑ์žฅ๊ธฐ๋ก

์šฐ๋ฆฌ fisa 2๊ธฐ 'ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค ๊ฐœ๋ฐœ' 4์ฃผ์ฐจ

์‹œํ๋ฆฌํ‹ฐ์ง€ํ˜ธ 2023. 12. 17. 18:11

๋ฒŒ์จ ํ•œ ๋‹ฌ์ด๋‹ค !
ํ•œ ๋‹ฌ์ด ๋‹ค ๋˜์–ด ๊ฐ€๋ฉด์„œ ๋งŽ์€ ๊ฒƒ๋“ค์„ ๋ฐฐ์› ๋‹ค.
์ƒˆ๋กœ์šด ์ง€์‹(React)
๋™๊ธฐ๋“ค์˜ ๊ฐ€๋ฅด์นจ
์ฝ”ํ…Œ ๊ฐ•์‚ฌ์˜ ๊ฐ€๋ฅด์นจ
์ •์ฒ˜๊ธฐ ์ฑ…์˜ ๊ฐ€๋ฅด์นจ ใ…‹ใ…‹
๋“ฑ๋“ฑ
 
์ˆ˜์›์—์„œ ์™•๋ณตํ•˜๋Š” ๊ฑด ์ ์‘ํ–ˆ๋‹ค. ๋ชธ์ด ๊ทธ๋ƒฅ ์•Œ์•„์„œ ์ƒ์•”๋™๊นŒ์ง€ ๋ฐ๋ ค๋‹ค ์ค€๋‹ค ใ…‹ใ…‹
์ด์ œ๋Š” ๋ฐฐ์šด ์ง€์‹์— ๋Œ€ํ•ด ์ ์‘ํ•ด์•ผ ํ•œ๋‹ค ใ…Žใ…Ž
 

ํ‰์ผ ์šด๋™์€ ๊ธฐ๊ณ„๊ฐ€ ๋˜์–ด์•ผ ํ•œ๋‹ค. ์ผ์–ด๋‚˜์ž๋งˆ์ž ํ•‘๊ณ„๊ฑฐ๋ฆฌ๊ฐ€ ์ƒ๊ฐ๋‚˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹คใ…‹ใ…‹
ํ•˜๊ธฐ ์‹ซ์–ด์„œ์ธ ๊ฒƒ์„ ์•Œ๊ธฐ ๋•Œ๋ฌธ์—, ๊ทธ๋Ÿฐ ์ƒ๊ฐํ•˜๋Š” ๋‚˜๋ฅผ ๋น„์›ƒ๊ณ  '๊ทธ๋ƒฅ ๊ฐ”๋‹ค์™€ ํ›„ํšŒํ•œ๋‹ค!' ํ•˜๋ฉด์„œ ์ถœ๋ฐœํ•œ๋‹ค
(๋ชจ๋“  ์šด๋™๋Ÿฌ๋“ค์€ ๋‹ค ๊ทธ๋ ‡์ง€ ์•Š๋‚˜? ใ…‹ใ…‹)
 

์ด ๋ฒˆ์ฃผ ๋ถ€ํ„ฐ ์ •์ฒ˜๊ธฐ๋ฅผ ์‹œ์ž‘ํ–ˆ๋‹ค. ์›๋ž˜๋Š” CS๋ฅผ ๊ณต๋ถ€ํ•˜๋ ค ํ–ˆ์œผ๋‚˜, ์ •์ฒ˜๊ธฐ ์—ญ์‹œ CS์ด๊ณ  ์–ด์ฐจํ”ผ ๊นŒ๋จน์„ ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ,
์ •์ฒ˜๊ธฐ ํ•„๊ธฐ๋ฅผ ๋จผ์ € ๊ณต๋ถ€ํ•˜๊ณ  ํ•œ ๋‹ฌ ๋’ค์— CS๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค.
๊ณต๋ถ€ํ•  ์‹œ๊ฐ„์ด ๋”ฐ๋กœ ์—†์–ด์„œ ๋ฒ„์Šค์—์„œ ํ•œ๋‹ค ใ…‹ใ…‹
(๋ฒ„์Šค ํ”๋“ค๋ฆฌ์ง€ ์•Š๊ฒŒ ๊ฐ€์ฃผ์„ธ์š” ใ… )
 

์ด๋ฒˆ์— React๋ฅผ ๋ฐฐ์šฐ๋ฉด์„œ ๋‚ด๊ฐ€ ๋‹ค์‹œ ์ฒ˜์Œ ๋ถ€ํ„ฐ ๋งŒ๋“ค์–ด ๋ณด๊ฒ ๋‹ค๊ณ  ๋‚‘๋‚‘๊ฑฐ๋ฆฌ๊ณ  ์žˆ๋Š” ๋ชจ์Šต์ด๋‹ค.
์–ด๋ ต๋‹คใ… ใ… . ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ํž˜๋“ ๊ฑด ์•„๋‹Œ๋ฐ ๊ทธ๋ƒฅ ์ต์ˆ™ํ•˜์ง€ ์•Š์•„ ์–ด๋ ต๋‹ค. ์กฐ๊ธˆ์”ฉ ์ต์ˆ™ํ•ด์ง€๊ณ , ์ •๋ง ๋‚ด๊ฐ€ ํ•„์š”์— ์˜ํ•ด์„œ
์ด์šฉํ•˜๋Š” ํ•จ์ˆ˜๋‚˜ ๋ฐฉ์‹์ด ์žˆ๋‹ค๋ฉด ๋น„๋กœ์†Œ ๋‚ด ๊ฒƒ์ด ๋˜์ง€ ์•Š์„๊นŒ ํ•œ๋‹ค.
 

(๋ฒ„์Šค ์•ˆ)
์ด์ œ๋Š” ์ฝ”ํ…Œ ํ‘ธ๋Š” ์–‘๊ณผ ์†๋„๋ฅผ ์˜ฌ๋ฆฌ๊ณ  ์žˆ๋‹ค. ์ด๋ฒˆ์— ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ์Šคํ„ฐ๋””๋„ ๋“ค์–ด๊ฐ€์„œ ์—ด์‹ฌํžˆ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค.
์šฐ๋ฆฌ ์Šคํ„ฐ๋”” ๊ทธ๋ฃน ์‚ฌ๋žŒ๋“ค ์‹ค๋ ฅ์ž๋„ ์žˆ๊ณ  ์—ด์ •๋งจ๋„ ํ•œ ๊ฐ€๋“์ด๋ผ์„œ ๋„ˆ๋ฌด ์ข‹๋‹คใ…Žใ…Ž. ๋‹ค๋“ค ๋„์›€ ์„œ๋กœ ๋ฐ›๊ณ  ํฐ ์„ฑ์žฅ๊ณผ ๊ฒฐ๊ณผ๊ฐ€ ์žˆ์—ˆ์œผ๋ฉด ํ•œ๋‹ค.
 

ใ…‹ใ…‹ใ…‹ใ…‹ใ…‹ ์ด๋ฒˆ ์ฃผ ๋ˆ๊นŒ์Šค๋งŒ ์„ธ๋ฒˆ์ด๋‚˜ ๋จน์—ˆ๋‹ค. ใ…‹ใ…‹ใ…‹ ์ผ๋‹จ ์—ฌ๊ธฐ ์€์˜ฅ? ์ด๋ผ๋Š” ๋ˆ๊นŒ์Šค ์ง‘์ธ๋ฐ ๋„ˆ๋ฌด ๋ง›์žˆ์—ˆ๋‹ค.
์šฐ๋ฆฌ ๋ฐ˜ ํ˜•๋‹˜์ด ์—ฌ๊ธฐ์— ๋ฐ˜ํ•ด์„œ ๋‘๋ฒˆ ์—ฐ์† ๋”ฐ๋ผ๊ฐ€๊ฒŒ ๋˜์—ˆ๋‹ค ใ…‹ใ…‹
์—ฌ๋Ÿฌ ๋ฒˆ ๋จน์œผ๋‹ˆ๊นŒ ๋„ˆ๋ฌด ๋ฌผ๋ฆฌ๊ธดํ•˜์ง€๋งŒ ๋ง›์žˆ๊ธด ํ–ˆ๋‹ค.
*๊ทธ ํ˜•์€ 3๋ฒˆ ๊ฐ„๊ฑฐ ๊ฐ™๋‹ค
*๋‚˜๋Š” ์นผ๊ตญ์ˆ˜ ์ง‘์—์„œ ์™•๋ˆ๊นŒ์Šค๋ฅผ ํ•œ ๋ฒˆ ๋” ๋จน๊ฒŒ๋œ๋‹ค ใ…‹ใ…‹ (์นœ๊ตฌ ์™•๋ˆ๊นŒ์Šค ๋จน์–ด ~ ๋ฅ˜์Šน๋ฒ” ๋น™์˜ํ•ด์„œ ๋ง›์žˆ๊ฒŒ ๋จน๋Š”๋‹ค.)
 
 
 
์ด ๋ฒˆ ํ”„๋กœ์ ํŠธ ๊ฒฐ๊ณผ๋ฌผ

 

์ด๋ฒˆ ๋ฏธ๋‹ˆ ํ”„๋กœ์ ํŠธ์ด๋‹ค!! ๋‚˜์™€ ์šฐ๋ฆฌ๋ฐ˜ ๋ˆ„๋‚˜ ๊ทธ๋ฆฌ๊ณ  ์ปด๊ณต ๋™์ƒ๊ณผ ํ•œ ํŒ€์ด ๋˜์—ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ปด๊ณต ๋™์ƒ์€ ํ•™๊ต ์ผ์ •์œผ๋กœ ํ”„๋กœ์ ํŠธ์— ๋ฐ”๋กœ ์ฐธ์—ฌํ•˜์ง€ ๋ชปํ•œ ์ƒํ™ฉ์ด์—ˆ๋‹ค. ๋‚˜๋„ ์ฒ˜์Œ ๋ฐฐ์›Œ์„œ ์ดˆ๋ณด์˜€๊ณ  ๋ˆ„๋‚˜๋„ ์ฒ˜์Œ์ด๋‹ค ๋ณด๋‹ˆ ์†”์งํžˆ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋Š” ๋ง‰๋ง‰ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹ค๋ฅธ ํŒ€์— ํ•ฉ๋ฅ˜ํ•ด์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ์—ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ๊ฐ™์ด ํ•˜์ž๊ณ  ํ•ด์„œ ๋งˆ์Œ ์† ๋ถ€๋‹ด๊ฐ์„ ๋œ์–ด๋‚ด๊ธฐ ์œ„ํ•ด ๋œ์ฉ ๊ฐ™์ดํ•˜๊ณ  ์‹ถ์—ˆ๋‹ค.
 
ํ•˜์ง€๋งŒ, 
 
๊ฒฐ๊ตญ ์Šค์Šค๋กœ ์„ฑ์žฅํ•˜๊ณ  ์ผ์–ด๋‚˜์•ผ ํ•œ๋‹ค๋Š” ์ƒ๊ฐ๊ณผ ์‹ค์ œ๋กœ ์ด๋Ÿฐ ์ผ์ด ์‚ฌํšŒ์— ๋‚˜๊ฐ€์„œ๋„ ์•ˆ ์ผ์–ด๋‚˜๋Š” ๋ฒ•์€ ์—†๋‹ค๋Š” ํŒ๋‹จํ•˜์—, ์ด๋ฒˆ์—๋Š” ๋งจ๋•…์— ํ—ค๋”ฉ์„ ํ•ด๋ณด์ž ํ•˜์˜€๋‹ค. ์ด๋•Œ ํ•ด๋ณด์ง€ ์–ธ์ œ ํ•ด๋ณด๊ฒ ๋‚˜ ๋ผ๋Š” ์ƒ๊ฐ์ด์—ˆ๋‹ค. ๋ˆ„๋‚˜๋„ ๊ฐ™์€ ์ƒ๊ฐ์ด์—ˆ๋‹ค.
 
์šฐ๋ฆฌ๋Š” ๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” ๋ถ€์กฑํ•ด ๋ณด์ผ์ง€๋Š” ๋ชฐ๋ผ๋„, ์ด๋ฒˆ ์ฃผ์— ๋ฐฐ์šด React ๋‚ด์šฉ์„ ๋ณต์Šตํ•˜๋ฉด์„œ ๋‚ด๊ฒƒ์œผ๋กœ ๋งŒ๋“œ๋Š” ์ทจ์ง€ํ•˜์— ํ”„๋กœ์ ํŠธ๋ฅผ ์„ ์ •ํ•˜๊ณ  ์ง„ํ–‰ํ•˜์˜€๋‹ค.
 
ใ…‹ใ…‹ใ…‹ใ…‹ ํ•˜์ง€๋งŒ, ์—ญ์‹œ ์‰ฝ์ง€ ์•Š์•˜๋‹ค. ๋ญ”๊ฐ€ ๋‚จ๋“ค์€ ์ž˜ํ•˜๊ณ  ์žˆ๋Š”๊ฑฐ ๊ฐ™๊ณ  ์šฐ๋ฆฌ๋Š” ์ž˜ํ•˜๊ณ  ์žˆ๋Š”์ง€ ์˜๋ฌธ์ด ๋“ค์—ˆ๋‹ค. ๋‹ค๋ฅธ ํŒ€์— ํ•ฉ๋ฅ˜ ํ–ˆ์—ˆ์–ด์•ผ ํ–ˆ๋‚˜? ๋ผ๋Š” ์ƒ๊ฐ์„ 0.5๋ฒˆ ํ–ˆ๋‹ค ใ…‹ใ…‹ (ํ•˜๋‹ค ๋ง์•˜๋‹ค๋Š” ๋œป) 
 
๋‚˜๋ž‘ ๊ฐ™์ด ํ•˜๋Š” ๋ˆ„๋‚˜๋„ ๋ธ”๋กœ๊ทธ๋ฅผ ์ž˜ ์“ฐ๋Š”๋ฐ, ์„œ๋กœ ๋ธ”๋กœ๊ทธ์— ๋ช…์–ธ์ด ์žˆ์—ˆ๋‹ค.
 
๋‚˜

์‹œ์ž‘์€ ๋‹ค ๊ทธ๋Ÿฐ๊ฑฐ๋‹ค. ํฌ๊ธฐ๋งŒ ์•ˆ ํ•˜๋ฉด ๋˜๋Š”๊ฑฐ๋‹ค. 


๋ˆ„๋‚˜
 

๋‚จ๋“ค๊ณผ ๋น„๊ตํ•˜์ง€ ๋ง์ž


 
ใ…‹ใ…‹ใ…‹ใ…‹ ์ด๋ ‡๊ฒŒ ๋‘˜์ด ํ–ˆ๋˜ ๋ช…์–ธ์„ ํ•ฉ์ณ์„œ ์„œ๋กœ ์ขŒ์ ˆํ•˜๊ธฐ ์ „์— ๋งํ•ด์คฌ๋‹ค ใ…‹ใ…‹ใ…‹ ๊ฝค๋‚˜ ํšจ๊ณผ์ ์ด์—ˆ๋‹ค?
*๊ทธ๋‚  ์„œ๋กœ ๋ฐค์ƒŒ๋‹ค๊ณ  ํ–ˆ๋Š”๋ฐ 2์‹œ ์ดํ›„๋กœ ์—ฐ๋ฝ์ด ๋‹ฟ์ง€ ์•Š์•˜๋‹ค.
 
๊ฒฐ๊ตญ, ์ „์ฒด์ ์œผ๋กœ ์™„์„ฑ์„ ํ–ˆ๊ณ  Todos์™€ ํฐ ์ฐจ์ด๋Š” ์—†์ง€๋งŒ, ์šฐ๋ฆฌ ๋‘˜์ด๊ฐ€ ํ•ด๋‚ธ ์ฒซ ํ”„๋กœ์ ํŠธ์˜€๋‹ค. ใ…Žใ…Ž
 
๊ทธ๋ฆฌ๊ณ  ๋‹ค์Œ๋‚ , ์ปด๊ณต ๋™์ƒ์ด ์™€์„œ ์ด์˜๊ฒŒ ๊พธ๋ฉฐ ์ฃผ์—ˆ๋‹ค !! ๋ณ„ํ‘œ๋ฅผ ๋ˆŒ๋ฆฌ๋ฉด ์ตœ์ƒ๋‹จ์œผ๋กœ ๊ฐ€๊ฒŒ ํ•ด์„œ ๋ฐฉ๋ช…๋ก์„ ์ข€ ๋” ์žฌ๋ฐŒ๊ฒŒ ๋งŒ๋“ค์–ด์คฌ๋‹ค.
์—ญ์‹œ ๋ฏฟ๋Š” ๋™์ƒ์ด๋‹ค ใ…Žใ…Ž ์šฐ๋ฆฌ๋Š” ์ƒ๊ฐ๋งŒ ํ–ˆ์ง€ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”์ง€๋Š” ์–ด๋ ค์›€์ด ์žˆ์—ˆ๋Š”๋ฐ ๋™์ƒ์€ ์ฒ™์ฒ™ํ•˜๋”๋ผ. ใ…Žใ…Ž ๋‚˜๋„ ๊พธ์ค€ํžˆ ์„ฑ์žฅํ•ด์„œ ๋š๋”ฑ๋š๋”ฑ ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ณ ์‹ถ๋ .!!
 
๊ทธ๋ ‡๊ฒŒ ์ ์‹ฌ ์‹œ๊ฐ„์—๋„ ์‹œ๊ฐ„์„ ํˆฌ์žํ•ด์„œ Readme ๊นŒ์ง€ ์ž‘์„ฑํ•œ ํ›„, ๋ˆ„๋‚˜๊ฐ€ ๋ฐœํ‘œ๋ฅผ ํ–ˆ๋‹ค. ๋‚˜๋ฆ„ ์„ฑ๊ณต์ ์ด์—ˆ๋‹ค! ์ฒซ ๋งจ๋•…์˜ ํ—ค๋”ฉ์ด์—ˆ์ง€๋งŒ, ๋‚˜๋ฆ„ ์˜๋ฏธ ์žˆ๋Š” ์‹œ๊ฐ„์ด์—ˆ๋‹ค. ์ด ๋•Œ์˜ ๊ฒฝํ—˜๊ณผ ๋А๊ผˆ๋˜ ๊ฐ์ •์„ ์žŠ์ง€ ์•Š๊ณ  ๋‹ค์Œ ์„ฑ์žฅ์„ ์œ„ํ•œ ๋ฐœํŒ์œผ๋กœ ๋งˆ๋ จํ•ด์•ผ๊ฒ ๋‹ค ใ…Žใ…Ž
 
์ตœ์ข… ๊ฒฐ๊ณผ๋ฌผ : https://github.com/woorifisa-service-dev-2nd/frontend-3rd-Memo

 

GitHub - woorifisa-service-dev-2nd/frontend-3rd-Memo

Contribute to woorifisa-service-dev-2nd/frontend-3rd-Memo development by creating an account on GitHub.

github.com

 
 
 

์—ฌ๊ธด ์šฐ๋ฆฌ์ง‘ ์•ž ๊ณต์› ํšจ์› ๊ณต์›์ด๋‹ค. ๊ณง ํฌ๋ฆฌ์Šค๋งˆ์Šค์ธ๋ฐ ๋ˆˆ์ด ์ด๋ ‡๊ฒŒ ๋‚ด๋ ค ์Œ“์—ฌ์žˆ๋‹ค. ์ƒˆ๋ฒฝ ์ถœ๊ทผ๋Ÿฌ๋Š” ๋ˆˆ์ด ์™”๋‹ค๋Š” ๊ธฐ์จ๋ณด๋‹จ, ์•„์นจ์— ๋œ๋œ ๋–จ ์ƒ๊ฐ์— ๊ฑฑ์ •์ด ์•ž์„ ๋‹ค ใ…‹ใ…‹ใ…‹ใ…‹ ๊ทธ๋ž˜๋„ ์ด๊ฒจ๋‚ด์•ผ์ง€ ์–ด์ฉŒ๊ฒ ์–ด
 
1. ์ด๋ฒˆ ์ฃผ ๋ฐฐ์šด ๊ฒƒ
์ด๋ฒˆ ์ฃผ๋Š” React๋ฅผ ํ™œ์šฉํ•ด์„œ Todos๋ฅผ ๋งŒ๋“ค์–ด๋ณด๋Š” ์‹œ๊ฐ„์„ ๊ฐ€์กŒ๋‹ค. 
๊ทธ ์ค‘์— ๊ฐ€์žฅ ๋งŽ์ด ๊ณ ๋ คํ•  ์‚ฌํ•ญ์€ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์„ฑ์ด์—ˆ๊ณ  ์ƒˆ๋กœ์šด ์ง€์‹์€ hook๊ณผ Context API ์˜€๋‹ค.
๊ธฐ๋Šฅ์ ์ธ ๋ถ€๋ถ„์—์„œ๋Š” modal ์ฐฝ ์ƒ์„ฑ์ด๋‹ค.
 
์ปดํฌ๋„ŒํŠธ ๊ตฌ์„ฑ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ
์ปดํฌ๋„ŒํŠธ ๊ตฌ์„ฑ์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์žฌ์‚ฌ์šฉ์„ฑ์ด๋‹ค. ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž˜ ๊ตฌ์„ฑํ•ด์„œ ๋ถ„๋ฅ˜ํ•ด ๋†“๋Š”๋‹ค๋ฉด ํ‹€์€ ์œ ์ง€ํ•œ ์ฑ„ ๋‚ด์šฉ๋งŒ  ๋ฐ”๊พธ๋ฉด์„œ ์žฌ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋Ÿฐ ๊ฒƒ์„ ๊ณ ๋ คํ•ด์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.
 
Hook
useEffect 
useState 
useReducer
 
useEffect
useEffect๋Š” ๋ถ€์ˆ˜ํšจ๊ณผ๋ผ๊ณ ๋„ ํ•œ๋‹ค. ์ฆ‰, ์–ด๋–ค ๊ฒƒ์˜ ๋ณ€ํ™”๊ฐ€ ์žˆ๋‹ค๋ฉด ์ž๋™์ ์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค.

useEffect(() => {
	if (enteredTodoFormIsNotEmpty(title, summary)) {
		setInvalid(false);
	} else {
		setInvalid(true);
	}	
}, [title, summary]);

 
์ด ์ฝ”๋“œ์—์„œ ๋ณด๋ฉด title, summary๊ฐ€ ๋ณ€ํ™”ํ•˜๋ฉด ์ž๋™์ ์œผ๋กœ ๋‚ด๋ถ€ ํ•จ์ˆ˜๊ฐ€ ๋Œ์•„๊ฐ„๋‹ค.
 
 
useReducer
useReducer๋Š” useState๋ฅผ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ๋Š” ํ›…์ด๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ component๋ฅผ ๊ด€๋ฆฌํ•  ๋•Œ, useState๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋‚˜, ๋‚ด์šฉ์ด ๋ณต์žกํ•ด์ง€๋ฉด useReducer๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

const [todos, dispatch] = useReducer(reducer, { data: dummyTodos, category: 'ALL' });

์ด๋ ‡๊ฒŒ ํ•ด๋†“์œผ๋ฉด reducer์˜ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ์ธ์ž๋Š” ์ดˆ๊ธฐ ๊ฐ’์ด๋‹ค.
 
๊ทธ๋ฆฌ๊ณ  reducer๋ฅผ ํ•จ์ˆ˜๋กœ ์ •์˜ํ•œ๋‹ค.

const reducer = (todos, action) => {
const { data, category } = todos;

	switch (action.type) {
		case 'ADD':
		const { newTodo } = action;
		return { data: [...data, newTodo], category };

        case 'UPDATE':
        const { updateTodo } = action;
        const updatedTodos = data.map(todo => todo.id === updateTodo.id ? { ...updateTodo } : todo);
        return { data: updatedTodos, category }

        case 'DELETE':
        const { id } = action;
        const deletedTodos = data.filter(todo => todo.id !== id);
        return { data: deletedTodos, category }

        case 'FILTER':
        return { data, category: action.selectedCategory }
	}

}

reducer์˜ ์ธ์ž์ค‘ todos๋Š” ํ˜„์žฌ ์ƒํƒœ์ด๊ณ  action์€ ํ–ฅํ›„, dispatch๋ฅผ ํ™œ์šฉํ•ด์„œ ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ๊ทธ ๊ฐ์ฒด๊ฐ€ ๋“ค์–ด๊ฐ€๋Š” ์œ„์น˜์ด๋‹ค.
 

<select className="p-2 text-gray-100 bg-gray-800 rounded"
	data-cy="todo-filter"
	value={todos.category} onChange={(event) => dispatch({ type: 'FILTER', selectedCategory: event.target.value })}
>

 
์ด๋ ‡๊ฒŒ ์ตœ์ข…์ ์œผ๋กœ ์‚ฌ์šฉํ•  ๋•Œ dispatch(๊ฐ์ฒด) ๋ฅผ ์ฃผ์ž…ํ•˜๋ฉด ๊ฐ์ฒด๊ฐ€ action์— ๊ฐ€๊ณ  ํ˜„์žฌ ์ƒํƒœ์˜ ๊ฐ’์ธ todos์™€ ๋ณ‘ํ–‰ํ•ด์„œ ํ˜„์žฌ ์ƒํƒœ์˜ ๊ฐ’์„ ๋ณ€ํ˜•์‹œํ‚จ๋‹ค.
 
์•„์ง ์ด๊ฒƒ์˜ ํ™œ์šฉ์ด ์‰ฝ์ง€๋Š” ์•Š์ง€๋งŒ useState ์ฒ˜๋Ÿผ ํ•˜๋‚˜๋งŒ์˜ ๋ณ€ํ™”๊ฐ€ ์•„๋‹Œ ์—ฌ๋Ÿฌ๊ฐœ๊ฐ€ ํ•œ ๊บผ๋ฒˆ์— ๋ณ€ํ™”ํ•˜๋Š” ํ˜•ํƒœ๋ผ๋ฉด ์ฝ”๋“œ useReducer๋ฅผ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ฝ”๋“œ์˜ ๊น”๋”ํ•  ๊ฒƒ์ด๋‹ค.
 
์ง€๊ธˆ์€ ์ œ๋Œ€๋กœ ์ด์šฉ ๋ชปํ•˜๋”๋ผ๋„ ์•Œ๊ณ ๋Š” ์žˆ์ž. ์–ด๋А ์ˆœ๊ฐ„ ๋‚ด๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์“ฐ๊ณ  ์žˆ๊ฒ ์ง€ ใ…Žใ…Ž
 
 
Context API 

๊ธฐ๋ณธ์ ์œผ๋กœ React์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Props๋ฅผ ํ†ตํ•ด ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•œ๋‹ค.

์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ค‘์ฒฉ๋œ ์ •๋„๊ฐ€ 2~3๊ฐœ ์ •๋„๋ฉด Props๋ฅผ ํ™œ์šฉํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, 4~5๊ฐœ ์ด์ƒ ์ค‘์ฒฉ๋œ ๊ตฌ์กฐ์ผ ๊ฒฝ์šฐ์—๋Š” ๊ด€๋ฆฌ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค.

์ด์ฒ˜๋Ÿผ ์ปดํฌ๋„ŒํŠธ๊ฐ€ 4~5๊ฐœ ์ด์ƒ ์ค‘์ฒฉ๋˜์–ด Props๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์„ ๋งˆ์น˜ ๋“œ๋ฆด์„ ํŒŒ๊ณ  ๋‚ด๋ ค๊ฐ€๋Š” ๊ฒƒ ๊ฐ™๋‹ค๊ณ  ํ•˜์—ฌ Props Drilling ํŒจํ„ด์ด๋ผ๊ณ ํ•œ๋‹ค.

 

์‚ฌ์šฉ ๋ฐฉ์‹

 

1. ์šฐ์„  createContext()๋ฅผ ๊ฐ€์ ธ์˜จ๋‹ค.

import { createContext } from "react";

export const TodoContext = createContext(); // Todos ๋ฐ์ดํ„ฐ ์ œ๊ณต ์šฉ๋„์˜ Context
export const TodoDispatchContext = createContext(); // Todos Dispatch() ์ œ๊ณต ์šฉ๋„์˜ Context

 

 
2. ์ด์ œ ์ด๋ฅผ ํ™œ์šฉํ•  ๊ณณ์„ ๋ฎ๋Š”๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ „์—ญ์œผ๋กœ ์‚ฌ์šฉํ•  ๊ฐ์ฒด๋ฅผ ๋„ฃ๋Š”๋‹ค.

<TodoContext.Provider value={todos}>
	<TodoDispatchContext.Provider value={dispatch}>
		{children}
	</TodoDispatchContext.Provider>
</TodoContext.Provider>

 
 
3. ์‚ฌ์šฉํ•˜๊ณ ์žํ•˜๋Š” ์œ„์น˜์—์„œ useContext๋ฅผ import ํ•œ๋‹ค.

import { useContext} from "react";

 
 
4. ์‚ฌ์šฉ ํ•˜๊ณ ์žํ•˜๋Š” Context๋ฅผ useContext() ์•ˆ์— ๋‹ด๊ณ , ์ฝ๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์œผ๋กœ ์ถ”์ƒํ™” ํ•œ๋‹ค.

// ์ฝ๊ธฐ ์‰ฌ์šด ์ด๋ฆ„์œผ๋กœ ์ถ”์ƒํ™”
export const useTodos = () => useContext(TodoContext);
export const useTodosDispatch = () => useContext(TodoDispatchContext);

 
 
5. ์‚ฌ์šฉํ•˜๋Š” Component์— import ํ•ด์„œ ์ ์šฉํ•œ๋‹ค.

const TodoBody = () => {
	const todos = useTodos();
	const filterTodos = (todos, selectedCategory) => selectedCategory === 'ALL' ? todos : todos.filter(todo => todo.category === selectedCategory);
	const filteredTodos = filterTodos(todos.data, todos.category);

	return (
		<ul className='px-0 my-8'>
			{filteredTodos.map((todo,index) => <TodoItem todo={todo} key={index}/>)}
		</ul>
		)
}


๋จผ๊ฐ€ ๋ณต์žกํ•œ๊ฑฐ ๊ฐ™์ง€๋งŒ, ์ต์ˆ™ํ•ด์ง€๋ฉด ๊ดœ์ฐฎ์„ ๊ฑฐ ๊ฐ™๋‹ค.


 
Modal ์ฐฝ ์ƒ์„ฑ

{isOpen && createPortal(
	<Modal onClose={closeModal}>
		<TodoForm onClose={closeModal}>New Todo</TodoForm>
	</Modal>,
	document.body)}


Modal ์ฐฝ์„ ๋„์šธ ๋•Œ ๋งˆ์ง€๋ง‰์— document.body๊ฐ€ ์žˆ๋Š”๋ฐ ์ด๋Š” html๋ฌธ์„œ์— ๋ฐ”๋”” ๋ถ€๋ถ„์— ์˜ฌ๋ฆฌ๊ฒ ๋‹ค๋Š” ๋œป์ด๋‹ค. 
 

<div id="root"></div>

์›๋ž˜ ์ด๊ณณ์— ๋„ฃ๊ณ  ์žˆ์—ˆ๋Š”๋ฐ ๋ฐ”๊นฅ์ชฝ์œผ๋กœ ๋„์šฐ๊ฒ ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
 
 
 
2. ์ด๋ฒˆ ์ฃผ์— ๊ฒช์€ ์‹œํ–‰์ฐฉ์˜ค์™€ ๊ทน๋ณต
 
์ด ๋ฒˆ์ฃผ๋Š” ํ™•์‹คํžˆ ๋ˆ„๊ตฌ์˜ ๋„์›€์„ ์ตœ์†Œํ™”ํ•˜๊ณ  ์Šค์Šค๋กœ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ํ•˜๋ ค๊ณ  ํ–ˆ๋˜ ๋งˆ์Œ๊ฐ€์ง๊ณผ ์‹ค์ฒœ์ด์—ˆ๋˜๊ฑฐ ๊ฐ™๋‹ค. ์ด์ „์—๋Š” ์ž˜ํ•˜๋Š” ๋™๋ฃŒ์˜ ๋„์›€์ด ์žˆ์–ด ํ”„๋กœ์ ํŠธ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ค์šด ๊ฒƒ์€ ์•„๋‹ˆ์—ˆ๋‹ค(๋ฌผ๋ก , ์–ด๋ ค์šด๊ฑด ๋งž๋‹ค) ๊ทธ๋Ÿฐ๋ฐ ์ด๋ฒˆ์—๋Š” ์ตœ์†Œํ™”๋ฅผ ํ†ตํ•ด์„œ ๋„์ „์„ ํ•ด๋ณด์•˜๋‹ค. ์—ญ์‹œ๋‚˜ ใ…‹ใ…‹ ์‰ฝ์ง€๊ฐ€ ์•Š์•˜๋‹ค. ๊ทธ๋ž˜๋„ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ชปํ•˜๊ฒ ๋‹ค๋Š” ์ƒ๊ฐ์„ ์ž˜ ๋‹ฌ๋ž˜๊ณ  ๋‹ฌ๋ž˜์„œ ๊ฒฐ๊ตญ ํ•˜๋‚˜์”ฉ ํ•ด๊ฒฐํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค. ๋น„๋ก ์ดˆ๋ณด ๋‘๋ช…์ด์—ˆ์ง€๋งŒ, ์„œ๋กœ ๋„์›€์„ ์ฃผ๋ฉฐ ํ•ด๊ฒฐํ•ด ๋‚˜๊ฐ”๋‹ค!! ๊ทธ๋ฆฌ๊ณ  ๋งˆ์ง€๋ง‰์—๋Š” ์ปด๊ณต ๋™์ƒ์ด ์™€์„œ ์šฐ๋ฆฌ์˜ ํ”„๋กœ์ ํŠธ์— ์กฐ๊ธˆ ๋” ํ™œ๋ ฅ์„ ๋„ฃ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ด๋•Œ ๋А๋‚€ ๊ฐ์ •๊ณผ ๊ฒฝํ—˜ ์žŠ์ง€ ์•Š๊ณ  ์„ฑ์žฅ์˜ ๋ฐœํŒ์œผ๋กœ ์‚ผ๊ฒ ๋‹ค.
 
๊ทธ๋ฆฌ๊ณ  todos๋ฅผ ๋งŒ๋“ค๋ฉด์„œ ํ—ท๊ฐˆ๋ฆฌ๋Š” ๋ถ€๋ถ„๋„ ๋งŽ์•˜๋‹ค. ํ•˜์ง€๋งŒ ๋๊นŒ์ง€ ์ดํ•ดํ•˜๋ ค๊ณ  ํ•˜๊ณ  ํ˜น์—ฌ๋‚˜ ์ง€๊ธˆ์€ ์ดํ•ด๊ฐ€ ์™„๋ฒฝํ•˜์ง€ ์•Š๋”๋ผ๋„ ๊ณต๋ถ€์˜ ๋ˆ์„ ๊ฐ€์ง€๊ณ  ์ด์–ด๋‚˜๊ฐ„๋‹ค๋ฉด ์ด ์—ญ์‹œ ์ž˜ ๊ทน๋ณตํ•  ๊ฒƒ์ด๋‹ค.
 
3. ์•ž์œผ๋กœ ์–ด๋””์— ์ ์šฉ
 
React๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ข€๋” ์›น์„ ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Œ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” ์—ฌ๋Ÿฌ ์ด์œ ๋กœ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  ์ง„ํ–‰ํ–ˆ์—ˆ๋Š”๋ฐ, ํ–ฅํ›„์—๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ react๋ฅผ ์ข€ ๋” ํšจ๊ณผ์ ์œผ๋กœ ์ด์šฉํ•ด๋ณด๊ณ  ์‹ถ๋‹ค.
 
4. ํ˜„์žฌ๊นŒ์ง€์˜ ํ•™์Šต ํ‰๊ฐ€ ๋ฐ ๋‹ค์Œ ํ•™์Šต์„ ์œ„ํ•œ ๋‹ค์ง/๋ชฉํ‘œ
 
ใ…‹ใ…‹ใ…‹ใ…‹ ๋งค์ผ๋งค์ผ ์ƒˆ๋กœ์›€๊ณผ ๋™๋™๊ฑฐ๋ฆผ์˜ ์—ฐ์†์ด๋‹ค. ์ด์ œ ํ•œ ๋‹ฌ ์งธ์ธ๋ฐ ๋งŽ์€ ๊ฒƒ๋“ค์„ ๋ฐฐ์› ๊ณ , ํฌ๊ธฐํ•˜์ง€ ์•Š๊ณ  ๋๊นŒ์ง€ ์ดํ•ดํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ๋‹ค. ์ง€๊ธˆ์€ ์•„๋‹ˆ๋”๋ผ๋„ ๊ฒฐ๊ตญ์—๋Š” ์ต์ˆ™ํ•ด์ง€๊ณ  ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•  ๋‚ ์„ ๊ธฐ๋Œ€ํ•˜๋ฉฐ ๊ณ„์†ํ•ด์„œ ์—ด์‹ฌํžˆ ํ•ด์•ผ๊ฒ ๋‹ค !! 
 
ํ˜„์žฌ ์ •์ฒ˜๊ธฐ์™€ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๊ทธ๋ฆฌ๊ณ  ๋ณต์Šต์„ ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ๋‹ค์Œ ์ฃผ ๋ถ€ํ„ฐ๋Š” ๊ธฐ์ˆ  ์„ธ๋ฏธ๋‚˜๋ฅผ ์œ„ํ•ด ๋”์šฑ ์ฒ ์ €ํžˆ ์›€์ง์—ฌ์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด๋‹ค. ์กฐ๊ธˆ ๋” ๋‚˜๋ฅผ ์ฒด๊ณ„์ ์œผ๋กœ ๋ณ€ํ™”์‹œํ‚ค๊ณ , ๋ชธ์„ ๋ง๊ฐ€๋œจ๋ฆฌ๋Š” ์ผ์€ ์ž์ œํ•ด์•ผ๊ฒ ๋‹ค.
 
๊พธ์ค€ํ•˜์ž.