๐Ÿ’ป FE/๐Ÿ“ JS

React ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์ƒํƒœ ๊ณต์œ  (Context API)

Roy Miller 2025. 7. 2. 17:02

[ Gemini ๋Œ€ํ™” ์š”์•ฝ ] React ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ์ƒํƒœ ๊ณต์œ  (Context API)

  1. ์ตœ์ข… ๋ชฉํ‘œ

interestPage.tsx์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ SelectButtonGroup ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ†ตํ•ด '๊ด€์‹ฌ์‚ฌ'๋ฅผ ์„ ํƒํ•˜๋ฉด, ๊ทธ ๊ฒฐ๊ณผ๊ฐ€ ํ˜•์ œ ์ปดํฌ๋„ŒํŠธ์ธ SelectedInterests์— ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ‘œ์‹œ๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ.

  1. ํ•ต์‹ฌ ๋ฌธ์ œ ๋ฐ ํ•ด๊ฒฐ ๊ณผ์ •
  • ๋ฌธ์ œ: SelectButtonGroup๊ณผ SelectedInterests๋Š” ๋ถ€๋ชจ(interestPage)๋Š” ๊ฐ™์ง€๋งŒ ์„œ๋กœ๋Š” ๊ด€๊ณ„๊ฐ€ ์—†๋Š” ํ˜•์ œ(sibling) ์ปดํฌ๋„ŒํŠธ์ž…๋‹ˆ๋‹ค. ํ•œ์ชฝ์—์„œ ์ผ์–ด๋‚œ ์ผ์„ ๋‹ค๋ฅธ ์ชฝ์ด ์ง์ ‘ ์•Œ ๋ฐฉ๋ฒ•์ด ์—†์Šต๋‹ˆ๋‹ค.
  • ํ•ด๊ฒฐ์ฑ…:
    1. ์ค‘์•™ ์ €์žฅ์†Œ(Context API) ์ƒ์„ฑ: ๋ชจ๋“  ๊ด€๋ จ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ตฌ๋…ํ•  ์ˆ˜ ์žˆ๋Š” ์ค‘์•™ ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ์ธ InterestContext.tsx๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ปจํ…์ŠคํŠธ๋Š” selectedInterests(์„ ํƒ๋œ ๊ด€์‹ฌ์‚ฌ ๋ฐฐ์—ด) ์ƒํƒœ๋ฅผ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค.
    2. ์ €์žฅ์†Œ ์ œ๊ณต: ์•ฑ์˜ ์ตœ์ƒ๋‹จ(App.tsx)์„ InterestProvider๋กœ ๊ฐ์‹ธ์„œ, ์•ฑ ๋‚ด ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ InterestContext์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ๋ถ€์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค.
    3. ์ค‘์žฌ์ž(Mediator) ํŒจํ„ด ํ™œ์šฉ: ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์ธ interestPage.tsx๊ฐ€ '์ค‘์žฌ์ž' ๋˜๋Š” '์ค‘์•™ ๊ด€์ œ์‹ค' ์—ญํ• ์„ ํ•˜๋„๋ก ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.
      • interestPage๋Š” useInterestContext๋ฅผ ํ†ตํ•ด ์ค‘์•™ ์ €์žฅ์†Œ์˜์ƒํƒœ(selectedInterests)์™€ ์ƒํƒœ ๋ณ€๊ฒฝ ํ•จ์ˆ˜(setSelectedInterests)๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
      • SelectButtonGroup์—๊ฒŒ๋Š” ์ƒํƒœ๋ฅผ ๋ณ€๊ฒฝ์‹œํ‚ค๋Š” ํ•จ์ˆ˜(handleInterestsSelectionChange)๋ฅผ onSelectionChange๋ผ๋Š” props๋กœ ๋‚ด๋ ค์ค๋‹ˆ๋‹ค.
      • SelectedInterests์—๊ฒŒ๋Š” ํ˜„์žฌ ์ƒํƒœ ๊ฐ’(selectedInterests)์„ props๋กœ ๋‚ด๋ ค์ค๋‹ˆ๋‹ค.
    4. ์ปดํฌ๋„ŒํŠธ ์ˆ˜์ •:
      • SelectedInterests.tsx: ID๋งŒ ํ‘œ์‹œ๋˜๋˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด, ์ „์ฒด interests ๋ฐฐ์—ด์„ props๋กœ ๋ฐ›์•„ ID์— ํ•ด๋‹นํ•˜๋Š” label์„ ์ฐพ์•„ ํ‘œ์‹œํ•˜๋„๋ก ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
  1. ์ฒ˜์Œ์— ์ดํ•ด๊ฐ€ ์–ด๋ ค์› ๋˜ ์ด์œ : "๋ฐ์ดํ„ฐ๋Š” ์œ„์—์„œ ์•„๋ž˜๋กœ ํ๋ฅธ๋‹ค"
    ์•„๋งˆ SelectButtonGroup ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ง์ ‘ ์ปจํ…์ŠคํŠธ์˜ ์ƒํƒœ๋ฅผ ๋ฐ”๊ฟ”์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์…จ์„๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. "์„ ํƒ์ด ์ผ์–ด๋‚˜๋Š” ๊ณณ์—์„œ ์ƒํƒœ๋ฅผ ๋ฐ”๊ฟ”์•ผ์ง€" ๋ผ๋Š” ์ƒ๊ฐ์€ ๋งค์šฐ ์ž์—ฐ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

    ํ•˜์ง€๋งŒ React์—์„œ๋Š” '๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„(One-way data flow)' ์›์น™์ด ๋งค์šฐ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ํ•ญ์ƒ ๋ถ€๋ชจ์—์„œ ์ž์‹์œผ๋กœ, ์ฆ‰ ์œ„์—์„œ ์•„๋ž˜๋กœ ํ๋ฆ…๋‹ˆ๋‹ค.

์ด ์›์น™ ๋•Œ๋ฌธ์— ์ž์‹ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ถ€๋ชจ๋‚˜ ์ปจํ…์ŠคํŠธ์˜ ์ƒํƒœ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜๋Š” ๋Œ€์‹ ,"์ƒํƒœ๋ฅผ ๋ฐ”๊ฟ”๋‹ฌ๋ผ๊ณ  ๋ถ€๋ชจ์—๊ฒŒ ์š”์ฒญํ•˜๋Š” ํ•จ์ˆ˜"๋ฅผ props๋กœ ๋ฐ›์•„ ์‹คํ–‰ํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

  • ์ž˜๋ชป๋œ ์ƒ๊ฐ: ์ž์‹(SelectButtonGroup)์ด ๋ถ€๋ชจ(Context)์˜ ์ง€๊ฐ‘์—์„œ ์ง์ ‘ ๋ˆ์„ ๊บผ๋‚ธ๋‹ค.
  • React ๋ฐฉ์‹: ์ž์‹(SelectButtonGroup)์ด ๋ถ€๋ชจ์—๊ฒŒ ๋ฐ›์€ ์ „ํ™”๊ธฐ(onSelectionChange prop)๋กœ "์•„๋น , ์šฉ๋ˆ ์ฃผ์„ธ์š”!"๋ผ๊ณ  ์š”์ฒญํ•˜๋ฉด, ์•„๋น (interestPage)๊ฐ€ ์ž์‹ ์˜ ์ง€๊ฐ‘(Context)์—์„œ ๋ˆ์„ ๊บผ๋‚ด์ฃผ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.