๐Ÿš€ โš›๏ธ Next.js 1์žฅ: React ๋ฉ˜ํƒˆ ๋ชจ๋ธ์—์„œ RSC๋กœ์˜ ์ง„ํ™”

๐Ÿ“‹ ๊ฐœ์š”

React ๋ฉ˜ํƒˆ ๋ชจ๋ธ์—์„œ RSC๋กœ์˜ ์ง„ํ™” โ€” Server Component๊ฐ€ ์™œ, ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“‹ ๋ชฉ์ฐจ


๐Ÿ“Œ ์ด ๋ฌธ์„œ๋ฅผ ์ฝ๊ธฐ ์ „์—

โฑ๏ธ ์˜ˆ์ƒ ์ฝ๊ธฐ ์‹œ๊ฐ„: 15๋ถ„(์ „์ฒด) / ํ•ต์‹ฌ ํŒŒํŠธ๋งŒ: 7๋ถ„

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ํ๋ฆ„
๊ธฐ์กด ๋ฆฌ์•กํŠธ์˜ ํ•œ๊ณ„ โ†’ RSC ๋„์ž… ๋ฐฐ๊ฒฝ โ†’ ์„œ๋ฒ„ ๊ธฐ๋ฐ˜ ๋ Œ๋”๋ง ์›๋ฆฌ โ†’ ๋‘ ์ปดํฌ๋„ŒํŠธ ๊ฐ„ ๊ฒฝ๊ณ„ ๊ตฌ๋ถ„ ( ์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ ์˜ˆ์ œ )

๐ŸŽฏ ์ด ๋ฌธ์„œ๋ฅผ ๋‹ค ์ฝ์œผ๋ฉด ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ

  • ๊ธฐ์กด React ์•ฑ๊ณผ Next.js App Router ์•ฑ์˜ ๊ทผ๋ณธ์ ์ธ ์ฐจ์ด๋ฅผ ์‹œ๋‹ˆ์–ด์˜ ์–ธ์–ด๋กœ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค
  • RSC ( React Server Component ) ๊ฐ€ ์™œ ํ•„์š”ํ•œ์ง€ ๋ช…ํ™•ํžˆ ์•Œ๊ณ , ์ƒํ™ฉ์— ๋งž๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ๊ทน๋‹จ์ ์œผ๋กœ ์ค„์ด๋Š” ์„ค๊ณ„ ๋ฐฉ์‹์„ ์‹ค๋ฌด์— ๋„์ž…ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ—บ๏ธ ์ด ๋ฌธ์„œ์˜ ๋ฐฐ๊ฒฝ ์„ธ๊ณ„๊ด€: '์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ'

  • ๐Ÿฃ ์˜์ฒ  ( ์‹ ์ž… ): "๋ฆฌ๋“œ ๋‹˜! ๋ฐฉ๊ธˆ ์Šคํ„ฐ๋”” ์ฒซ ํ™”๋ฉด ์™„์„ฑํ–ˆ๋Š”๋ฐ, ํ™”๋ฉด์ด ๋œฐ ๋•Œ๋งˆ๋‹ค 1์ดˆ ์ •๋„ ํ•˜์–—๊ฒŒ ๋น„์—ˆ๋‹ค๊ฐ€ ์Šคํ”ผ๋„ˆ๊ฐ€ ๋Œ์•„์š”. ์›๋ž˜ ๋ฆฌ์•กํŠธ๋Š” ๋‹ค ์ด๋Ÿฐ ๊ฑด๊ฐ€์š”?"
  • ๐Ÿฆ ์˜ํ˜ธ ( ๋ฆฌ๋“œ ): "์˜์ฒ  ๋‹˜, ๊ทธ๊ฑด ์ „ํ˜•์ ์ธ ํด๋ผ์ด์–ธํŠธ ํŽ˜์นญ ( Client Fetching ) ์˜ ํ˜„์ƒ์ด์—์š”. ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ๋‹ค ๋‚ด๋ ค๊ฐˆ ๋•Œ๊นŒ์ง€ ์œ ์ €๋Š” ๊ตฌ๊ฒฝ๋งŒ ํ•ด์•ผ ํ•˜๊ฑฐ๋“ ์š”."
  • ๐Ÿ‘” ์˜์ˆ˜ ( PM ): "์˜์ฒ  ์”จ, ์œ ์ €๋“ค์€ 1์ดˆ๋„ ๋ชป ๊ธฐ๋‹ค๋ ค์š”. ์ดํƒˆ๋ฅ ์ด ๋ฒŒ์จ ๊ฑฑ์ •๋˜๋Š”๋ฐ์š”?"
  • ๐ŸŽจ ์˜์ˆ™ ( UX ): "๋งž์•„์š”, ์˜์ฒ  ์”จ. ํ™”๋ฉด์ด ๋œ์ปน๊ฑฐ๋ฆฌ๋Š” ๋А๋‚Œ( Layout Shift )๋„ ๋„ˆ๋ฌด ์‹ฌํ•ด์š”. ์ข€ ๋” ์šฐ์•„ํ•˜๊ฒŒ ๋ณด์—ฌ์ค„ ์ˆœ ์—†๋‚˜์š”?"
  • ๐Ÿฆ ์˜ํ˜ธ ( ๋ฆฌ๋“œ ): "์ž, ๋‹ค๋“ค ์ง„์ •ํ•˜์‹œ๊ณ ! Next.js ์˜ RSC ๋ฅผ ์“ฐ๋ฉด ๋ธŒ๋ผ์šฐ์ €์— ๊ฐ€๊ธฐ๋„ ์ „์— ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฝ‰๊ฝ‰ ์ฑ„์šด HTML ์„ ๋ณด๋‚ด์ค„ ์ˆ˜ ์žˆ์–ด์š”. ์˜์ฒ  ๋‹˜, ์ด์ œ ๊ตฌ์‹œ๋Œ€์˜ ๋‚ก์€ ํŒจํ„ด์€ ๋ฒ„๋ฆด ๋•Œ๊ฐ€ ๋์Šต๋‹ˆ๋‹ค."

