Skip to content

Latest commit

ย 

History

History
333 lines (229 loc) ยท 18.2 KB

week3.md

File metadata and controls

333 lines (229 loc) ยท 18.2 KB

โ–ถ๏ธย ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ

๐Ÿต ๊ฐœ์ธ์ ์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋Šฅ๋ ฅ ์ค‘ ํ•˜๋‚˜๊ฐ€ ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ, ๋ชจ๋“ˆํ™” ๋ผ๊ณ  ์ƒ๊ฐํ•œ๋‹ค!

์ปดํฌ๋„ŒํŠธ๋Š” ๋ฆฌ์•กํŠธ ์›น์„ ๊ตฌ์„ฑํ•˜๋Š” ๋‹จ์œ„์ธ ๋งŒํผ ํ•œ๊ฐ€์ง€์˜ ์—ญํ• ๋งŒ ํ•ด์•ผํ•œ๋‹ค

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ ์ตœ๋Œ€ํ•œ ์ชผ๊ฐœ์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์„ฑ๋Šฅ์ƒ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค.

๋ชจ๋“ˆํ™”์˜ ํ•ต์‹ฌ์€ ์žฌ์‚ฌ์šฉ์„ฑ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๐Ÿ™‹โ€โ™€๏ธ ๊ทธ๋ ‡๋‹ค๋ฉด ์™œ ์žฌ์‚ฌ์šฉํ•  ๋‚ด์šฉ์„ ์ปดํฌ๋„ŒํŠธํ™” ํ•ด์ฃผ์–ด์•ผ ํ• ๊นŒ?

๊ฐ€์žฅ ๋‹จ์ ์ธ ์˜ˆ์‹œ๋กœ ํ•˜๋‚˜์˜ ์›น์•ฑ ๋‚ด์— ๋™์ผํ•œ ๋””์ž์ธ์˜ ๋ฒ„ํŠผ์ด ์ด๊ณณ ์ €๊ณณ์—์„œ ํ…์ŠคํŠธ๋งŒ ๋‹ฌ๋ฆฌํ•˜์—ฌ ์‚ฌ์šฉ๋  ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฐ๋ฐ, ํ•ด๋‹น ์„œ๋น„์Šค๊ฐ€ ๋ธŒ๋žœ๋”ฉ์„ ๋‹ค์‹œํ•˜๊ฒŒ ๋˜๋ฉด์„œ ๋””์ž์ธ ์‹œ์Šคํ…œ๋„ ๋‹ฌ๋ผ์ง€๊ฒŒ ๋  ๊ฒฝ์šฐ, ์›น ์•ฑ ๋‚ด์˜ ๋ชจ๋“  ๋ฒ„ํŠผ์˜ ๋””์ž์ธ๋„ ๋ณ€๊ฒฝ๋  ๊ฒƒ์ด๋‹ค.

์ด๋•Œ ๋ฒ„ํŠผ์„ ์ปดํฌ๋„ŒํŠธํ™”ํ•˜์ง€ ์•Š๊ณ  ๋งค๋ฒˆ ๊ฐ๊ธฐ ๋‹ค๋ฅธ element๋กœ ์ƒ์„ฑํ•ด๋‘์—ˆ๋‹ค๋ฉด, ๊ทธ ๋ชจ๋“  ๋ฒ„ํŠผ์„ ์ฐพ์•„๋‹ค๋‹ˆ๋ฉฐ ๊ฐ๊ฐ ๋””์ž์ธ์„ ๋ณ€๊ฒฝํ•ด์ฃผ์–ด์•ผ ํ•  ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, ๋งŒ์•ฝ ํ•˜๋‚˜์˜ ๋ฒ„ํŠผ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ์ด๊ณณ ์ €๊ณณ์—์„œ ์žฌ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๋‹ค๋ฉด,

๊ทธ ํ•˜๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ์˜ ์Šคํƒ€์ผ๋งŒ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด ๋™์‹œ์— ์›น์•ฑ ๋‚ด์˜ ๋ชจ๋“  ๋ฒ„ํŠผ์˜ ์Šคํƒ€์ผ์„ ๊น”๋”ํžˆ ์—…๋ฐ์ดํŠธ์‹œ์ผœ์ค„ ์ˆ˜ ์žˆ๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด, ์ปดํฌ๋„ŒํŠธ๋Š” ํ•œ๊ฐ€์ง€์˜ ์ผ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•˜๋Š” ์นœ๊ตฌ๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ฌถ์–ด๋‘” ๋ชจ๋“ˆ์ด๋‹ค !

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์„ Computer Science ์—์„œ๋Š” โ€˜๊ด€์‹ฌ์‚ฌ์˜ ๋ถ„๋ฆฌโ€™, Separation of Concerns (SoC) ๋””์ž์ธ ์›์น™์ด๋ผ๊ณ  ํ•œ๋‹ค.

์œ„์˜ ๋‚ด์šฉ์—์„œ ์ด์•ผ๊ธฐํ•œ ๊ฒƒ์— ๋”ฐ๋ผ,

๊ฒฐ๊ตญ ์ปดํฌ๋„ŒํŠธ ๋ถ„๋ฆฌ์˜ ๊ธฐ์ค€์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

