๐Ÿค” ์งˆ๋ฌธ: children vs <Outlet /> ์ฐจ์ด๊ฐ€ ๋ญ”๊ฐ€์š”?

๋‘˜ ๋‹ค **โ€œ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ’ˆ์–ด์ค€๋‹ค(๋ Œ๋”๋งํ•œ๋‹ค)โ€œ**๋Š” ์ ์—์„œ๋Š” ๊ฐ™์ง€๋งŒ, **โ€œ๋ˆ„๊ฐ€ ๋‚ด์šฉ์„ ๊ฒฐ์ •ํ•˜๋Š”๊ฐ€?โ€**๊ฐ€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

1. children (AuthLayout) = โ€œ์•ก์žโ€ ๐Ÿ–ผ๏ธ

  • ๋ฐฉ์‹: ์ง์ ‘ ๋ผ์›Œ ๋„ฃ๊ธฐ (Component Composition)

  • ์ฃผ์ฒด: **๋ถ€๋ชจ ํŽ˜์ด์ง€(SigninPage)**๊ฐ€ ๊ฒฐ์ •ํ•จ.

  • ์„ค๋ช…: SigninPage ์•ˆ์—์„œ <AuthLayout>์„ ์“ฐ๋ฉด์„œ, ๊ทธ ์‚ฌ์ด์— ํผ์„ ๋ผ์›Œ ๋„ฃ์—ˆ์ฃ ?

    TypeScript

    // SigninPage๊ฐ€ ์ง์ ‘ ๋งํ•จ: "AuthLayout ์•ก์ž ์•ˆ์— ์ด <form>์„ ๋„ฃ์–ด์ค˜!"
    <AuthLayout>
       <form>...</form> 
    </AuthLayout>
    
  • ์šฉ๋„: ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ UI ๊ป๋ฐ๊ธฐ(๋ชจ๋‹ฌ, ์นด๋“œ, ๋ ˆ์ด์•„์›ƒ ๋“ฑ)๋ฅผ ๋งŒ๋“ค ๋•Œ ์”๋‹ˆ๋‹ค.

2. <Outlet /> (MainLayout) = โ€œ์ฝ˜์„ผํŠธ/๊ตฌ๋ฉโ€ ๐Ÿ”Œ

  • ๋ฐฉ์‹: ๋ผ์šฐํŒ…์— ์˜ํ•œ ์ฃผ์ž… (Router Outlet)

  • ์ฃผ์ฒด: **URL(์ฃผ์†Œ์ฐฝ)**๊ณผ **App.tsx(๋ผ์šฐํ„ฐ)**๊ฐ€ ๊ฒฐ์ •ํ•จ.

  • ์„ค๋ช…: MainLayout ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๊ทธ ์•ˆ์— ๋ญ๊ฐ€ ๋“ค์–ด๊ฐˆ์ง€ ์ „ํ˜€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๊ตฌ๋ฉ(Outlet)๋งŒ ๋šซ๋ ค ์žˆ์ฃ .

    TypeScript

    // MainLayout์€ ๋ชจ๋ฆ„: "๋‚œ ๊ทธ๋ƒฅ ๊ตฌ๋ฉ๋งŒ ๋šซ์–ด๋†“์„๊ฒŒ. URL์— ๋งž๋Š” ์• ๊ฐ€ ์™€์„œ ๊ฝ‚ํžˆ๊ฒ ์ง€."
    <div className="content">
       <Outlet /> 
    </div>
    

    URL์ด /์ด๋ฉด MainPage๊ฐ€ ๊ฝ‚ํžˆ๊ณ , /interview๋ฉด InterviewPage๊ฐ€ ๊ฝ‚ํžˆ๋Š” ์‹์ž…๋‹ˆ๋‹ค.

  • ์šฉ๋„: ํŽ˜์ด์ง€ ์ „์ฒด์˜ ๊ตฌ์กฐ(ํ—ค๋”, ์‚ฌ์ด๋“œ๋ฐ” ๊ณ ์ •)๋ฅผ ์žก๊ณ , ๋‚ด์šฉ๋ฌผ๋งŒ ๊ฐˆ์•„ ๋ผ์šธ ๋•Œ ์”๋‹ˆ๋‹ค.

์š”์•ฝ:

  • children: ์ฝ”๋“œ๋ฅผ ์งœ๋Š” ๋‚ด๊ฐ€ โ€œ์ด ์•ˆ์— ์ด๊ฑฐ ๋„ฃ์–ด!โ€ ํ•˜๊ณ  ์ง์ ‘ ๋„ฃ๋Š” ๊ฒƒ.

  • <Outlet />: URL ์ฃผ์†Œ์— ๋”ฐ๋ผ ์ž๋™์œผ๋กœ ๋ฐ”๋€Œ๋Š” ํ™”๋ฉด์ด ๋“ค์–ด์˜ค๋Š” ๊ตฌ๋ฉ.