๐Ÿค” ์™œ ์•Œ์•„์•ผ ํ•˜๋Š”๊ฐ€

์˜์ˆ˜(PM/BE) ์™€ ์˜ํ˜ธ(ํ”„๋ก ํŠธ ๋ฆฌ๋“œ), ๊ทธ๋ฆฌ๊ณ  ๊ฐ“ ์ž…์‚ฌํ•œ ์ฃผ๋‹ˆ์–ด ์˜์ฒ ์ด๋Š” "๊ฐœ๋ฐœ์ž ์Šคํ„ฐ๋”” ๋งค์นญ ์ปค๋ฎคํ‹ฐ๋‹ˆ" ๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ์–ด.

์–ด๋А ๋‚  ์˜์ฒ ์ด๊ฐ€ "์Šคํ„ฐ๋”” ์ฒซ ํ™”๋ฉด" ์„ React ๋กœ ์—ด์‹ฌํžˆ ๊ตฌํ˜„ํ–ˆ์–ด. ๊ทธ๋Ÿฐ๋ฐ ํ™”๋ฉด์ด ๋œฐ ๋•Œ๋งˆ๋‹ค ํ•˜์–€ ํ™”๋ฉด์ด 1์ดˆ ๋œจ๊ณ  ๋‚˜์„œ ์Šคํ”ผ๋„ˆ๊ฐ€ ๋Œ๋”๋‹ˆ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜์˜ค๋„ค? ์˜์ˆ˜๋Š” "์ดˆ๊ธฐ ๋กœ๋”ฉ์ด ๋„ˆ๋ฌด ๋А๋ ค์„œ ์œ ์ €๋“ค์ด ๋‹ค ์ดํƒˆํ•˜๊ฒ ์–ด์š”!" ๋ผ๊ณ  ๋ถˆ๋งŒ์„ ํ‘œํ–ˆ์ง€. ์˜์ฒ ์ด๋Š” useEffect ์•ˆ์—์„œ API ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์žˆ์—ˆ๊ฑฐ๋“  ( ์ „ํ˜•์ ์ธ ํด๋ผ์ด์–ธํŠธ ํŽ˜์นญ ).

React ๋กœ ๊ฐœ๋ฐœํ•˜๋‹ค ๋ณด๋ฉด ์ปดํฌ๋„ŒํŠธ ์•ˆ์— useEffect ๋ฅผ ๊น”๊ณ  API ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒŒ ๋‹น์—ฐํ•˜๊ฒŒ ๋А๊ปด์ ธ. ํ•˜์ง€๋งŒ JS ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋Š” ๊ธฐํ•˜๊ธ‰์ˆ˜์ ์œผ๋กœ ๋Š˜์–ด๋‚˜๊ณ , ์‚ฌ์šฉ์ž์˜ ์Šค๋งˆํŠธํฐ์ด ๊ทธ ๊ฑฐ๋Œ€ํ•œ JS ๋ฅผ ๋‹ค์šด๋ฐ›๊ณ  ํŒŒ์‹ฑํ•ด์„œ ์‹คํ–‰ํ•  ๋•Œ๊นŒ์ง€ ํ™”๋ฉด์€ ํ•˜์–—๊ฒŒ ๋น„์–ด์žˆ์–ด.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋„์ž…๋œ Next.js ์˜ ํ•ต์‹ฌ ๋ฌด๊ธฐ, RSC ( React Server Component ) ์˜ ๋ฉ˜ํƒˆ ๋ชจ๋ธ๋กœ ์ „ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉด, Next.js ์œ„์—์„œ๋„ ๋ฆฌ์•กํŠธ ์‹œ์ ˆ์˜ ๋‚ก์€ ํŒจํ„ด๋งŒ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋  ๊ฑฐ์•ผ.


๐Ÿ—๏ธ ๋น„์œ ๋กœ ๋จผ์ € ์ดํ•ดํ•˜๊ธฐ

๐Ÿค” ์ž ๊น, ๋จผ์ € ์ƒ๊ฐํ•ด๋ด
์šฐ๋ฆฌ๊ฐ€ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ณด๋Š” ๊ณผ์ •์„ '์Œ์‹ ๋ฐฐ๋‹ฌ'์— ๋น„์œ ํ•œ๋‹ค๋ฉด, ์ง€๊ธˆ๊นŒ์ง€์˜ ๋ฆฌ์•กํŠธ๋Š” ์–ด๋–ค ๋ฐฉ์‹์ด์—ˆ์„๊นŒ?

๐Ÿ“ฆ ์ด์ผ€์•„ ๊ฐ€๊ตฌ ์กฐ๋ฆฝ ๋น„์œ 

๊ธฐ๋ณธ ๋ฆฌ์•กํŠธ(CSR)๋Š” ๊ฐ€๊ตฌ ๋„๋ฉด๊ณผ ์กฐ๋ฆฝ ๋„๊ตฌ(JS ๋ฌถ์Œ), ๊ทธ๋ฆฌ๊ณ  ๊ฐ€๊ณต๋˜์ง€ ์•Š์€ ๋‚˜๋ฌด ํŒ์ž ๋ฅผ ์šฐ๋ฆฌ ์ง‘(๋ธŒ๋ผ์šฐ์ €)์— ๋‹ค ๋ณด๋‚ด์ฃผ๋Š” ๊ฑฐ์•ผ. ์šฐ๋ฆฌ๊ฐ€ ์ง‘์—์„œ ์ง์ ‘ ๋•€ ํ˜๋ฆฌ๋ฉฐ ์กฐ๋ฆฝ(๋ Œ๋”๋ง)ํ•ด์•ผ ๋น„๋กœ์†Œ ๊ฐ€๊ตฌ๊ฐ€ ๋ณด์ด๊ธฐ ์‹œ์ž‘ํ•˜์ง€.