โœ”๏ธย ํ•œ๊ฐ€์ง€์˜ ์—ญํ• ์„ ํ•˜๋Š”๊ฐ€?

โœ”๏ธย ๋ฐ˜๋ณต ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๊ฑฐ๋‚˜, ๋ฐ˜๋ณต ์‚ฌ์šฉ๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š”๊ฐ€?

โœ”๏ธย UI์™€ ๊ด€๋ จ๋œ ์ผ์„ ํ•˜๋Š”๊ฐ€? **๊ธฐ๋Šฅ(๋กœ์ง)**๊ณผ ๊ด€๋ จ๋œ ์ผ์„ ํ•˜๋Š”๊ฐ€?

์œ„์˜ ๊ธฐ์ค€์— ๋”ฐ๋ผ ๋‚˜์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋” ๋ถ„๋ฆฌ๋  ์ˆ˜ ์žˆ๋Š” ๊ธธ์ด ์žˆ๋Š”์ง€ ๋Š์ž„์—†์ด ๊ณ ๋ฏผํ•˜๋ฉฐ

๋ชจ๋“ˆํ™”ํ•˜๊ณ ์ž ๋…ธ๋ ฅํ•ด๋ณด์ž ! !


โ–ถ๏ธย ์ƒํƒœ๊ด€๋ฆฌ & Props Drilling

๐Ÿ™‹โ€โ™€๏ธ React์—์„œ ์ƒํƒœ๋ž€?

  • ์ปดํฌ๋„ŒํŠธ ๊ฐ„์— ์ด๋™๋˜๋Š”ย props์™€ ๋‹ฌ๋ฆฌ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด
  • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ™”๋ฉด ๋ Œ๋”๋ง์— ์˜ํ–ฅ์„ ๋ผ์นœ๋‹ค
  • ์‚ฌ์šฉ์ž์˜ ์ธํ„ฐ๋ž™์…˜์„ ํ†ตํ•ดย ๋™์ ์œผ๋กœ ๋ณ€ํ•˜๋Š”ย ๋ฐ์ดํ„ฐ

๐Ÿตย ์ƒํƒœ์˜ ์ข…๋ฅ˜

  • ์ง€์—ญ ์ƒํƒœ : ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ๋งŒ ๊ด€๋ฆฌ๋˜๋Š” ์ƒํƒœ
    • ex) Input์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๋ฐ›์•„ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒฝ์šฐ
  • ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์ƒํƒœ : ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋„˜๋‚˜๋“ค๋ฉฐ ๊ด€๋ฆฌ๋˜๋Š” ์ƒํƒœ
    • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ prop๋ฅผ ํ†ตํ•ด ์ „๋‹ฌํ•œ๋‹ค โ†’ ์—ฐ์†๋  ๊ฒฝ์šฐ โ€œProp Drillingโ€
    • ex) Modal์ฐฝ
  • ์ „์—ญ ์ƒํƒœ : ํ”„๋กœ์ ํŠธ ์ „์ฒด์— ์˜ํ–ฅ์„ ๋ผ์น˜๋Š” ์ƒํƒœ

๐Ÿตย ํด๋ผ์ด์–ธํŠธ ์ƒํƒœ vs ์„œ๋ฒ„ ์ƒํƒœ

Client State Server State
์œ„์น˜ ํด๋ผ์ด์–ธํŠธ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ์„œ๋ฒ„๋‚˜ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์†Œ์Šค์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ
์ ‘๊ทผ์„ฑ ํด๋ผ์ด์–ธํŠธ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ ์ ‘๊ทผ ๊ถŒํ•œ์ด ์žˆ๋Š” ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ ์ ‘๊ทผ ๊ฐ€๋Šฅ
๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ด€๋ฆฌ
(Redux, Recoil ๋“ฑ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ)
์„œ๋ฒ„์—์„œ ๊ด€๋ฆฌ
(๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ฌ์šฉ)
์ง€์†์„ฑ ์„ธ์…˜ ๊ฐ„์— ํ•„์—ฐ์ ์œผ๋กœ ์ง€์†๋˜์ง„ ์•Š์Œ ์ผ๋ฐ˜์ ์œผ๋กœ ์„ธ์…˜ ๊ฐ„์— ์ง€์†์„ฑ ์œ ์ง€
๋„คํŠธ์›Œํฌ ์š”์ฒญ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•˜๋ ค๋ฉด ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Œ ๋ฐ์ดํ„ฐ ์ ‘๊ทผ ๋˜๋Š” ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•ด ๋„คํŠธ์›Œํฌ ์š”์ฒญ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Œ
๋ณด์•ˆ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๊ณ  ๋ณด์•ˆ ์ˆ˜์ค€์ด ๋‚ฎ์Œ ์ธ์ฆ ๋ฐ ์•”ํ˜ธํ™”๋กœ ๋ณดํ˜ธํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋” ์•ˆ์ „
์„ฑ๋Šฅ server state์— ๋น„ํ•ด ์†๋„ ๋น ๋ฆ„ client state์— ๋น„ํ•ด ์†๋„ ๋Š๋ฆผ
ํ™•์žฅ์„ฑ ํด๋ผ์ด์–ธํŠธ ๊ธฐ๊ธฐ ์šฉ๋Ÿ‰์ด ์ œํ•œ์ ์ด์–ด์„œ ํ™•์žฅ์„ฑ์ด ๋‹ค์†Œ ๋–จ์–ด์ง ์ „์šฉ ์„œ๋ฒ„๋‚˜ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ ๊ด€๋ฆฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์šฉ๋Ÿ‰์ด ์ปค์„œ ํ™•์žฅ์„ฑ์ด ๋น„๊ต์  ๋†’์Œ
์˜ˆ์‹œ ์ปดํฌ๋„ŒํŠธ state, Redux state, ๋ธŒ๋ผ์šฐ์ € ์ฟ ํ‚ค DB ๋ ˆ์ฝ”๋“œ, API ์‘๋‹ต, ์„œ๋ฒ„ ์„ธ์…˜ ๋ฐ์ดํ„ฐ

