๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

[Hard] ๐Ÿ“„ Framework

1. Please explain and compare the advantages and disadvantages of SPA and SSRโ€‹

SPA์™€ SSR์˜ ์žฅ๋‹จ์ ์„ ์„ค๋ช…ํ•˜๊ณ  ๋น„๊ตํ•ด์ฃผ์„ธ์š”

SPA(์‹ฑ๊ธ€ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)โ€‹

SPA ์žฅ์ โ€‹

  1. ์‚ฌ์šฉ์ž ๊ฒฝํ—˜: SPA์˜ ๋ณธ์งˆ์€ ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€๋กœ, ๋ฐ์ดํ„ฐ๋ฅผ ๋™์ ์œผ๋กœ ๋กœ๋“œํ•˜๊ณ  ํ”„๋ก ํŠธ์—”๋“œ ๋ผ์šฐํŒ…์„ ๊ฒฐํ•ฉํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ํŽ˜์ด์ง€๊ฐ€ ์ „ํ™˜๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒŒ ํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” component๋งŒ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์‚ฌ์šฉ ๊ฒฝํ—˜์€ ๋” ๋งค๋„๋Ÿฝ๊ณ  ๋น ๋ฆ…๋‹ˆ๋‹ค.
  2. ํ”„๋ก ํŠธ์—”๋“œ-๋ฐฑ์—”๋“œ ๋ถ„๋ฆฌ: ํ”„๋ก ํŠธ์—”๋“œ๋Š” ํŽ˜์ด์ง€ ๋ Œ๋”๋ง๊ณผ ์ธํ„ฐ๋ž™์…˜๋งŒ ๋‹ด๋‹นํ•˜๊ณ  ๋ฐฑ์—”๋“œ๋Š” ๋ฐ์ดํ„ฐ API ์ œ๊ณต๋งŒ ํ•ฉ๋‹ˆ๋‹ค. ์–‘์ชฝ์˜ ๊ฐœ๋ฐœ ๋ถ€๋‹ด์„ ์ค„์ด๊ณ  ์œ ์ง€๋ณด์ˆ˜๋„ ์‰ฌ์›Œ์ง‘๋‹ˆ๋‹ค.
  3. ๋„คํŠธ์›Œํฌ ์ตœ์ ํ™”: ํŽ˜์ด์ง€๋ฅผ ํ•œ ๋ฒˆ๋งŒ ๋กœ๋“œํ•˜๋ฉด ๋˜๋ฏ€๋กœ ๊ธฐ์กด ๋ฉ€ํ‹ฐํŽ˜์ด์ง€ ๊ตฌ์กฐ์ฒ˜๋Ÿผ ๋งค๋ฒˆ ํŽ˜์ด์ง€ ์ „ํ™˜ ์‹œ ๋‹ค์‹œ ๋กœ๋“œํ•  ํ•„์š”๊ฐ€ ์—†์–ด ์š”์ฒญ ํšŸ์ˆ˜๊ฐ€ ์ค„์–ด๋“ค๊ณ  ์„œ๋ฒ„ ๋ถ€๋‹ด์ด ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค.

SPA ๋‹จ์ โ€‹

  1. SEO: SPA ํŽ˜์ด์ง€๋Š” ๋™์ ์œผ๋กœ ๋กœ๋“œ๋˜๋ฏ€๋กœ ๊ฒ€์ƒ‰ ์—”์ง„์ด ํŽ˜์ด์ง€ ๋‚ด์šฉ์„ ์ง์ ‘ ํฌ๋กค๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(์ตœ๊ทผ Google์ด ์ด ์ ์„ ๊ฐœ์„  ์ค‘์ด๋ผ๊ณ  ์ฃผ์žฅํ•˜์ง€๋งŒ). ๊ฒ€์ƒ‰ ์—”์ง„ ํฌ๋กค๋Ÿฌ ๋Œ€์‘์—์„œ๋Š” ๊ธฐ์กด HTML์— ๋ฏธ์น˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.
  2. ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ๊ฐ„: SPA๋Š” ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ JavaScript๋ฅผ ๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•œ ํ›„์—์•ผ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ดˆ๊ธฐ ๋กœ๋”ฉ ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง‘๋‹ˆ๋‹ค. ํŠนํžˆ ๋„คํŠธ์›Œํฌ ์ƒํ™ฉ์ด ์ข‹์ง€ ์•Š์„ ๋•Œ ์ง€์—ฐ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SSR(์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง)โ€‹

SSR ์žฅ์ โ€‹

  1. SEO: SSR์€ ์„œ๋ฒ„ ์ธก์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ํฌํ•จ๋œ ํŽ˜์ด์ง€๋ฅผ ๋ฏธ๋ฆฌ ๋ Œ๋”๋งํ•˜๋ฏ€๋กœ ๊ฒ€์ƒ‰ ์—”์ง„์ด ํŽ˜์ด์ง€ ๋‚ด์šฉ์„ ์ง์ ‘ ํฌ๋กค๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด SSR์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์ž…๋‹ˆ๋‹ค.
  2. ๋กœ๋”ฉ ์‹œ๊ฐ„: SSR์€ ์›๋ž˜์˜ ๋ Œ๋”๋ง ๋ถ€๋‹ด์„ ์„œ๋ฒ„ ์ธก์œผ๋กœ ์ด์ „ํ•˜์—ฌ ์ฒซ ๋ฐฉ๋ฌธ ์‹œ ๋ Œ๋”๋ง ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