๋ฐ˜๋ฉด, Next.js ์˜ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ( RSC ) ๋Š” ๊ณต์žฅ ( ์„œ๋ฒ„ ) ์—์„œ ์™„๋ฒฝํ•˜๊ฒŒ ์™„์„ฑ๋œ ๊ฐ€๊ตฌ ๋ฅผ ํ†ต์งธ๋กœ ๋ณด๋‚ด์ฃผ๋Š” ๋ฐฉ์‹์ด์•ผ. ์šฐ๋ฆฌ๋Š” ๊ทธ๋ƒฅ ์ œ ์ž๋ฆฌ์— ๋‘๊ธฐ๋งŒ ํ•˜๋ฉด ๋ผ!

๐Ÿง’ 5์‚ด์—๊ฒŒ ์„ค๋ช…ํ•œ๋‹ค๋ฉด?
"๊ธฐ์กด ๋ฆฌ์•กํŠธ๋Š” ๋ ˆ๊ณ  ๋ธ”๋ก์ด๋ž‘ ์„ค๋ช…์„œ๋ฅผ ์ง‘์œผ๋กœ ๋ณด๋‚ด์ค˜์„œ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘ ๋งž์ถฐ์•ผ ํ–ˆ์–ด. ํ•˜์ง€๋งŒ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋Š” ์‚ผ์ดŒ์ด ๋ฏธ๋ฆฌ ๋‹ค ๋งž์ถฐ๋†“์€ ๋ฉ‹์ง„ ์„ฑ์„ ํ†ต์งธ๋กœ ์„ ๋ฌผํ•ด์ฃผ๋Š” ๊ฑฐ์•ผ. ์šฐ๋ฆฐ ๊ทธ๋ƒฅ ๋ฐ›์•„์„œ ๋†€๊ธฐ๋งŒ ํ•˜๋ฉด ๋ผ!"

๐Ÿ’ก ํ•œ ์ค„๋กœ ๊ธฐ์–ตํ•˜๊ธฐ
CSR ์€ ์žฌ๋ฃŒ ๋ฐฐ๋‹ฌ, RSC ๋Š” ์™„์„ฑํ’ˆ ๋ฐฐ๋‹ฌ์ด๋‹ค.


๐Ÿงฉ ์™œ Next.js์ด๊ณ , ์™œ RSC์ธ๊ฐ€? ๐ŸŸข

๐ŸŽฏ ์ด ์„น์…˜์„ ์ฝ๊ณ  ๋‚˜๋ฉด:

  • ๋‹จ์ˆœํžˆ "๋น ๋ฅด๋‹ค" ๊ฐ€ ์•„๋‹ˆ๋ผ, ์„ค๊ณ„ ๊ด€์ ์—์„œ RSC ๊ฐ€ ๊ฐ€์ ธ๋‹ค์ค€ ํŒจ๋Ÿฌ๋‹ค์ž„ ๋ณ€ํ™”๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ตœ์ ํ™”์˜ ์›๋ฆฌ๋ฅผ ์™„์ „ํžˆ ํ†ต์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด๊ฒŒ ๋ญ”๊ฐ€?

RSC(React Server Component) ๋ž€ ์˜ค๋กœ์ง€ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋งŒ ๋ Œ๋”๋ง๋˜๊ณ , ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €) ๋กœ๋Š” ์•„์˜ˆ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ๊ฐ€ ์ „์†ก๋˜์ง€ ์•Š๋Š” ์ปดํฌ๋„ŒํŠธ์•ผ.

๐Ÿ“– ์šฉ์–ด: RSC โ€” React Server Component . ๋ฆฌ์•กํŠธ์˜ ํ•ต์‹ฌ ๋ Œ๋”๋ง ์—”์ง„์ด ์„œ๋ฒ„๋กœ ์˜ฎ๊ฒจ๊ฐ„ ํ˜์‹ ์ ์ธ ๊ธฐ์ˆ .

์™œ ์ด๊ฒŒ ๋”ฐ๋กœ ์กด์žฌํ•˜๋Š”๊ฐ€?

โŒ ์ด๊ฒŒ ์—†์—ˆ๋‹ค๋ฉด? ( ๊ธฐ์กด React ์˜ ํ•œ๊ณ„ )
์˜์ฒ ์ด๊ฐ€ ์Šคํ„ฐ๋”” ๋ชจ์ง‘๊ธ€ ๋‚ ์งœ๋ฅผ ์ด์˜๊ฒŒ ๋ณด์—ฌ์ฃผ๊ธฐ ์œ„ํ•ด ๋ฌด๊ฑฐ์šด ๋ฌด๊ฑฐ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ( moment.js ๋“ฑ ) ๋ฅผ ์ผ๋‹ค๊ณ  ์น˜์ž. ๊ธฐ์กด ๋ฆฌ์•กํŠธ์—์„œ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๊ทธ ๋ฌด๊ฑฐ์šด ๋ชจ๋“ˆ ์ˆ˜๋ฐฑ KB ๋ฅผ ์–ต์ง€๋กœ ๋„˜๊ฒจ๋ฐ›์•„์•ผ ํ–ˆ์–ด. ํ™”๋ฉด ํ•˜๋‚˜ ๊ทธ๋ฆฌ๋Š”๋ฐ ๋ฐ์ดํ„ฐ๋ณด๋‹ค ๋„๊ตฌ๊ฐ€ ๋” ๋ฌด๊ฑฐ์šด ๋ฐฐ๋ณด๋‹ค ๋ฐฐ๊ผฝ์ด ํฐ ์ƒํ™ฉ์ด์—ˆ์ง€.

โœ… RSC ๊ฐ€ ์ƒ๊ธด ๋’ค์—๋Š”?
๊ฐ€์žฅ ๊ทน์ ์ธ ์ฐจ์ด์ ์€ ๋ฐ์ดํ„ฐ ํŽ˜์นญ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์—ฐ์‚ฐ ์ „์ฒด๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ๋„๋‹ฌํ•˜๊ธฐ๋„ ์ „์— ์„œ๋ฒ„์—์„œ ์ข…๊ฒฐ ๋œ๋‹ค๋Š” ๊ฑฐ์•ผ. ๊ฒฐ๊ณผ๋ฌผ์ธ HTML ๋งŒ ์ „๋‹ฌ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž ๊ธฐ๊ธฐ์˜ ๋ถ€๋‹ด์ด ์ œ๋กœ(0) ์— ์ˆ˜๋ ดํ•ด.