๐Ÿตย Props Drilliing

  • props๋ฅผ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฑฐ์น˜๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค.

    ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ โ†’ ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ1 โ†’ ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ 2โ†’ โ€ฆ โ†’ ์ตœ์ข… ์ปดํฌ๋„ŒํŠธ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ตœ์ข… ์ปดํฌ๋„ŒํŠธ๋กœ props๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด ์ค‘๊ฐ„ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ฑฐ์นœ๋‹ค.

  • ์ด depth๊ฐ€ ๊นŠ์–ด์งˆ ์ˆ˜๋ก ์ƒํƒœ๋ฅผ ์ถ”์ ํ•˜๊ธฐ ์–ด๋ ค์›Œ์ง€๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์กฐ๊ฑด props drilling์˜ ๋ฐฉ๋ฒ•์œผ๋กœ props๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ๋ณด๋‹ค props๋“ค์ด ๋ถˆํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ๊ฑฐ์น˜์ง€ ์•Š๋„๋ก ์„ค๊ณ„ํ•˜๊ฑฐ๋‚˜, ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜๋‹ค.

๐Ÿตย ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ์ž

์„œ๋กœ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ! ํ•ด๋‹น ์ƒํƒœ๋ฅผ ๊ด€๋ฆฌํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.

๐Ÿ™‹โ€โ™€๏ธ ์™œ?

์„œ๋กœ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•, ํ•ด๋‹น ๋ฐ์ดํ„ฐ์˜ ์ถœ์ฒ˜๊ฐ€ ๋™์ผํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ž˜์•ผ ์„œ๋กœ์˜ ๋ณ€ํ™”์— ๋™์ ์œผ๋กœ ๋ฐ˜์‘ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ฆ‰ **์ƒํƒœ์˜ ์ผ๊ด€์„ฑ (=โ€๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑโ€)**์„ ์ž˜ ์ง€์ผœ์•ผ ํ•œ๋‹ค.

**โ€œSingle Source of Truthโ€**์ด๋ผ๋Š” ๋ฐฉ๋ฒ•๋ก ์ด ์ด๋Ÿฌํ•œ ์ƒํƒœ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๋ฐฉ๋ฒ•๋ก ์ธ๋ฐ, ๋ง๊ทธ๋Œ€๋กœ ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š”ย ๋‹จ์ผ ์ถœ์ฒ˜๋ฅผ ๋งํ•œ๋‹ค.

์ด ๋ฐฉ๋ฒ•๋ก ์ด React๊ฐ€ ํƒํ•œ ๋ฐฉ๋ฒ•๋ก ์œผ๋กœ, ๊ฒฐ๊ตญ React์—์„œ ์ƒํƒœ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•œ ์ด์œ ๋Š” ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ์„ ์œ„ํ•ด์„œ, ์„œ๋กœ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์— ๋ถ„ํฌ๋˜์–ด์žˆ๋Š” ํ•˜๋‚˜์˜ ๋ฐ์ดํ„ฐ๊ฐ€ ์„œ๋กœ ์ผ์น˜ํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ด€๋ฆฌํ•ด์ฃผ๊ธฐ ์œ„ํ•จ์ด๋‹ค.

๐Ÿตย ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

Props Driling์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋„๋ก, ์ƒํƒœ๊ฐ€ ํšจ๊ณผ์ ์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋„๋ก ํšจ์œจ์ ์ธ ์„ค๊ณ„๋ฅผ ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ค‘์š”ํ•˜์ง€๋งŒ,

๋งŒ์•ฝ ์ตœ์„ ์„ ๋‹คํ•ด ์„ค๊ณ„ํ•ด๋„ ์–ด์ฉ” ์ˆ˜ ์—†์ด ๋ถˆํ•„์š”ํ•œ Props Drilling์ด ๋งŽ์ด ๋ฐœ์ƒํ•  ๊ฒฝ์šฐ ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์ข‹๋‹ค.

์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Client State / Server State์— ๋”ฐ๋ผ ๋ถ„๋ฅ˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋Œ€ํ‘œ์ ์ธ ๋ช‡๊ฐ€์ง€์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž.