์ •๋ง ํ•ต์‹ฌ์„ ์ฐŒ๋ฅด๋Š” ์˜ˆ๋ฆฌํ•œ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค! ํ”„๋ก ํŠธ์—”๋“œ ๋ฉด์ ‘์—์„œ ๋‹จ๊ณจ๋กœ ๋‚˜์˜ค๋Š” **โ€œ๋ฆฌ์•กํŠธ ๋ Œ๋”๋ง ์ตœ์ ํ™”โ€**์™€ ์ง๊ฒฐ๋˜๋Š” ๋‚ด์šฉ์ด๊ฑฐ๋“ ์š”.

๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋ง์”€๋“œ๋ฆฌ๋ฉด, ๋ Œ๋”๋ง ํšจ์œจ(์„ฑ๋Šฅ)์€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. <Outlet> ๋ฐฉ์‹์ด ์••๋„์ ์œผ๋กœ ๋” ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค. ์„ ์ƒ๋‹˜์ด ์ž‘์„ฑํ•˜์‹  ์ฝ”๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‘ ๋ฐฉ์‹์˜ ๋ Œ๋”๋ง ํšจ์œจ์ด ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ์•„์ฃผ ์‰ฝ๊ฒŒ ๋น„๊ตํ•ด ๋“œ๋ฆด๊ฒŒ์š”.


1. ๐Ÿ”Œ <Outlet> ๋ฐฉ์‹ (MainLayout): โ€œ์ฒ ์ €ํ•œ ๊ฒฉ๋ฆฌโ€ (๊ณ ํšจ์œจ)

MainLayout์€ ๋ผ์šฐํ„ฐ๊ฐ€ ์ตœ์ƒ๋‹จ์—์„œ ํ•œ ๋ฒˆ ๋ Œ๋”๋งํ•ด ๋‘” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

๋งŒ์•ฝ ์•ž์œผ๋กœ ๋งŒ๋“ค InterviewPage ์•ˆ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ต๋ณ€์„ ๋ง‰ ํƒ€์ดํ•‘ํ•œ๋‹ค๊ณ  ์ƒ์ƒํ•ด ๋ณด์„ธ์š”. useState์˜ ๊ฐ’์ด ๋ณ€ํ•˜๋‹ˆ๊นŒ ํ™”๋ฉด์ด ๋‹ค์‹œ ๊ทธ๋ ค์ ธ์•ผ(Re-render) ํ•˜๊ฒ ์ฃ ?

  • ๋ Œ๋”๋ง ๋ฒ”์œ„: InterviewPage ๋‚ด๋ถ€๋งŒ ๋‹ค์‹œ ๊ทธ๋ ค์ง‘๋‹ˆ๋‹ค.

  • ๋ณดํ˜ธ๋ฐ›๋Š” ์˜์—ญ: ๋ฐ”๊นฅ์— ์žˆ๋Š” MainLayout, Sidebar, Header๋Š” ์ „ํ˜€ ํƒ€๊ฒฉ์„ ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. (์žฌ๋ Œ๋”๋ง ์•ˆ ๋จ)

  • ํšจ์œจ์„ฑ: โญ๏ธโญ๏ธโญ๏ธโญ๏ธโญ๏ธ (์ตœ์ƒ)

  • ๊ฒฐ๋ก : ๋งŒ์•ฝ ๋ฉด์ ‘ ํŽ˜์ด์ง€์—์„œ ํƒ€์ดํ•‘ํ•  ๋•Œ๋งˆ๋‹ค ๋ฌด๊ฑฐ์šด ์‚ฌ์ด๋“œ๋ฐ”๋‚˜ ํ—ค๋”๊นŒ์ง€ ๋‹ค์‹œ ๊ทธ๋ ค์ง„๋‹ค๋ฉด ํ™”๋ฉด์ด ๋ฒ„๋ฒ…๊ฑฐ๋ฆด ๊ฒ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋ฌด๊ฑฐ์šด ๊ธ€๋กœ๋ฒŒ ๋ ˆ์ด์•„์›ƒ์€ ๋ฌด์กฐ๊ฑด <Outlet>์„ ์จ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

2. ๐Ÿ–ผ๏ธ children ๋ฐฉ์‹ (AuthLayout): โ€œ์šด๋ช… ๊ณต๋™์ฒดโ€ (์ €ํšจ์œจ)