SSR ๋‹จ์ โ€‹

  1. ํ•™์Šต ๋น„์šฉ๊ณผ ๋ณต์žก์„ฑ: Next์™€ Nuxt๋ฅผ ์˜ˆ๋กœ ๋“ค๋ฉด, ๋ณธ์งˆ์ ์œผ๋กœ React์™€ Vue๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์ง€๋งŒ ๊ฐ์ž์˜ ์ƒํƒœ๊ณ„๋ฅผ ๋ฐœ์ „์‹œ์ผœ ํ•™์Šต ๋น„์šฉ์ด ๋†’์•„์กŒ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ Next.js 14 ๊ฐœํŽธ์„ ๋ด๋„ ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋Ÿฐ ๋ณ€ํ™”๋ฅผ ๋ฐ›์•„๋“ค์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.
  2. ์„œ๋ฒ„ ๋ถ€๋‹ด: ๋ Œ๋”๋ง ์ž‘์—…์ด ์„œ๋ฒ„ ์ธก์œผ๋กœ ์ด์ „๋˜๋ฏ€๋กœ ํŠนํžˆ ๋†’์€ ํŠธ๋ž˜ํ”ฝ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์„œ๋ฒ„์— ๋” ํฐ ๋ถ€๋‹ด์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก โ€‹

์›์น™์ ์œผ๋กœ ๋ฐฑ์˜คํ”ผ์Šค ์‹œ์Šคํ…œ์—์„œ SEO ํ•„์š”๊ฐ€ ์—†๋‹ค๋ฉด SSR ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ์—”์ง„์— ์˜์กดํ•˜๋Š” ์ œํ’ˆ ์›นํŽ˜์ด์ง€๋ผ๋ฉด SSR ํ”„๋ ˆ์ž„์›Œํฌ ์ฑ„ํƒ์„ ํ‰๊ฐ€ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ์‚ฌ์šฉํ•ด๋ณธ Web Framework๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ์žฅ๋‹จ์ ์„ ๋น„๊ตํ•ด์ฃผ์„ธ์š”โ€‹

๋‘ ํ”„๋ ˆ์ž„์›Œํฌ ๋ชจ๋‘ ์ตœ๊ทผ "ํ•จ์ˆ˜ ๊ธฐ๋ฐ˜ ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ"๋กœ ์ˆ˜๋ ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค:

Vue 3๋Š” Composition API๋กœ ๋กœ์ง์„ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ composable๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค. React๋Š” Hooks๋ฅผ ํ•ต์‹ฌ์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์—์„œ ๋‘ ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ๋งค์šฐ ์œ ์‚ฌํ•˜์ง€๋งŒ ์ „์ฒด์ ์œผ๋กœ Vue์˜ ์ง„์ž… ์žฅ๋ฒฝ์ด ๋‚ฎ๊ณ , React๋Š” ์ƒํƒœ๊ณ„์™€ ์œ ์—ฐ์„ฑ์—์„œ ๊ฐ•ํ•ฉ๋‹ˆ๋‹ค.

Vue (Vue 3 ์ค‘์‹ฌ)โ€‹

์žฅ์ :

  • ํ•™์Šต ๊ณก์„ ์ด ์™„๋งŒ: SFC(Single File Component)๊ฐ€ template / script / style์„ ํ•œ๊ณณ์— ๋ชจ์•„ ๊ธฐ์กด ํ”„๋ก ํŠธ์—”๋“œ(๋ฐฑ์—”๋“œ ํ…œํ”Œ๋ฆฟ)์—์„œ ์ „ํ™˜ํ•˜๋Š” ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์นœ์ˆ™ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณต์‹ ๊ทœ์•ฝ์ด ๋ช…ํ™•ํ•˜์—ฌ ํŒ€์— ์œ ๋ฆฌ: ๊ณต์‹ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ์™€ ๊ด€๋ก€๊ฐ€ ๋ช…ํ™•ํ•˜์—ฌ ์ƒˆ ํŒ€์›์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ธ์ˆ˜ํ•  ๋•Œ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
  • ์ฝ”์–ด ์ƒํƒœ๊ณ„๊ฐ€ ์™„๋น„: ๊ณต์‹์—์„œ Vue Router, Pinia(๋˜๋Š” Vuex), CLI / Vite Plugin ๋“ฑ์„ ์œ ์ง€๋ณด์ˆ˜ํ•˜์—ฌ ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ๋ถ€ํ„ฐ ์ƒํƒœ ๊ด€๋ฆฌ, ๋ผ์šฐํŒ…๊นŒ์ง€ "๊ณต์‹ ํ•ด๋‹ต"์ด ์žˆ์–ด ๊ธฐ์ˆ  ์„ ํƒ ๋น„์šฉ์ด ์ค„์–ด๋“ญ๋‹ˆ๋‹ค.
  • Composition API๋กœ ์œ ์ง€๋ณด์ˆ˜์„ฑ ํ–ฅ์ƒ: ๊ธฐ๋Šฅ๋ณ„๋กœ composable(์˜ˆ: useAuth, useForm)์„ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์–ด ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์—์„œ ๋กœ์ง ๊ณต์œ ์™€ ์ค‘๋ณต ์ฝ”๋“œ ๊ฐ์†Œ๊ฐ€ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ :

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