๐Ÿ’ก Client State Library - Context API

  • ๊ตฌ์„ฑ์š”์†Œ
    • Context : ์ „์—ญ ์ƒํƒœ ์ €์žฅ์†Œ.
      • Context์— Provider์™€ Consumer๊ฐ€ ์ €์žฅ๋˜์–ด์žˆ์Œ
      • Consumer์—๋Š” Context๋ฅผ ํ†ตํ•ด ์ ‘๊ทผ ๊ฐ€๋Šฅ
    • Provider : ์ „์—ญ ์ƒํƒœ ์ œ๊ณต์ž.
      • ์ €์žฅ์†Œ์ธ Context์— ์ƒํƒœ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•จ
      • ์ƒํƒœ๋ฅผ ์ œ๊ณต๋ฐ›๊ณ ์ž ํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” Provider ํ•˜์œ„์— ์žˆ์–ด์•ผํ•จ
      • ๋”ฐ๋ผ์„œ ์ „์—ญ ์ƒํƒœ๋กœ ์“ธ ๊ฒฝ์šฐ, Provider๋Š” App.jsx๊ฐ™์€ ๋ฃจํŠธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋œ๋‹ค.
    • Consumer : ์ „์—ญ ์ƒํƒœ ์‚ฌ์šฉ์ž
  • ๋‹จ์  :
    • ๋ฒ”์œ„๋ฅผ ์ž˜ ์ •์˜ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ์ผ์œผํ‚จ๋‹ค

๐Ÿ’ก Client State Library - Redux

  • ์ค‘์•™ ์ง‘์ค‘์‹ Storage์™€ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ์œ„ํ•œ Reducer๋ฅผ ์‚ฌ์šฉํ•จ
  • ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋”ฐ๋ฅธ๋‹ค.
  • ์žฅ์  :
    • ์˜ค๋ž˜๋œ ๋งŒํผ ํƒ„ํƒ„ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ๊ฐœ๋ฐœ์ž ํ’€ ์กด์žฌ
    • ๊ฐœ๋ฐœ์„ ์ฒ˜์Œ ์‹œ์ž‘ํ•  ๋•Œ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ๊ต‰์žฅํžˆ ๋‹ค์–‘ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๊ฐœ๋ฐœ ์ค‘์— ์žˆ์–ด์„œ๋„ ๋ฒ„๊ทธ๊ฐ€ ์ƒ๊ธธ ๊ฒฝ์šฐ ํ•ด๊ฒฐํ•˜๊ธฐ๊ฐ€ ์‰ฌ์›€
    • ๋ฏธ๋“ค์›จ์–ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋น„๋™๊ธฐ, ๋กœ๊ทธ ์ž‘์—… ๋“ฑ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ ์ด ๋•Œ Redux๋ฅผ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋” ์‰ฝ๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
    • ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„์„ ๋”ฐ๋ผ์„œ Reducer ๋“ฑ์˜ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ๋น„๊ต์  ์‰ฌ์›€
  • ๋‹จ์  : ๋Œ€๋ถ€๋ถ„ ๊ตฌ์กฐ๊ฐ€ ๋„ˆ๋ฌด ๋ณต์žกํ•ด์„œ ๋ฌธ์ œ๊ฐ€ ์ƒ๊น€
    • ๊ฐ„๋‹จํ•œ ์›น์•ฑ์„ ๋งŒ๋“ค ๋•Œ์—๋„ Action, Reducer, Action Creator ๋“ฑ์˜ ์ฝ”๋“œ๋ฅผ ๋ชจ๋‘ ์ž‘์„ฑํ•ด์•ผ ํ•จ.
    • Recoil, MobX์™€๋Š” ๋‹ฌ๋ฆฌ State๊ฐ€ ๋ณ€๊ฒฝ ๋  ๋•Œ Component๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์ฃผ๋Š” ๋ฐ˜์‘ํ˜• ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ํƒ‘์žฌ๋˜์ง€ ์•Š์•„์„œ React์˜ ์ž์ฒด ๋ฉ”์ปคํ‹ฐ์ฆ˜์„ ํ™œ์šฉํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€์ ์ธ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ

๐Ÿ’ก Client State Library - Recoil

  • ๋น„๊ต์  ์ตœ๊ทผ์— ๋‚˜์˜จ ์ƒˆ๋กœ์šด ์ƒํƒœ ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • Facebook์‚ฌ์—์„œ ๊ฐœ๋ฐœ
  • ๊ฐ€์žฅ React์Šค๋Ÿฌ์šด ์ƒํƒœ๊ด€๋ฆฌ๋ผ๋Š” ์ฒ ํ•™์„ ๊ฐ–๊ณ ์žˆ์Œ
  • ์žฅ์  :
    • Redux, MobX์— ๋น„ํ•ด ๋” ๊ฐ„๋‹จํ•œ ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ ธ์„œ ์ดˆ์‹ฌ์ž๊ฐ€ ์‹œ์ž‘ํ•˜๊ธฐ์— ์ ๋‹นํ•˜๋ฉฐ, ์ž‘์€ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ ๊ณผ๋„ํ•œ ๋ณด์ผ๋Ÿฌ ํ”Œ๋ ˆ์ดํŠธ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Œ
    • component๊ฐ€ ๋ Œ๋”๋ง ๋˜๋Š” ์‹œ๊ธฐ, ์ƒํƒœ ๋“ฑ์„ ์„ธ๋ฐ€ํ•˜๊ฒŒ ์ œ์–ด ๊ฐ€๋Šฅ (์„ฑ๋Šฅ ์ตœ์ ํ™” ๋“ฑ์—๋„ ํ™œ์šฉ ๊ฐ€๋Šฅ)
    • Redux์™€๋Š” ๋‹ฌ๋ฆฌ Reactive ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํƒ‘์žฌํ•˜๊ณ  ์žˆ๊ธฐ์—, ๋™์ ์ธ ๊ธฐ๋Šฅ์„ ์กฐ๊ธˆ ๋” ์‰ฝ๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
  • ๋‹จ์  :
    • ์ตœ์‹  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค ๋ณด๋‹ˆ, ์‚ฌ์šฉ์ž ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ๋น„๊ต์  ๋นˆ์•ฝํ•จ โ†’ ์ด์Šˆ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ, ํ™€๋กœ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์ƒ๊ธธ ์ˆ˜๋„.
    • Recoil์˜ ์ƒํƒœ๊ด€๋ฆฌ ์ž์ฒด๊ฐ€ ๊ต‰์žฅํžˆ ์„ธ๋ถ„ํ™” ๋˜์–ด ์žˆ๊ธฐ์— ์ดˆ์‹ฌ์ž๊ฐ€ ์‹œ์ž‘ํ•˜๊ธฐ์—” ์‰ฝ๋”๋ผ๋„, ๋””๋ฒ„๊น… ํ•˜๊ฑฐ๋‚˜ ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ธฐ์— ์–ด๋ ค์šธ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ’ก Client State Library - MobX

  • Redux์˜ ์—ฌ๋Ÿฌ ์ ์„ ๋ณด์™„ํ•˜์—ฌ ๋‚˜์˜จ ์ƒํƒœ๊ด€๋ฆฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • Redux๋ณด๋‹ค ์กฐ๊ธˆ ๋” ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ด๋ฉฐ, Immutable.js ์™€ ๊ฐ™์€ ๋ถˆ๋ณ€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ตณ์ด ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ํŠน์ง•
  • ์žฅ์  :
    • Redux์— ๋น„ํ•ด ์ „์ฒด์ ์œผ๋กœ ์กฐ๊ธˆ ๋” ์‰ฌ์šด ๋Ÿฌ๋‹์ปค๋ธŒ๋ฅผ ๊ฐ€์ง
    • ๊ฐ์ฒด ์ง€ํ–ฅ์ ์ด๊ณ  ์บก์Šํ™”๋ฅผ ์ง€์›ํ•˜๊ธฐ์— ๊ฐœ๋ฐœ์ž ์นœํ™”์ ์ธ ํŽธ
    • Redux์—์„œ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ๋ฐ˜์‘ํ˜• ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•˜๊ธฐ์— ์กฐ๊ธˆ ๋” ์‰ฝ๊ฒŒ ๋™์  ์›น์•ฑ ์ œ์ž‘ ๊ฐ€๋Šฅ
  • ๋‹จ์  :
    • ์›น์•ฑ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด์„œ ๋กœ์ง์ด MobX์˜ ์ž๋™ ์—…๋ฐ์ดํŠธ์— ์˜์กดํ•˜๊ธฐ์— ๋””๋ฒ„๊น…์ด ์กฐ๊ธˆ ๋” ์–ด๋ ค์›Œ์งˆ ์ˆ˜ ์žˆ์Œ
    • Redux ๋งŒํผ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ํฌ์ง€ ์•Š์Œ
    • Validation ๊ตฌํ˜„์— ์žˆ์–ด ์ฝ”๋“œ๊ฐ€ ์กฐ๊ธˆ ๋ฒˆ์žก์Šค๋Ÿฝ๋‹ค๊ณ  ์•Œ๋ ค์ ธ ์žˆ์Œ

๐Ÿ’ก Server State Library - React Query

React์—์„œ ๋ฐ์ดํ„ฐ fetching๊ณผ ์บ์‹ฑ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐ„์†Œํ™”ํ•ด์ฃผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • ์™ธ๋ถ€(API ๋“ฑ)๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ fetching ๋ฐ ์—…๋ฐ์ดํŠธ ๊ณผ์ • ๊ฐ„์†Œํ™”
  • API ์š”์ฒญ์˜ ๋กœ๋”ฉ ๋ฐ ์˜ค๋ฅ˜ ์ƒํƒœ ๊ด€๋ฆฌ
  • ์บ์‹ฑ ์ž๋™ ๊ด€๋ฆฌ

Client์—์„œ API์™€ ํ†ต์‹ ์„ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ถ”๊ฐ€์ ์œผ๋กœ useEffect, useState๋ฅผ ํ•จ๊ป˜ ์“ฐ๋ฉด์„œ ๋ฐ์ดํ„ฐ๋ฅผ fetching ํ•ด์™”๋‹ค.

ํ•˜์ง€๋งŒ React Query๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋Ÿฌํ•œ ํ›…๋“ค์˜ ํ•„์š”์„ฑ์ด ์‚ฌ๋ผ์ง„๋‹ค.

React Query์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด์ž !