๋ฐ˜๋ฉด, ์„ ์ƒ๋‹˜์ด ์งœ์‹  SigninPage ์ฝ”๋“œ๋ฅผ ๋‹ค์‹œ ๋– ์˜ฌ๋ ค๋ณด์„ธ์š”. SigninPage ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ email๊ณผ password ์ƒํƒœ(State)๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๊ณ , ๊ทธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ AuthLayout์„ ํ˜ธ์ถœํ•ด์„œ ํผ์„ ๊ฐ์‹ธ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์ด๋ฉ”์ผ ์ž…๋ ฅ์ฐฝ์— a, b, c๋ฅผ ํƒ€์ดํ•‘ํ•  ๋•Œ๋งˆ๋‹ค ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ ๊นŒ์š”?

  • ๋ Œ๋”๋ง ๋ฒ”์œ„: SigninPage์˜ ์ƒํƒœ๊ฐ€ ๋ณ€ํ–ˆ์œผ๋ฏ€๋กœ, SigninPage ์ „์ฒด๊ฐ€ ๋‹ค์‹œ ๊ทธ๋ ค์ง‘๋‹ˆ๋‹ค.

  • ํ”ผํ•ด(?) ์˜์—ญ: SigninPage๊ฐ€ ๋ฆฌํ„ดํ•˜๊ณ  ์žˆ๋Š” AuthLayout ๊ป๋ฐ๊ธฐ๊นŒ์ง€ ๋งค๋ฒˆ ์ƒˆ๋กญ๊ฒŒ ๋‹ค์‹œ ๊ทธ๋ ค์ง‘๋‹ˆ๋‹ค.

  • ํšจ์œจ์„ฑ: โญ๏ธโญ๏ธ (๋‚ฎ์Œ)


๐Ÿค” โ€œํ—‰, ๊ทธ๋Ÿผ AuthLayout๋„ Outlet์œผ๋กœ ๋ฐ”๊ฟ”์•ผ ํ•˜๋Š” ๊ฑฐ ์•„๋‹ˆ์•ผ?โ€

์•„๋‹™๋‹ˆ๋‹ค! ์ง€๊ธˆ ๊ทธ๋Œ€๋กœ ๋‘์‹œ๋Š” ๊ฒŒ ์ •๋‹ต์ž…๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๊ฐ€๋ฒผ์›€: AuthLayout์€ ๊ธฐ๊ปํ•ด์•ผ ๋ฐฐ๊ฒฝ์ƒ‰ ์กฐ๊ธˆ ์น ํ•ด์ง„ ๋นˆ ๋ฐ•์Šค์™€ ๋กœ๊ณ  ํ…์ŠคํŠธ๋ฟ์ž…๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ ์ž…์žฅ์—์„œ ์ด ์ •๋„ ๋ฐ•์Šค๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๊ฑด 0.0001์ดˆ๋„ ์•ˆ ๊ฑธ๋ฆฌ๋Š” ์•„์ฃผ ๊ฐ€๋ฒผ์šด ์ž‘์—…์ด๋ผ ์„ฑ๋Šฅ์— ์•„๋ฌด๋Ÿฐ ์ง€์žฅ์ด ์—†์Šต๋‹ˆ๋‹ค.

  2. ํŠธ๋ ˆ์ด๋“œ์˜คํ”„ (Trade-off): ์„ฑ๋Šฅ์„ ์•„์ฃผ ๋ฏธ์„ธํ•˜๊ฒŒ ์†ํ•ด ๋ณด๋Š” ๋Œ€์‹ , **โ€œํŽ˜์ด์ง€๋งˆ๋‹ค ์ œ๋ชฉ๊ณผ ๋งํฌ๋ฅผ ๋งˆ์Œ๋Œ€๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ์—„์ฒญ๋‚œ ์œ ์—ฐ์„ฑโ€**์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. (SignupPage์—์„œ๋Š” โ€œExecute Signupโ€์œผ๋กœ ์‰ฝ๊ฒŒ ๋ฐ”๊ฟจ์ฃ ?)

๐Ÿ‘จโ€๐Ÿ’ป ์ตœ์ข… ์š”์•ฝ (๋ฉด์ ‘ ๋‹ต๋ณ€์šฉ)

  • MainLayout (<Outlet>): ์„œ๋น„์Šค์˜ ๋ผˆ๋Œ€์ž…๋‹ˆ๋‹ค. ์ƒํƒœ ๋ณ€ํ™”๊ฐ€ ์žฆ์€ ์ฝ˜ํ…์ธ (ํƒ€์ด๋จธ, ์ฝ”๋“œ ์—๋””ํ„ฐ, ์ฑ„ํŒ… ๋“ฑ)๊ฐ€ ๋ ˆ์ด์•„์›ƒ ์ „์ฒด๋ฅผ ๋ฆฌ๋ Œ๋”๋ง ์‹œํ‚ค๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ด€์ ์—์„œ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

  • AuthLayout (children): ๋กœ๊ทธ์ธ/ํšŒ์›๊ฐ€์ž…์€ ํŽ˜์ด์ง€ ์ž์ฒด๊ฐ€ ๊ฐ€๋ณ๊ณ  ํƒ€์ดํ•‘ ์™ธ์˜ ๋ณต์žกํ•œ ์ƒํƒœ ๋ณ€ํ™”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฏธ์„ธํ•œ ๋ Œ๋”๋ง ์†ํ•ด๋ฅผ ๊ฐ์ˆ˜ํ•˜๋”๋ผ๋„, **์ปดํฌ๋„ŒํŠธ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์—ฐ์„ฑ(Props ์ฃผ์ž…)**์„ ์–ป๊ธฐ ์œ„ํ•ด ํ•ฉ์„ฑ ํŒจํ„ด์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.