// app/studies/page.tsx
// ๐Ÿฆ ์˜ํ˜ธ: "์˜์ฒ  ๋‹˜, ์ด ์ฝ”๋“œ๋Š” ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋‹จ 1๋ฐ”์ดํŠธ์˜ JS๋„ ์“ฐ์ง€ ์•Š์•„์š”."
 
import db from '@/lib/db'            // ๐Ÿ‘” ์˜์ˆ˜: "์„œ๋ฒ„ DB ์ปค๋„ฅํ„ฐ๋ฅผ ์ง์ ‘ ๋ถ€๋ฅผ ์ˆ˜ ์žˆ์œผ๋‹ˆ ํŽธํ•˜๋„ค์š”."
import { format } from 'date-fns'    // ๐Ÿฆ ์˜ํ˜ธ: "์•„๋ฌด๋ฆฌ ๋ฌด๊ฑฐ์šด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์จ๋„ ํด๋ผ์ด์–ธํŠธ๋Š” ๋ชฐ๋ผ์š”."
 
export default async function StudiesPage() {
  // ๐Ÿฆ ์˜ํ˜ธ: "์ปดํฌ๋„ŒํŠธ ์ž์ฒด๊ฐ€ async๋ผ๋‹ˆ, ์ •๋ง ์šฐ์•„ํ•˜์ง€ ์•Š๋‚˜์š”?"
  const studies = await db.study.findMany()
 
  return (
    <main>
      <h1>์Šคํ„ฐ๋”” ๋ชจ์ง‘๊ธ€ ๋ชฉ๋ก</h1>
      <ul>
        {studies.map(study => (
          <li key={study.id}>
            {study.title} - {format(study.createdAt, 'yyyy-MM-dd')}
          </li>
        ))}
      </ul>
    </main>
  )
}

๐Ÿ’ก ํ•œ ์ค„๋กœ ๊ธฐ์–ตํ•˜๊ธฐ
RSC ๋Š” ์„œ๋ฒ„์—์„œ ๋„๋Š” ๋น„๋ฐ€ ์š”์›์ด์•ผ. ๊ฒฐ๊ณผ๋ฌผ๋งŒ ๋ธŒ๋ผ์šฐ์ €์— ๋˜์ ธ์ฃผ๊ณ  ํ”์ ๋„ ์—†์ด ์‚ฌ๋ผ์ ธ.

์—ฌ๊ธฐ์„œ ์“ฐ๋ฉด ์•ˆ ๋˜๋Š” ๊ฒƒ

  • useState, useEffect ๋ถˆ๊ฐ€ (์„œ๋ฒ„์—๋Š” ๋ธŒ๋ผ์šฐ์ € ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ๊ฐ€ ์—†์Œ)
  • ๋ธŒ๋ผ์šฐ์ € ์ด๋ฒคํŠธ(onClick) ํ• ๋‹น ๋ถˆ๊ฐ€
  • window ๋‚˜ document ๊ฐ์ฒด ์ ‘๊ทผ ๋ถˆ๊ฐ€

๐Ÿ”— ์—ฐ๊ฒฐ ๊ณ ๋ฆฌ
์ด ์ œ์•ฝ ์‚ฌํ•ญ๋“ค์„ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ฐ”๋กœ ๋‹ค์Œ์— ๋ฐฐ์šธ Client Component ์•ผ.


โš–๏ธ Client Component vs Server Component ๐ŸŸข

๐ŸŽฏ ์ด ์„น์…˜์„ ์ฝ๊ณ  ๋‚˜๋ฉด:

  • ๋‘ ์ปดํฌ๋„ŒํŠธ์˜ ์ฐจ์ด๋ฅผ ๋ช…ํ™•ํžˆ ๊ตฌ๋ถ„ํ•˜๊ณ , ์–ธ์ œ ๋ฌด์—‡์„ ์“ธ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Leaf Pattern ์„ ํ™œ์šฉํ•ด ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ์„ค๊ณ„๋ฅผ ํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜์ฒ ์ด๊ฐ€ RSC ์˜ ๋ง›์„ ์•Œ๋”๋‹ˆ ๋ชจ๋“  ๊ฒƒ์„ ์„œ๋ฒ„์—์„œ ํ•˜๋ ค๊ณ  ํ•ด. ํ•˜์ง€๋งŒ "์ข‹์•„์š”" ๋ฒ„ํŠผ์„ ๋งŒ๋“ค๋ ค๊ณ  <button onClick={...}> ์„ ๋ฐ•๋Š” ์ˆœ๊ฐ„ ํ„ฐ๋ฏธ๋„์— ์‹œ๋ป˜๊ฑด ์—๋Ÿฌ๊ฐ€ ๋‚ฌ์ง€. ์˜ํ˜ธ( FE ๋ฆฌ๋“œ ) ๊ฐ€ ๋‹ค๊ฐ€์™€์„œ ์›ƒ์œผ๋ฉฐ ๋งํ–ˆ์–ด.

"์˜์ฒ ์•„, ์ƒํ˜ธ์ž‘์šฉ์€ ๊ฒฐ๊ตญ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ผ์–ด๋‚˜์•ผ ํ•ด. use client ๋ฅผ ์“ธ ์‹œ๊ฐ„์ด์•ผ."

์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ๊ฐ€?

๋น„๊ตServer Component(RSC)Client Component(use client)
๊ธฐ๋ณธ ์ƒํƒœApp Router ์˜ ๊ธฐ๋ณธ๊ฐ’ ( Default )์ตœ์ƒ๋‹จ์— "use client" ๋ช…์‹œ ํ•„์š”
JS ๋ฒˆ๋“ค ํฌ๊ธฐ+0 KB ( ๊ฒฐ๊ณผ๋ฌผ HTML ๋งŒ ๋‚ด๋ ค๊ฐ )์ฝ”๋“œ๊ฐ€ ๊ทธ๋Œ€๋กœ ๋ฒˆ๋“ค์— ํฌํ•จ๋จ
๋ฐ์ดํ„ฐ ํŽ˜์นญasync/await ์ง์ ‘ ํ˜ธ์ถœuseEffect, ์ปค์Šคํ…€ ํ›… ๋“ฑ
์ œ์•ฝ ์กฐ๊ฑด์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ ๋ถˆ๊ฐ€๋ฏผ๊ฐํ•œ ์ •๋ณด(API ํ‚ค) ๋…ธ์ถœ ์œ„ํ—˜