โœ”๏ธ React Query ์ฃผ์š” ๊ฐœ๋…

Query

  • API ์—”๋“œํฌ์ธํŠธ, DB ๋“ฑ์˜ ์›๊ฒฉ ๋ฐ์ดํ„ฐ ์†Œ์Šค๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ ์š”์ฒญ
  • useQuery ํ›… ์‚ฌ์šฉ

Mutation

  • ์„œ๋ฒ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธ
  • useMutation ํ›… ์‚ฌ์šฉ

Query Caching

  • Query ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ Query Invalidation
  • ์ฟผ๋ฆฌ๋ฅผ ์˜ค๋ž˜๋œ ์ƒํƒœ๋กœ ์—ฌ๊ฒจ ๋ฌดํšจํ™”

โœ”๏ธ useQuery ํ›…

๋ฐ์ดํ„ฐ Fetching ์šฉ

API ์—”๋“œํฌ์ธํŠธ๋‚˜ DB์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋น„๋™๊ธฐ์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋„๋ก ์„œ๋ฒ„์— ์š”์ฒญํ•˜๋Š” ๊ฒƒ

useQuery๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ

  • ์ปดํฌ๋„ŒํŠธ ์ตœ์ดˆ mount ์‹œ์— ๋ฐ์ดํ„ฐ๋ฅผ fetchingํ•ด์˜ค๊ณ ,
  • ์ดํ›„์˜ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ์— ๋Œ€ํ•ด์„œ๋Š” ์ž๋™ ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค. (๋ฐ์ดํ„ฐ refetching ์•ˆํ•ด์คŒ)

โœ”๏ธ useMutation ํ›…

API ์—”๋“œํฌ์ธํŠธ๋‚˜ DB์— ๋ฐ์ดํ„ฐ๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑ, ์ˆ˜์ •, ์‚ญ์ œ

โœ”๏ธ Query Caching

์›๊ฒฉ ์„œ๋ฒ„์™€ ํ†ต์‹ ํ•˜๋Š”๋ฐ์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•˜๊ณ ์ž,

์—ฌ๋Ÿฌ๋ฒˆ ๋ถˆ๋Ÿฌ์˜ฌ ๋ฐ์ดํ„ฐ๋Š” ์บ์‹œ์— ์ €์žฅํ•˜์—ฌ ๋ฐ˜๋ณตํ•ด์„œ ํ•„์š”๋กœ ํ•  ๊ฒฝ์šฐ ์›๊ฒฉ ์„œ๋ฒ„๊ฐ€ ์•„๋‹Œ ์บ์‹œ์—์„œ ๋น ๋ฅด๊ฒŒ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ์‹

useQuery ํ›… ์‚ฌ์šฉ ์‹œ, ์ง€์ •ํ–ˆ๋˜ ๊ณ ์œ  ํ‚ค ๋ฐ‘์— ๋ฐ˜ํ™˜๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์บ์‹ฑ๋œ๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์บ์‹œ ๋ฐ์ดํ„ฐ๋Š” ์˜ค๋ž˜๋œ(stale) ์ƒํƒœ๋กœ ๊ธฐ๋ก๋œ๋‹ค.

โœ”๏ธ Query Invalidation

์ง€์ •ํ•ด์ค€ staleTime ๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ์ฆ‰์‹œ ๋ฐ์ดํ„ฐ๋ฅผ stale ์ƒํƒœ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, API์— POST ์š”์ฒญ์„ ๋ณด๋‚ด ๋ฐ์ดํ„ฐ ๊ฐ’์„ ์—…๋ฐ์ดํŠธํ•  ๋•Œ์—”, API ์—”๋“œํฌ์ธํŠธ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ์˜ ๊ฐ’์ด ์บ์‹œ์— ์ €์žฅ๋˜์–ด์žˆ๋Š” ๊ฐ’๋ณด๋‹ค ๋” ์ตœ์‹  ์ƒํƒœ๊ฐ€ ๋˜๊ณ , ์บ์‹œ์— ์ €์žฅ๋˜์–ด์žˆ๋Š” ๋ฐ์ดํ„ฐ๋Š” ๊ณง๋ฐ”๋กœ outdatedํ•œ ๊ฐ’์ด ๋˜์–ด๋ฒ„๋ฆฐ๋‹ค. ์ด๋Ÿด ๋•Œ์—” ์ฆ‰์‹œ ์บ์‹œ ๋ฐ์ดํ„ฐ๋ฅผ stale ์ƒํƒœ๋กœ ์ฒ˜๋ฆฌํ•ด์ค˜์•ผ ํ•œ๋‹ค.

React Query์˜ QueryClient ๊ฐ์ฒด์˜ invalidateQueries ๋ฉ”์†Œ๋“œ ํ™œ์šฉ

  • ๋ชจ๋“  ์ฟผ๋ฆฌ, ํ˜น์€ ๊ณ ์œ  ํ‚ค๋ฅผ ํ†ตํ•ด ํŠน์ • ์ฟผ๋ฆฌ๋ฅผ stale ์ƒํƒœ๋กœ ์ฒ˜๋ฆฌํ•ด์ฃผ๋Š” ์—ญํ• 

โ–ถ๏ธย ๋ Œ๋”๋ง