Reactโ€‹

์žฅ์ :

  • ์ƒํƒœ๊ณ„๊ฐ€ ๊ฑฐ๋Œ€ํ•˜๊ณ  ๊ธฐ์ˆ  ์—…๋ฐ์ดํŠธ ์†๋„๊ฐ€ ๋น ๋ฆ„: ๊ฑฐ์˜ ๋ชจ๋“  ํ”„๋ก ํŠธ์—”๋“œ ์‹ ๊ธฐ์ˆ , ๋””์ž์ธ ์‹œ์Šคํ…œ, ์„œ๋“œํŒŒํ‹ฐ ์„œ๋น„์Šค๊ฐ€ React ๋ฒ„์ „์„ ์šฐ์„  ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ์œ ์—ฐ์„ฑ์ด ๋†’๊ณ  ํ”„๋กœ์ ํŠธ์— ๋งž๊ฒŒ ๊ธฐ์ˆ  ์Šคํƒ์„ ์ž์œ ๋กญ๊ฒŒ ์กฐํ•ฉ ๊ฐ€๋Šฅ: Redux / Zustand / Recoil ๋“ฑ ๋‹ค์–‘ํ•œ ์ƒํƒœ ๊ด€๋ฆฌ์™€ ์กฐํ•ฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ Next.js, Remix ๋“ฑ์˜ Meta Framework๋„ ์žˆ์–ด SPA๋ถ€ํ„ฐ SSR, SSG, CSR๊นŒ์ง€ ์„ฑ์ˆ™ํ•œ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • TypeScript ๋ฐ ํ”„๋ก ํŠธ์—”๋“œ ์—”์ง€๋‹ˆ์–ด๋ง๊ณผ์˜ ํ†ตํ•ฉ์ด ์„ฑ์ˆ™: ํƒ€์ž…๊ณผ ๋Œ€๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋ฒ” ์‚ฌ๋ก€์— ๋Œ€ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ ๋…ผ์˜๊ฐ€ ํ’๋ถ€ํ•˜์—ฌ ์žฅ๊ธฐ ์œ ์ง€๋ณด์ˆ˜ ํ”„๋กœ์ ํŠธ์— ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

๋‹จ์ :

  • ์ž์œ ๋„๊ฐ€ ๋†’์•„ ํŒ€ ์ž์ฒด ๊ทœ๋ฒ”์ด ํ•„์š”: ๋ช…ํ™•ํ•œ ์ฝ”๋”ฉ ์Šคํƒ€์ผ์ด๋‚˜ ์•„ํ‚คํ…์ฒ˜ ๊ทœ์•ฝ ์—†์ด๋Š” ๊ฐœ๋ฐœ์ž๋งˆ๋‹ค ์™„์ „ํžˆ ๋‹ค๋ฅธ ์ž‘์„ฑ ๋ฐฉ์‹๊ณผ ์ƒํƒœ ๊ด€๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ํ•™์Šต ๊ณก์„ ์ด ์‹ค์ œ๋กœ ๋‚ฎ์ง€ ์•Š์Œ: React ์ž์ฒด(JSX, Hooks ์‚ฌ๊ณ ๋ฐฉ์‹) ์™ธ์— Router, ์ƒํƒœ ๊ด€๋ฆฌ, ๋ฐ์ดํ„ฐ ํŽ˜์นญ, SSR ๋“ฑ ์ผ๋ จ์˜ ๊ธฐ์ˆ  ์„ ํƒ์— ์ง๋ฉดํ•˜์—ฌ ์ดˆ๋ณด์ž๊ฐ€ "์–ด๋–ค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ ํƒํ•ด์•ผ ํ•˜๋Š”์ง€" ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œํ•˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
  • API ๋ณ€๊ฒฝ๊ณผ ๋ชจ๋ฒ” ์‚ฌ๋ก€ ์ง„ํ™”๊ฐ€ ๋น ๋ฆ„: Class Component์—์„œ Function Component + Hooks, ๋‹ค์‹œ Server Components๋กœ์˜ ์ „ํ™˜ ๋“ฑ, ์ด์ „ ํ”„๋กœ์ ํŠธ์™€ ์ƒˆ๋กœ์šด ์ž‘์„ฑ ๋ฐฉ์‹์ด ๊ณต์กดํ•  ๋•Œ ์ถ”๊ฐ€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๊ณผ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.