์‹ค๋ฌด์—์„œ๋Š” ์–ด๋–ป๊ฒŒ ๋ถ„๋ฆฌํ•ด์•ผ ํ•˜๋Š”๊ฐ€? ( Leaf Pattern ์ฒดํ™” )

"์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•œ ๋‚˜๋ญ‡์žŽ(Leaf) ๋์ž๋ฝ ๋ถ€๋ถ„๋งŒ ๋ฐ€์–ด๋‚ด๋ผ." ์ด๊ฒƒ์ด ์‹œ๋‹ˆ์–ด๋“ค์˜ ๋ฉ˜ํƒˆ ๋ชจ๋ธ์ด์ž ๊ฐ€์žฅ ์šฐ์•„ํ•œ ํŒจํ„ด์ด์•ผ.

โŒ ์ˆœ์ง„ํ•œ ์ฝ”๋“œ ( Naive Approach ) - ์˜์ฒ ์ด์˜ ํญํƒ„ ๋Œ๋ฆฌ๊ธฐ
์˜์ฒ ์ด๋Š” ์—๋Ÿฌ๊ฐ€ ๋‚˜์ž ๊ท€์ฐฎ์•„์„œ ํŽ˜์ด์ง€ ์ „์ฒด ์ตœ์ƒ๋‹จ์— "use client" ๋ฅผ ๋ฐ•์•„๋ฒ„๋ ธ์–ด.

// app/studies/page.tsx
'use client' // ๐Ÿฃ ์˜์ฒ : "์•„, ์—๋Ÿฌ๋‚˜๋‹ˆ๊นŒ ์ผ๋‹จ 'use client' ๋ฐ•๊ณ  ๋ณผ๊ฒŒ์š”!"
             // ๐Ÿฆ ์˜ํ˜ธ: "์˜์ฒ  ๋‹˜, ์ด๋Ÿฌ๋ฉด ํ•˜์œ„์˜ ๋ชจ๋“  ์ •์  UI๊นŒ์ง€ JS ๋ฒˆ๋“ค๋กœ ๋ง๋ ค๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค!"
 
import StudyDesc from './StudyDesc'
import LikeButton from './LikeButton' 
 
export default function StudiesPage() {
  return (
    <div>
      <StudyDesc /> {/* ๐Ÿฆ ์˜ํ˜ธ: "ํ…์ŠคํŠธ ๋ฉ์–ด๋ฆฌ์ธ๋ฐ ํด๋ผ์ด์–ธํŠธ ๋ฒˆ๋“ค์— ์žกํ˜€๊ฐ‘๋‹ˆ๋‹ค (์žฌ์•™)" */}
      <LikeButton />
    </div>
  )
}

โœ… ์šฐ์•„ํ•œ ์ฝ”๋“œ ( Pro Approach ) - ์˜ํ˜ธ์˜ ๋ฆฌํŒฉํ† ๋ง
์˜ํ˜ธ(FE ๋ฆฌ๋“œ) ๋Š” LikeButton.tsx ๋งŒ ๋”ฐ๋กœ ํŒŒ์ผ๋กœ ๋นผ์„œ, ๊ทธ ์•ˆ์—๋งŒ "use client" ๋ฅผ ์„ ์–ธํ•˜๊ฒŒ ํ–ˆ์–ด.

// app/studies/LikeButton.tsx
'use client' // ๐Ÿฆ ์˜ํ˜ธ: "๋”ฑ ์ƒํ˜ธ์ž‘์šฉ์ด ํ•„์š”ํ•œ ์ด ๋ถ€๋ถ„๋งŒ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ณด๋ƒ…๋‹ˆ๋‹ค."
import { useState } from 'react'
 
export default function LikeButton() {
  const [likes, setLikes] = useState(0)
  return <button onClick={() => setLikes(l => l + 1)}>๐Ÿ‘ {likes}</button>
}
// app/studies/page.tsx
// ๐Ÿฆ ์˜ํ˜ธ: "๋ถ€๋ชจ๋Š” ๊ณ„์† ์ˆœ์ˆ˜ํ•œ Server Component๋กœ ๋‚จ๊ฒจ์„œ ์ตœ์ ํ™”ํ•˜์„ธ์š”."
import StudyDesc from './StudyDesc' 
import LikeButton from './LikeButton' // Leaf ๋ถ€๋ถ„๋งŒ Client Component
 
export default function StudiesPage() {
  return (
    <div>
      <StudyDesc /> 
      <LikeButton /> 
    </div>
  )
}

๐Ÿ’ก ํ•œ ์ค„๋กœ ๊ธฐ์–ตํ•˜๊ธฐ
๋Œ€๋“ค๋ณด์™€ ๊ธฐ๋‘ฅ์€ ํŠผํŠผํ•œ RSC ๋กœ ์„ธ์›Œ๋‘๊ณ , ๋ถˆ์ด ์ผœ์ ธ์•ผ ํ•˜๋Š” ์ „๊ตฌ(๋‚˜๋ญ‡์žŽ) ๋ถ€๋ถ„๋งŒ ํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ๋กœ ๋‹ฌ์•„์ค€๋‹ค.


๐Ÿงช ๋”ฐ๋ผํ•ด๋ณด๊ธฐ: ๊ฐ€์žฅ ๋‹จ์ˆœํ•œ RSC ๋ˆˆ์œผ๋กœ ํ™•์ธํ•˜๊ธฐ ๐ŸŸข