๋ Œ๋”๋ง์„ ํšจ๊ณผ์ ์œผ๋กœ ๊ด€๋ฆฌํ•จ์€ ๊ฒฐ๊ตญ ์„ฑ๋Šฅ ์ตœ์ ํ™”์— ์ง๊ฒฐ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ˜๋“œ์‹œ ํ•„์š”ํ•˜๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฐฉ๋ฒ•๋“ค์„ ๊ณ ๋ คํ•˜์—ฌ ์šฐ๋ฆฌ์˜ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง€๋ˆ์ง€๋ˆํ•˜์ง€ ์•Š๋„๋ก ๋งŒ๋“ค์–ด์ฃผ์ž!

โœ”๏ธ useMemo

  • useMemo๋Š” ์ข…์† ๋ณ€์ˆ˜๋“ค์ด ๋ณ€ํ•˜์ง€ ์•Š์œผ๋ฉด ํ•จ์ˆ˜๋ฅผ ๊ตณ์ด ๋‹ค์‹œ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์ด์ „์— ๋ฐ˜ํ™˜ํ•œ ์ฐธ์กฐ๊ฐ’์„ ์žฌ์‚ฌ์šฉ ํ•œ๋‹ค.
  • ์ฆ‰, ํ•จ์ˆ˜ ํ˜ธ์ถœ ์‹œ๊ฐ„๋„ ์„ธ์ด๋ธŒํ•  ์ˆ˜ ์žˆ๊ณ  ๊ฐ™์€ ๊ฐ’์„ props๋กœ ๋ฐ›๋Š” ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง๋„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ”๏ธ React.memo ์ปดํฌ๋„ŒํŠธ ๋ฉ”๋ชจ์ด์ œ์ด์…˜

  • React hook์ด ์•„๋‹ˆ๋ผ์„œ ํด๋ž˜์Šคํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • React.memo๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ์˜ props๊ฐ€ ๋ฐ”๋€Œ์ง€ ์•Š์•˜๋‹ค๋ฉด, ๋ฆฌ๋ Œ๋”๋งํ•˜์ง€ ์•Š๋„๋ก ์„ค์ •ํ•˜์—ฌ ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ์ตœ์ ํ™” ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • ์ฝœ๋ฐฑํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ๋ฉ”๋ชจ์ด์ œ์ด์…˜์„ ์ ์šฉํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จํ•  ์ˆ˜๋„ ์žˆ๋‹ค

โœ”๏ธ useCallback

  • useMemo๊ฐ€ ๋ฆฌํ„ด๋˜๋Š” ๊ฐ’์„ memoize ์‹œ์ผœ์ฃผ์—ˆ๋Š”๋ฐ, useMemo์™€ ๋น„์Šทํ•œ useCallback์€ย ํ•จ์ˆ˜ ์„ ์–ธ์„ memoize ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋œ๋‹ค
  • useCallback์œผ๋กœ ํ•จ์ˆ˜๋ฅผ ์„ ์–ธํ•ด์ฃผ๋ฉด, ์ข…์† ๋ณ€์ˆ˜๋“ค์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š” ์ด์ƒ ๊ตณ์ด ํ•จ์ˆ˜๋ฅผ ์žฌ์ƒ์„ฑํ•˜์ง€ ์•Š๊ณ  ์ด์ „์— ์žˆ๋˜ ์ฐธ์กฐ ๋ณ€์ˆ˜๋ฅผ ๊ทธ๋Œ€๋กœ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์— props๋กœ ์ „๋‹ฌํ•˜์—ฌ, ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋„ props๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ธ์ง€ํ•˜๊ฒŒ ๋˜์–ด ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

โœ”๏ธ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ props๋กœ ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ์ค„ ๊ฒฝ์šฐ ๋ณ€ํ˜•ํ•˜์ง€๋ง๊ณ  ๋„˜๊ฒจ์ฃผ๊ธฐ

  • props์˜ ๊ฐ’์œผ๋กœ ๊ฐ์ฒด๋ฅผ ๋„˜๊ฒจ์ฃผ๋Š” ๊ฒฝ์šฐ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๊ฐ€ props๋กœ ๋“ค์–ด๊ฐ€๋ฏ€๋กœ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜์–ด ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ์ „๋‹ฌ๋œ๋‹ค.
  • props๋กœ ์ „๋‹ฌํ•œ ๊ฐ์ฒด๊ฐ€ ๋™์ผํ•œ ๊ฐ’์ด์–ด๋„ ์ƒˆ๋กœ ์ƒ์„ฑ๋œ ๊ฐ์ฒด๋Š” ์ด์ „ ๊ฐ์ฒด์™€ ๋‹ค๋ฅธ ์ฐธ์กฐ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง„ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ์— ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฉ”๋ชจ์ด์ œ์ด์…˜์ด ๋˜์ง€์•Š๋Š”๋‹ค.
  • ์ƒ์„ฑ์ž ํ•จ์ˆ˜๋‚˜ ๊ฐ์ฒด ๋ฆฌํ„ฐ๋Ÿด๋กœ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์„œ ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ๋ฐฉ์‹์ด ์•„๋‹Œ, state๋ฅผ ๊ทธ๋Œ€๋กœ ํ•˜์œ„์ปดํฌ๋„ŒํŠธ์— ๋„˜๊ฒจ์ฃผ์–ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต์„ ๊ทธ ํ•˜์œ„์ปดํฌ๋„ŒํŠธ์—์„œ ํ•ด์ฃผ๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

โœ”๏ธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋งคํ•‘ํ•  ๋•Œ์—๋Š” key๊ฐ’์œผ๋กœ index๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

  • ๋ฆฌ์•กํŠธ์—์„œ ๋งคํ•‘์„ ํ• ๋•Œ ๋ฐ˜๋“œ์‹œ ๊ณ ์œ  key๋ฅผ ๋ถ€์—ฌํ•˜๋„๋ก ๊ฐ•์ œํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ๋ฐฐ์—ด์˜ index๊ฐ’์œผ๋กœ key๊ฐ’์„ ๋ถ€์—ฌํ•˜๋ฉด ์ข‹์ง€ ์•Š๋‹ค.
  • ์™œ๋ƒํ•˜๋ฉด, ์–ด๋–ค ๋ฐฐ์—ด์— ์ค‘๊ฐ„์— ์–ด๋–ค ์š”์†Œ๊ฐ€ ์‚ฝ์ž…๋ ๋•Œ ๊ทธ ์ค‘๊ฐ„ ์ดํ›„์— ์œ„์น˜ํ•œ ์š”์†Œ๋“ค์€ ์ „๋ถ€ index๊ฐ€ ๋ณ€๊ฒฝ๋œ๋‹ค.
  • ์ด๋กœ ์ธํ•ด key๊ฐ’์ด ๋ณ€๊ฒฝ๋˜์–ด React๋Š” key๊ฐ€ ๋™์ผ ํ•  ๊ฒฝ์šฐ, ๋™์ผํ•œ DOM Element๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค. ๋˜ํ•œ, ๋ฐ์ดํ„ฐ๊ฐ€ key์™€ ๋งค์น˜๊ฐ€ ์•ˆ๋˜์–ด ์„œ๋กœ ๊ผฌ์ด๋Š” ๋ถ€์ž‘์šฉ๋„ ๋ฐœ์ƒํ•œ๋‹ค.

โœ”๏ธ useState์˜ ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ

  • setState๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ƒˆ๋กœ์šด ์ƒํƒœ๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„ฃ๋Š” ๋Œ€์‹ , ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ํ• ์ง€ ์ •์˜ํ•ด ์ฃผ๋Š” ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜๋ฅผ ๋„ฃ์„ ์ˆ˜๋„ ์žˆ๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด useCallback์„ ์‚ฌ์šฉํ•  ๋•Œ ๋‘ ๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ๋„ฃ๋Š” ๋ฐฐ์—ด์— ๊ฐ’์„ ๋„ฃ์–ด์ฃผ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

    // ์˜ˆ์‹œ) ์‚ญ์ œ ํ•จ์ˆ˜
    const onRemove = useCallback(
      (id) => {
        setTodos(todos.filter((todo) => todo.id !== id));
      },
      [todos]
    );
    
    // ์˜ˆ์‹œ) ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ ํ›„
    const onRemove = useCallback((id) => {
      setTodos((todos) => todos.filter((todo) => todo.id !== id));
    }, []);

โœ”๏ธ Input์— onChange ์ตœ์ ํ™”

  • ๋ณดํ†ต input ํƒœ๊ทธ์— onChange ์ด๋ฒคํŠธ๋ฅผ ์ค„๋•Œ ํƒ€์ดํ•‘์„ ํ• ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋˜์–ด, ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์„ ๋งŽ์ด ์ฐพ๊ณคํ•œ๋‹ค.
  • lodash ๋ผ๊ณ  ์ตœ์ ํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ฐ๊ธฐ๋„ ํ•˜๋Š”๋ฐ, ์•„๋ž˜ ์ฝ”๋“œ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ฐ์ง€ ์•Š๊ณ  ์ตœ์ ํ™” ์‹œํ‚ฌ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.
// ์˜ˆ์‹œ) ์ตœ์ ํ™” ์ „(X)
//UserList.jsx
function UserList() {
 {...}
  return (
      <div>
       <input
         type="text"
         value={text}
         placeholder="์•„๋ฌด ๋‚ด์šฉ์ด๋‚˜ ์ž…๋ ฅํ•˜์„ธ์š”."
         onChange={(event) => setText(event.target.value)}
        />
   {...}
      </div>
  );
}

export default UserList;

// ์˜ˆ์‹œ) ์ตœ์ ํ™” ํ›„(O)
//UserList.jsx
function UserList() {
 {...}
  return (
      <div>
       <input
          ref={searchRef}
          type="text"
          placeholder="์•„๋ฌด ๋‚ด์šฉ์ด๋‚˜ ์ž…๋ ฅํ•˜์„ธ์š”."
          onKeyUp={() => {
            let searchQuery = searchRef.current.value.toLowerCase();
            setTimeout(() => {
              if (searchQuery === searchRef.current.value.toLowerCase()) {
                setText(searchQuery);
              }
            }, 400);
          }}
        />
   {...}
      </div>
  );
}

export default UserList;