๐ŸŽฏ ์ด ์„น์…˜์„ ์ฝ๊ณ  ๋‚˜๋ฉด:

  • ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ๋กœ๊ทธ๊ฐ€ ์ฐํžˆ๋Š” ์œ„์น˜๋ฅผ ํ†ตํ•ด ์‹คํ–‰ ํ™˜๊ฒฝ์˜ ์ฐจ์ด๋ฅผ ์˜ค๊ฐ์œผ๋กœ ๋А๋‚„ ์ˆ˜ ์žˆ๋‹ค.

์‹ค์ œ๋กœ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ์ฝ˜์†”์„ ๋‚จ๊ธฐ์ง€ ์•Š๊ณ , ์„œ๋ฒ„์—์„œ๋งŒ ๋„๋Š” ๊ฑธ ํ™•์ธํ•ด๋ณด์ž.

// app/sandbox/page.tsx
 
export default function SandboxPage() {
  // ๐Ÿฆ ์˜ํ˜ธ: "์ด ๋กœ๊ทธ๋Š” ๋ธŒ๋ผ์šฐ์ € F12 ์ฝ˜์†”์— ์ฐํž๊นŒ์š”?"
  console.log("๐Ÿ”ฅ ์ด ๋กœ๊ทธ๋Š” ๊ณผ์—ฐ ์–ด๋””์„œ ์ฐํž๊นŒ์š”?");
 
  return (
    <div>
      <h1>์˜์ˆ˜๋„ค ์ปค๋ฎค๋‹ˆํ‹ฐ ์ƒŒ๋“œ๋ฐ•์Šค</h1>
    </div>
  )
}

๐Ÿ” ์ฝ”๋“œ ํ•œ ์ค„์”ฉ ๋œฏ์–ด๋ณด๊ธฐ:

๋ถ€๋ถ„์˜๋ฏธ
console.log์ผ๋ฐ˜์ ์ธ ์ถœ๋ ฅ ํ•จ์ˆ˜์ง€๋งŒ, RSC ์—์„œ๋Š” ํ„ฐ๋ฏธ๋„(์„œ๋ฒ„) ์—๋งŒ ์ฐํ˜€.
SandboxPage"use client" ๊ฐ€ ์—†์œผ๋ฏ€๋กœ ๊ธฐ๋ณธ์ ์œผ๋กœ ์„œ๋ฒ„์—์„œ๋งŒ ๋ Œ๋”๋ง๋ผ.

๐Ÿ” ๋”ฐ๋ผํ•ด๋ณด๊ธฐ ๊ฒฐ๊ณผ ๋ถ„์„:
๋ธŒ๋ผ์šฐ์ €์—๋Š” ์ ˆ๋Œ€ ์•ˆ ์ฐํžˆ๊ณ  ํ„ฐ๋ฏธ๋„ ์ฐฝ(์„œ๋ฒ„๋ฅผ ๋Œ๋ฆฌ๋Š” Node.js ํ™˜๊ฒฝ) ์—๋งŒ ๋กœ๊ทธ๊ฐ€ ๋‚จ์•„. ์ด ๋‹จ์ˆœํ•œ ์‚ฌ์‹ค์ด ์™œ SSR / RSC ํ™˜๊ฒฝ์—์„œ window is not defined ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€๋ฅผ ์™„๋ฒฝํžˆ ๋Œ€๋ณ€ํ•ด.

โœ… ์‹ค์Šต ํ›„ ์ฒดํฌ๋ฆฌ์ŠคํŠธ

  • ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ๋กœ๊ทธ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ์ฐํžˆ์ง€ ์•Š๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ๋‹ค
  • ๋ Œ๋”๋ง ํŠธ๋ฆฌ์˜ ํ•˜๋‹จ(Leaf) ์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋งŒ use client ๋กœ ๋ฐ€์–ด๋‚ด๋Š” ํŒจํ„ด์˜ ์ด์œ ๋ฅผ ์•ˆ๋‹ค.

๐Ÿ’ฅ ์—๋Ÿฌ ํ•ด๊ฒฐ ์นดํƒˆ๋กœ๊ทธ

์—๋Ÿฌ ๋ฉ”์‹œ์ง€๊ฐ€ ๋œจ๋ฉด Ctrl+F๋กœ ๊ฒ€์ƒ‰ํ•ด๋ด.

โŒ Event handlers cannot be passed to Client Component props...

์›์ธ: ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ํด๋ฆญ(onClick)์„ ๋‹ฌ์•„์„œ ์—๋Ÿฌ๋‚จ.
ํ•ด๊ฒฐ์ฑ…: ํด๋ฆญ์ด ํ•„์š”ํ•œ ๊ทธ ์ปดํฌ๋„ŒํŠธ ํŒŒ์ผ ๋‹จ์œ„๋งŒ ์ชผ๊ฐœ์–ด ์ตœ์ƒ๋‹จ์— 'use client'๋ฅผ ์„ ์–ธํ•œ๋‹ค.

โŒ window is not defined

์›์ธ: ์„œ๋ฒ„ ์ธก์—์„œ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๊ณ  ์žˆ๋Š”๋ฐ ๋ธŒ๋ผ์šฐ์ € ๊ฐ์ฒด(window, localStorage)๋ฅผ ์ฐธ์กฐํ•จ.
ํ•ด๊ฒฐ์ฑ…: ์ปดํฌ๋„ŒํŠธ๋ฅผ ํด๋ผ์ด์–ธํŠธ๋กœ ๋งŒ๋“ค๊ณ  useEffect ๋‚ด๋ถ€์—์„œ ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ์กฐ๊ฑด์„ ๊ฑธ์–ด ์‚ฌ์šฉํ•œ๋‹ค.


๐Ÿ ์ด๋ฒˆ์— ๋ฐฐ์šด ๋‚ด์šฉ ์ด์ •๋ฆฌ

์˜ค๋Š˜ ๋ฐฐ์šด ํ•ต์‹ฌ์„ ํ•œ๋ˆˆ์— ์ •๋ฆฌํ•ด๋ณผ๊นŒ? ์‹ค๋ฌด์—์„œ ๊ธธ์„ ์žƒ์—ˆ์„ ๋•Œ ์ด๊ฒƒ๋งŒ ๋ด๋„ ๋ผ.

๐Ÿ“‹ ํ•ต์‹ฌ ๋ชจ๋ธ ์ฐจ์ด

| HTML ๋ Œ๋”๋ง | ๋นˆ div ๋ฐ›๊ณ  ํฐ์—์„œ ์ž์Šค๋กœ ์ฑ„์›€ | ์„œ๋ฒ„์—์„œ HTML ๊ฝ‰๊ฝ‰ ์ฑ„์›Œ์„œ ๋‚ด๋ ค์คŒ |
| JS ๋ฒˆ๋“ค ํฌ๊ธฐ | ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ถ”๊ฐ€ํ• ์ˆ˜๋ก ๋น„๋Œ€ํ•ด์ง | ์„œ๋ฒ„ ์ „์šฉ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” 0KB ๋‹ฌ์„ฑ |
| ๋ฐ์ดํ„ฐ ํŽ˜์นญ | ํ™”๋ฉด ๋Œ๋ฆฌ๊ณ  ๋‚˜์„œ์•ผ useEffect ํ˜ธ์ถœ | HTML ๊ทธ๋ฆด ๋•Œ ์ด๋ฏธ ๋ฐ์ดํ„ฐ๋ฅผ ๋“ค๊ณ  ์˜ด |

โš ๏ธ ์ ˆ๋Œ€ ํ•˜์ง€ ๋ง ๊ฒƒ

์ƒํ™ฉโŒ ๋‚˜์œ ์˜ˆโœ… ์ข‹์€ ์˜ˆ
์—๋Ÿฌ ํ•ด๊ฒฐ๊ท€์ฐฎ๋‹ค๊ณ  ์ตœ์ƒ๋‹จ์— "use client" ๋ฐ•๊ธฐ๋ง๋‹จ ์ปดํฌ๋„ŒํŠธ(Leaf) ๋งŒ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ถ„๋ฆฌ
๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉํด๋ผ์ด์–ธํŠธ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฌด๊ฑฐ์šด ์œ ํ‹ธ(lodash ๋“ฑ) ์‚ฌ์šฉ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ์—ฐ์‚ฐ ํ›„ ๋ฐ์ดํ„ฐ๋งŒ ๋„˜๊ธฐ๊ธฐ
๊ฐ์ฒด ์ ‘๊ทผ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ window, localStorage ํ˜ธ์ถœuseEffect ์•ˆ์—์„œ ์ ‘๊ทผํ•˜๊ฑฐ๋‚˜ ํด๋ผ์ด์–ธํŠธ๋กœ ์œ„์ž„

๐Ÿ“ ๋งˆ๋ฌด๋ฆฌ ํ€ด์ฆˆ

Q1. ์˜์ฒ ์ด๊ฐ€ ํšŒ์›๊ฐ€์ž… ํผ์„ ๊ฐœ๋ฐœ ์ค‘์ด์•ผ. ์•ฝ๊ด€ ๋™์˜ ๋‚ด์šฉ์ด ๋‹ด๊ธด ์•„์ฃผ ๊ธด ํ…์ŠคํŠธ ์ปดํฌ๋„ŒํŠธ <Terms> ์™€ ๋™์˜ ์ฒดํฌ๋ฐ•์Šค ๋ฐ ์ œ์ถœ ๋ฒ„ํŠผ์„ ๊ฐ€์ง„ <SignUpForm> ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žˆ์–ด. ์—ฌ๊ธฐ์„œ ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ๋ฅผ ๊ฐ€์žฅ ์ตœ์ ํ™”ํ•˜๋„๋ก ์ปดํฌ๋„ŒํŠธ๋ฅผ ์„ค๊ณ„ํ•˜๋ ค๋ฉด 'use client' ๋Š” ์–ด๋””์— ์„ ์–ธํ•ด์•ผ ํ• ๊นŒ?

โœ… ์ •๋‹ต: <SignUpForm> ์ปดํฌ๋„ŒํŠธ์—๋งŒ 'use client' ๋ฅผ ์„ ์–ธํ•˜๊ณ , <Terms> ๋Š” Server Component ๋กœ ์œ ์ง€ํ•œ๋‹ค.

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ์›๋ฆฌ ์„ค๋ช…: <Terms> ๋Š” ๋‹จ์ˆœํžˆ ๋ณด์—ฌ์ฃผ๋Š” ํ…์ŠคํŠธ์ผ ๋ฟ์ด๋ฏ€๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•„์š” ์—†์–ด. ์ด๊ฑธ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋‘๋ฉด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „์†ก๋˜๋Š” ์ž์Šค ๋ฒˆ๋“ค์—์„œ ์™„์ „ํžˆ ๋น ์ง€๊ฒŒ ๋ผ.
  • ์˜ค๋‹ต ํ”ผ๋“œ๋ฐฑ: "์˜์ฒ  ๋‹˜, ํŽ˜์ด์ง€ ์ „์ฒด์— use client ๋ฅผ ๋ถ™์ด๋ฉด ์ € ๊ธด ์•ฝ๊ด€ ํ…์ŠคํŠธ๊นŒ์ง€ ์œ ์ €์˜ ๋ฐ์ดํ„ฐ ์š”๊ธˆ์„ ๊ฐ‰์•„๋จน์œผ๋ฉฐ ๋‹ค์šด๋กœ๋“œ๋ผ์š”!"
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: "์ธํ„ฐ๋ž™์…˜์ด ์—†๋Š” ํ…์ŠคํŠธ๋Š” ์„œ๋ฒ„๋กœ!"

Q2. ์˜ํ˜ธ(FE ๋ฆฌ๋“œ) ๊ฐ€ ์˜์ฒ ์ด์˜ PR ์„ ๋ณด๋ฉฐ ์ฝ”๋ฉ˜ํŠธ๋ฅผ ๋‚จ๊ฒผ๋‹ค. "์˜์ฒ ์•„, ์ด๊ฑฐ use client ์„ ์–ธํ•œ ํŒŒ์ผ ์•ˆ์ชฝ์—์„œ ๋ฌด๊ฑฐ์šด lodash ๊ฐ™์€ ์œ ํ‹ธ์„ ์“ฐ๊ณ  ์žˆ๋„ค? ์ด๋Ÿฌ๋ฉด ์˜๋ฏธ๊ฐ€ ์—†์–ด." ์˜ํ˜ธ์˜ ์ง€์ ์€ Next.js ๋ฒˆ๋“ค ๊ด€์ ์—์„œ ์–ด๋–ค ์˜๋ฏธ์ธ๊ฐ€?

โœ… ์ •๋‹ต: 'use client' ํŒŒ์ผ์—์„œ import ํ•œ ๋„๊ตฌ๋Š” ๋ชจ๋‘ ํด๋ผ์ด์–ธํŠธ ๋ฒˆ๋“ค์— ํฌํ•จ๋˜์–ด ์œ ์ €๊ฐ€ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.

๐Ÿ’ก ์ƒ์„ธ ํ•ด์„ค:

  • ์›๋ฆฌ ์„ค๋ช…: use client ๊ฐ€ ์„ ์–ธ๋˜๋Š” ์ˆœ๊ฐ„, ๊ทธ ํ•˜์œ„๋กœ ๋”ธ๋ ค์˜ค๋Š” ๋ชจ๋“  ์˜์กด์„ฑ(import) ์€ ๋ธŒ๋ผ์šฐ์ €์šฉ ๋ฒˆ๋“ค๋กœ ๋ฌถ์—ฌ. ์•„๋ฌด๋ฆฌ ์„œ๋ฒ„ ์—ฐ์‚ฐ์ด ๋นจ๋ผ๋„ ์œ ์ €๊ฐ€ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๋‹ค ๊ฐ€๋ฉด ์†Œ์šฉ์—†์ง€.
  • ๋ฒ ์ŠคํŠธ ํ”„๋ž™ํ‹ฐ์Šค: ๋ฌด๊ฑฐ์šด ์—ฐ์‚ฐ์€ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋๋‚ด๊ณ , ํด๋ผ์ด์–ธํŠธ์—๋Š” ์˜ค์ง ์ง๋ ฌํ™”๋œ(Serialized) ์ˆœ์ˆ˜ ๋ฐ์ดํ„ฐ ๊ฐ’๋งŒ Props ๋กœ ๋„˜๊ฒจ์ค˜.
  • ๐Ÿ“Œ ํ•ต์‹ฌ ๊ธฐ์–ต๋ฒ•: "๋„๊ตฌ๋Š” ์„œ๋ฒ„์—์„œ ์“ฐ๊ณ , ์œ ์ €์—๊ฒ ๊ฒฐ๊ณผ๋ฌผ๋งŒ ์ฃผ์ž."

๐Ÿฃ ์˜์ฒ ์ด์˜ ํ‡ด๊ทผ ์ผ๊ธฐ

์˜ค๋Š˜ ๋“œ๋””์–ด RSC ๋ผ๋Š” ๋…€์„์˜ ์‹ค์ฒด๋ฅผ ์ข€ ์•Œ ๊ฒƒ ๊ฐ™์•„. ์ฒ˜์Œ์—” ์„œ๋ฒ„์—์„œ ๋‹ค ํ•ด๋ฒ„๋ฆฐ๋‹ค๊ธธ๋ž˜ "๋‚ด ์ผ์ž๋ฆฌ๊ฐ€ ์œ„ํ˜‘๋ฐ›๋Š” ๊ฑฐ ์•„๋ƒ?" ํ•˜๊ณ  ์ซ„์•˜๋Š”๋ฐ(๋†๋‹ด), ์•Œ๊ณ  ๋ณด๋‹ˆ ๋‚ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋‹ค์ด์–ดํŠธ๋ฅผ ๋„์™€์ฃผ๋Š” ๊ณ ๋งˆ์šด ์นœ๊ตฌ์˜€์–ด.

๐Ÿ’ก ์˜ค๋Š˜์˜ ๊ตํ›ˆ: "์ƒํ˜ธ์ž‘์šฉ ์—†์œผ๋ฉด ๋ฌด์กฐ๊ฑด ์„œ๋ฒ„๋กœ ๋ฐ€์–ด๋ผ. ์œ ์ €์˜ ๋ฐฐํ„ฐ๋ฆฌ๋Š” ์†Œ์ค‘ํ•˜๋‹ˆ๊นŒ!"

ํ•ญ์ƒ ๋ฌด๋š๋šํ•ด ๋ณด์ด๋Š” ์˜ํ˜ธ ๋ฆฌ๋“œ ๋‹˜ ์ด์ง€๋งŒ, ๋‚ด๊ฐ€ ์ง  ๋น„ํšจ์œจ์ ์ธ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  "์œ ์ €์˜ ๋ฐฐํ„ฐ๋ฆฌ๋„ ๋น„์šฉ์ด๋‹ค"๋ผ๊ณ  ๋ผˆ ๋•Œ๋ฆฌ๋Š” ์กฐ์–ธ์„ ํ•ด์ฃผ์‹ค ๋• ์ •๋ง ์‹œ๋‹ˆ์–ด์˜ ํฌ์Šค๊ฐ€ ๋А๊ปด์ ธ. ๋‚˜๋„ ์–ธ์  ๊ฐ€๋Š” ์˜ํ˜ธ ๋‹˜์ฒ˜๋Ÿผ ์›๋ฆฌ๋ฅผ ๊ฟฐ๋šซ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ณ  ์‹ถ๋‹ค. ์˜ค๋Š˜์€ ๋จธ๋ฆฌ๋ฅผ ๋„ˆ๋ฌด ๋งŽ์ด ์ผ๋”๋‹ˆ ๋ฐฐ๊ฐ€ ๊ณ ํ”„๋„ค. ์ง‘์— ๊ฐ€๋Š” ๊ธธ์— ๊ฐ“ ๊ตฌ์šด ๋ถ•์–ด๋นต์ด๋‚˜ ์‚ฌ ๋จน์–ด์•ผ์ง€! ๐Ÿฃ


๐Ÿ”— ๋” ์•Œ์•„๋ณด๊ธฐ