Frontend ๐Ÿ“š/React

[React] SPA, SSR, SEO etc.

leejaejae 2024. 7. 5. 18:50

1. SPA
2. SSR
3. SEO


1. SPA๋ž€ โญ๏ธ

  • SPA
    • Single Page Application์˜ ์•ฝ์–ด๋กœ, ํ•œ ๊ฐœ์˜ ํŽ˜์ด์ง€๋กœ ์ด๋ฃจ์–ด์ง„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ผ๋Š” ์˜๋ฏธ

  • ์ „ํ†ต์ ์ธ ์›น ํŽ˜์ด์ง€๋Š” ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š”๋ฐ, ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ๋•Œ๋งˆ๋‹ค ์ƒˆ๋กœ์šด html์„ ๋ฐ›์•„ ์˜ค๊ณ , ํŽ˜์ด์ง€๋ฅผ ๋กœ๋”ฉํ•  ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„์—์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ํ•ด์„ํ•œ ๋’ค ํ™”๋ฉด์— ๋ณด์—ฌ์คŒ
  • ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์ด๋Š” ํ™”๋ฉด์€ ์„œ๋ฒ„ ์ธก์—์„œ ์ค€๋น„ํ–ˆ๋‹จ ๋ง์”€! ์‚ฌ์ „์— html ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด์„œ ์ œ๊ณตํ•˜๊ฑฐ๋‚˜, ๋ฐ์ดํ„ฐ์— ๋”ฐ๋ผ ์œ ๋™์ ์ธ html์„ ์ƒ์„ฑํ•ด์ฃผ๋Š” ํ…œํ”Œ๋ฆฟ ์—”์ง„์„ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ–ˆ์Œ

  • ํ•˜์ง€๋งŒ!! ์š”์ฆ˜์—” ์›น์—์„œ ์ œ๊ณต๋˜๋Š” ์ •๋ณด๊ฐ€ ๋„ˆ๋ฌด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ํ™”๋ฉด์„ ๋ณด์—ฌ ์ฃผ์–ด์•ผ ํ•  ๋•Œ๋งˆ๋‹ค ์„œ๋ฒ„ ์ธก์—์„œ ๋ชจ๋“  ๋ทฐ๋ฅผ ์ค€๋น„ํ•˜๋ฉด ์„ฑ๋Šฅ์ด ์—„์ฒญ ๋–จ์–ด์งˆ ์ˆ˜ ์žˆ์Œ(ํŠธ๋ž˜ํ”ฝ์ด ๋„ˆ๋ฌด ๋งŽ์ด ๋‚˜์˜จ๋‹ค๊ฑฐ๋‚˜, ์‚ฌ์šฉ์ž๊ฐ€ ๋ชฐ๋ ค์„œ ์„œ๋ฒ„์— ๋†’์€ ๋ถ€ํ•˜๊ฐ€ ์‰ฝ๊ฒŒ ๊ฑธ๋ฆฐ๋‹ค๊ฑฐ๋‚˜)

 

์‚ฌ์šฉ์ž์™€์˜ ์ธํ„ฐ๋ ‰์…˜์ด ๋ฐœ์ƒํ•˜๋ฉด ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—…๋ฐ์ดํŠธ(JSON ํ˜•์‹์œผ๋กœ ์š”์ฒญ)

  • ๊ทธ๋ž˜์„œ ๋ฆฌ์•กํŠธ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ˜น์€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•ด ๋ทฐ(view)๋ Œ๋”๋ง์„ ์‚ฌ์šฉ์ž์˜ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋‹ด๋‹นํ•˜๋„๋ก ํ•˜๊ณ ,
  • ์šฐ์„  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ธŒ๋ผ์šฐ์ €์— ๋ถˆ๋Ÿฌ์™€์„œ ์‹คํ–‰์‹œํ‚จ ํ›„์— ์‚ฌ์šฉ์ž์™€์˜ ์ธํ„ฐ๋ ‰์…˜์ด ๋ฐœ์ƒํ•˜๋ฉด ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—…๋ฐ์ดํŠธํ•ด์คŒ
  • ๋งŒ์•ฝ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๋ฉด ์„œ๋ฒ„ API๋ฅผ ํ˜ธ์ถœํ•ด ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์ƒˆ๋กœ ๋ถˆ๋Ÿฌ์™€์„œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜๋„ ์žˆ์Œ


  • ์‹ฑ๊ธ€ ํŽ˜์ด์ง€๋ผ๊ณ  ํ•ด์„œ ํ™”๋ฉด์ด ํ•œ ์ข…๋ฅ˜์ธ ๊ฒƒ์€ ์•„๋‹˜
    • SPA์˜ ๊ฒฝ์šฐ ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๋Š” ํŽ˜์ด์ง€๋Š” ํ•œ ์ข…๋ฅ˜์ด์ง€๋งŒ, ํ•ด๋‹น ํŽ˜์ด์ง€์—์„œ ๋กœ๋”ฉ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ํ˜„์žฌ ์‚ฌ์šฉ์ž ๋ธŒ๋ผ์šฐ์ €์˜ ์ฃผ์†Œ ์ƒํƒœ์— ๋”ฐ๋ผ ๋‹ค์–‘ํ•œ ํ™”๋ฉด์„ ๋ณด์—ฌ ์ค„ ์ˆ˜ ์žˆ์Œ
  • ๋‹ค๋ฅธ ์ฃผ์†Œ์— ๋‹ค๋ฅธ ํ™”๋ฉด์„ ๋ณด์—ฌ ์ฃผ๋Š” ๊ฒƒ์„ ๋ผ์šฐํŒ…์ด๋ผ๊ณ  ํ•จ
  • ๋ฆฌ์•กํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด์— ์ด ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—, ๋ธŒ๋ผ์šฐ์ €์˜ API๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋ฅผ ๊ด€๋ฆฌํ•˜๊ฑฐ๋‚˜, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ์ด ์ž‘์—…์„ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Œ
    • ๋ฆฌ์•กํŠธ ๋ผ์šฐํŒ… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ(react-router), ๋ฆฌ์น˜ ๋ผ์šฐํ„ฐ(reach-router), Next.js ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด๋Ÿฌํ•œ ๋ฆฌ์•กํŠธ ๋ผ์šฐํŒ… ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ดํŠธ์—์„œ ์ด๋ฃจ์–ด์ง€๋Š” ๋ผ์šฐํŒ…์„ ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์คŒ


  • SPA์˜ ๋‹จ์ 
    • ์•ฑ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋ฉด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ๋„ˆ๋ฌด ์ปค์ง„๋‹ค๋Š” ์ 
    • ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์‹œ ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋Š” ํŽ˜์ด์ง€์˜ ์Šคํฌ๋ฆฝํŠธ๋„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋•Œ๋ฌธ์ž„
    • ๊ทผ๋ฐ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…(code splitting) ์‚ฌ์šฉํ•˜๋ฉด ๋ผ์šฐํŠธ๋ณ„๋กœ ํŒŒ์ผ๋“ค์„ ๋‚˜๋ˆ ์„œ ํŠธ๋ž˜ํ”ฝ์ด๋ž‘ ๋กœ๋”ฉ ์†๋„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Œ ~

    • ๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ์ฒ˜๋Ÿผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ด ๋ผ์šฐํŒ…์„ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š” ์ผ๋ฐ˜ ํฌ๋กค๋Ÿฌ์—์„œ๋Š” ํŽ˜์ด์ง€์˜ ์ •๋ณด๋ฅผ ์ œ๋Œ€๋กœ ์ˆ˜์ง‘ํ•ด ๊ฐ€์ง€ ๋ชปํ•œ๋‹ค๋Š” ์ž ์žฌ์ ์ธ ๋‹จ์ ์ด ๋”ฐ๋ฆ„
    • ๋”ฐ๋ผ์„œ ๊ตฌ๊ธ€, ๋„ค์ด๋ฒ„, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒ€์ƒ‰ ์—”์ง„์˜ ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ์— ํŽ˜์ด์ง€๊ฐ€ ์ž˜ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Œ
    • ๋˜ํ•œ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‹คํ–‰๋  ๋•Œ๊นŒ์ง€ ํŽ˜์ด์ง€๊ฐ€ ๋น„์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์ด ๋กœ๋”ฉ๋˜์–ด ์‹คํ–‰๋˜๋Š” ์งง์€ ์‹œ๊ฐ„ ๋™์•ˆ ํฐ ํŽ˜์ด์ง€๊ฐ€ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ๋„ ์žˆ์Œ

    • ๊ทธ๋ ‡์ง€๋งŒ ์ด๋Ÿฐ ๋ฌธ์ œ์ ์€ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR, server-side-rendering)์„ ํ†ตํ•ด ๋ชจ๋‘ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ ~

 

2. SSR์ด๋ž€ โญ๏ธ

  • SSR
    • Server Side Rendering์˜ ์•ฝ์ž๋กœ, ์„œ๋ฒ„์—์„œ ํŽ˜์ด์ง€๋ฅผ ๊ทธ๋ ค ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)๋กœ ๋ณด๋‚ธ ํ›„ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๋Š” ๊ธฐ๋ฒ•

  • ๋ฆฌ์•กํŠธ๋Š” ๋Œ€ํ‘œ์ ์ธ CSR(client side rendering)์ž„
    • CSR: ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ๋„๋ฉ”์ธ์— ์ ‘์†ํ•˜๋ฉด, ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„(์‚ฌ์šฉ์ž์˜ ์ปดํ“จํ„ฐ)๊ฐ€ html๊ณผ js๋“ฑ์˜ ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›์•„ ๋ณด์—ฌ์ฃผ๋Š” ํ˜•์‹
  • ์ด๋Ÿฌํ•œ ๋ฆฌ์•กํŠธ์˜ CSR์ ์ธ ๋ถ€๋ถ„์—์„œ SSR์ ์œผ๋กœ ๋ฐ”๊ฟ” ์ฃผ๊ธฐ ์œ„ํ•ด next.js์™€ ๊ฐ™์€ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉ
    • SSR์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ€์žฅ ํฐ ์ด์œ ๋Š” ํšจ์œจ์ ์ธ SEO๋ฅผ ์œ„ํ•ด์„œ
    • SEO: google, naver์™€ ๊ฐ™์€ ๊ฒ€์ƒ‰ ์—”์ง„๋“ค์ด ๋‚ด ์›น์‚ฌ์ดํŠธ์—์„œ html ํƒœ๊ทธ ์•ˆ์˜ ๋‚ด์šฉ์„(title, meta-data etc.) ๋ถ„์„ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์•Œ๋งž์€(์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š”) ์ •๋ณด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ
  • CSR ์ƒํƒœ์—์„  ์‚ฌ์ „์— html์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๊ฒ€์ƒ‰ ์—”์ง„์— ๋…ธ์ถœ๋˜๋Š” ๋นˆ๋„๊ฐ€ ํ˜„์ €ํžˆ ์ ๊ฑฐ๋‚˜, ๋ธŒ๋ผ์šฐ์ €์— ๋”ฐ๋ผ ๊ฒ€์ƒ‰ ์—”์ง„์— ํ•ด๋‹น ์ •๋ณด๊ฐ€ ๋…ธ์ถœ๋˜์ง€ ์•Š์•„ ๊ฒ€์ƒ‰์„ ํ•ด๋„ ๋‚˜์˜ค์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Œ(๋„๋ฉ”์ธ์„ ํ†ตํ•ด ์ ‘์†ํ•˜๋Š” ๊ฒƒ์€ ๊ฐ€๋Šฅํ•ด์ง€๋Š” ์ •๋„, ํ•ด๋‹น ์‚ฌ์ดํŠธ์— ๊ด€๋ จ๋œ ์ •๋ณด๋ฅผ ๊ฒ€์ƒ‰ ์—”์ง„์ด ํฌ๋กค๋งํ•˜์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ์Œ)
  • ๊ทธ๋ž˜์„œ SSR์„ ํ†ตํ•ด ์„œ๋ฒ„๊ฐ€ ์‚ฌ์ „์— html๊ณผ ์ผ๋ถ€ jsํŒŒ์ผ์„ ๋„˜๊ฒจ์ฃผ๊ฒŒ ๋˜๋ฉด, ๊ฒ€์ƒ‰ ์—”์ง„์—์„œ ์ด๋ฅผ ์บ์น˜ํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ์‚ฌ์ดํŠธ๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ


  • SSR์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ๋ฆฌ์•กํŠธ API
    • renderToString
      - ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜์—ฌ ์ •์  html ๋ฌธ์ž์—ด์„ ๋ฐ˜ํ™˜
      - SSR ์‹œ ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” API

    • renderToStaticMarkup
      - renderToString๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ, ์ผ๋ถ€ ๋ฆฌ์•กํŠธ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Œ
      - ์ •์  ํŽ˜์ด์ง€ ์ƒ์„ฑ ์‹œ ์‚ฌ์šฉ

    • renderToNodeStream > renderToPipeableStream
      - ๋ฆฌ์•กํฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•˜์—ฌ Node.js ์ŠคํŠธ๋ฆผ์„ ๋ฐ˜ํ™˜
      - ๋Œ€์šฉ๋Ÿ‰ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋”๋‚˜ ํ”„๋ก์‹œ ์„œ๋ฒ„์—์„œ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Œ
      - React 18 ๋ฒ„์ „์—์„œ renderToPipeableStream ์œผ๋กœ ๋ฉ”์„œ๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋จ

    • renderToStaticNodeStream
      - renderToNodeStream๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ, ๋ฐ์ดํ„ฐ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š์Œ
      - ์ •์  ํŽ˜์ด์ง€ ์ƒ์„ฑ ์‹œ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ Œ๋”๋ง์— ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Œ

    • hydrate
      - ์„œ๋ฒ„์—์„œ ๋ Œ๋”๋ง๋œ html ์ฝ”๋“œ๋ฅผ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ธ์‹ํ•˜๊ณ  ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์—ญํ• 
      - ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ์„œ๋ฒ„ ๋ Œ๋”๋ง ๋งˆํฌ์—…์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์—ฐ๊ฒฐํ•  ๋•Œ ์‚ฌ์šฉ
      - ์ด๋ฏธ ๋ Œ๋”๋ง๋œ html์ด ์žˆ๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— ์ž‘์—…์„ ์ˆ˜ํ–‰
      - renderToString, renderToNodeStream ๋“ฑ์œผ๋กœ ์ƒ์„ฑ๋œ html ์ปจํ…์ธ ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•ธ๋“ค๋Ÿฌ๋‚˜ ์ด๋ฒคํŠธ๋ฅผ ๋ถ™์ด๋Š” ์—ญํ• 

 

3. SEO๋ž€ โญ๏ธ

  • SEO(๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”)
    • Search Engine Optimization์˜ ์•ฝ์ž๋กœ, goole, ๋„ค์ด๋ฒ„์™€ ๊ฐ™์€ ๊ฒ€์ƒ‰ ์—”์ง„๋“ค์ด ์„œ๋ฒ„์— ๋“ฑ๋ก๋œ ์›น์‚ฌ์ดํŠธ๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜์”ฉ ๋Œ์•„ ๋‹ค๋‹ˆ๋ฉด์„œ ์›น์‚ฌ์ดํŠธ์˜ HTML ๋ฌธ์„œ๋ฅผ ๋ถ„์„ํ•ด์คŒ
    • ์ด๋•Œ html์— ์‚ฌ์šฉ๋œ ํƒœ๊ทธ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒ€์ƒ‰ํ•  ๋•Œ, ์›น์‚ฌ์ดํŠธ๋ฅผ ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์คŒ

  • ํ•˜์ง€๋งŒ, 
    • CSR์—์„œ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋Š” html์˜ body๋Š” ํ……ํ…… ๋น„์–ด ์žˆ๋‹ค๊ฐ€(div id="root"์˜ ๋ฆฌ์•กํŠธ ํŠน์„ฑ) ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น ๋„๋ฉ”์ธ์„ ์‚ฌ์ง„ ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•˜๋ฉด ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„์—์„œ js๋ฐ html ํƒœ๊ทธ๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋Š” ํ˜•์‹์ด๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์ „์— html ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์•„ ๊ฒ€์ƒ‰ ์—”์ง„์ด ํ•ด๋‹น ๋„๋ฉ”์ธ์— ์ ‘๊ทผํ•  ๋•Œ ์–ด๋ ค์›€์ด ์žˆ์Œ
    • โž” ์‚ฌ์ดํŠธ๋ฅผ ๊ฒ€์ƒ‰ ์—”์ง„์œผ๋กœ ๋‹ค์–‘ํ•œ ํ‚ค์›Œ๋“œ๋ฅผ ํ†ตํ•ด ์œ ์ž…๋˜๋Š” ๊ฒƒ์ด ํž˜๋“ค๋‹ค → why? ๊ฒ€์ƒ‰ ์—”์ง„์ด ์šฐ๋ฆฌ htmlํŒŒ์ผ์„ ๋ถ„์„ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ → why? CSR ํ˜•์‹์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ ‘๊ทผํ•ด์•ผ html, js ๋“ฑ์˜ ํŒŒ์ผ์„ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋•Œ๋ฌธ
  • ๋”ฐ๋ผ์„œ ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”๋ฅผ ํ•ด์ฃผ๊ธฐ ์œ„ํ•ด SSR์„ ์‚ฌ์šฉํ•ด ์‚ฌ์ „์— html ๋ฌธ์„œ๋ฅผ ๊ฒ€์ƒ‰ ์—”์ง„์ด ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•˜์—ฌ SEO๋ฅผ ํ–ฅ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Œ
    • SSR์€ ์„œ๋ฒ„์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ์‚ฌ์ „์— html ํŒŒ์ผ์„ ๋งŒ๋“ค๊ฒŒ ๋˜๊ณ  ์ด๋ ‡๊ฒŒ ๋งŒ๋“ค์–ด์ง„ HTML ํŒŒ์ผ์„ ์ผ๋ถ€ ์ดˆ๊ธฐ ์„ธํŒ…์— ํ•„์š”ํ•œ js์™€ ํ•จ๊ป˜ ํด๋ผ์ด์–ธํŠธ ์„œ๋ฒ„์— ๋ณด๋‚ด์ฃผ๊ฒŒ ๋จ
    • ๊ทธ๋Ÿผ ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ๋Š” ์„œ๋ฒ„์—์„œ ๋งŒ๋“ค์–ด์ค€ ๋ฌธ์„œ๋ฅผ ๋ฐ›์•„ ์™€์„œ ๋ฐ”๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ !
  • SSR์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด ์‚ฌ์ „์— HTML ๋ฌธ์„œ๋ฅผ ํด๋ผ์ด์–ธํŠธ ์ธก์œผ๋กœ ์ „๋‹ฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์—, ํŽ˜์ด์ง€ ๋กœ๋”ฉ์ด ๋นจ๋ผ์ง€๊ณ , ๊ฒ€์ƒ‰ ์—”์ง„์ด ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ๋”ฐ๋ผ ๊ฒ€์ƒ‰์–ด๋ฅผ ์ฐพ์„ ๋•Œ(๋ฐ์ดํ„ฐ๋ฅผ ํฌ๋กค๋งํ•  ๋•Œ), ์šฐ๋ฆฌ์˜ ์›น์‚ฌ์ดํŠธ์— ํ•ด๋‹น ๊ฒ€์ƒ‰์–ด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ๋‹ค๋ฉด ์šฐ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํšจ์œจ์ ์ธ SEO๊ฐ€ ๋  ์ˆ˜ ์žˆ์Œ


  • ํ•˜์ง€๋งŒ, 
    • SSR์ด CSR์˜ ๋ชจ๋“  ๋ฌธ์ œ์ ์— ํ•ด๊ฒฐ์ฑ…์ด ๋˜์ง€๋Š” ์•Š์Œ(์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์ „์— ๋ฐ›์•„์˜ค๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ)
    • ์ฒซ ๋ฒˆ์งธ๋กœ blinking issue๊ฐ€ ์—ฌ์ „ํžˆ ์กด์žฌ(ํŽ˜์ด์ง€๊ฐ€ ๋„˜์–ด๊ฐˆ ๋•Œ๋งˆ๋‹ค ๊นœ๋นก์ž„ why? html ๋ฐ js ํŒŒ์ผ์„ ์ƒˆ๋กœ ๋ฐ›์•„์˜ค๊ธฐ ๋•Œ๋ฌธ์—) 
    • ๋‘ ๋ฒˆ์งธ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์ฆ๊ฐ€ํ•จ์— ๋”ฐ๋ผ ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ์˜ํ•ด ๋” ๋งŽ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์™€์„œ HTML์„ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋ฏ€๋กœ ๊ณผ๋ถ€ํ™”๊ฐ€ ์˜ฌ ์ˆ˜ ์žˆ์Œ
    • ๋งˆ์ง€๋ง‰์œผ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๋น ๋ฅด๊ฒŒ ์›น์‚ฌ์ดํŠธ๋ฅผ ํ™•์ธํ•  ์ˆ˜๋Š” ์žˆ์ง€๋งŒ, SSR์‹œ ๋ชจ๋“  jsํŒŒ์ผ์„ ๋‹ค์šด ๋ฐ›์€ ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์—, jsํŒŒ์ผ์ด ์™„์ „ํžˆ ๋‹ค์šด๋กœ๋“œ ๋˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ํŽ˜์ด์ง€์˜ ์—ฌ๋Ÿฌ ๋ถ€๋ถ„์„ ํด๋ฆญํ•˜๋ฉด, ์ž‘๋™์ด ๋˜์ง€ ์•Š๋Š” ๋ถ€๋ถ„์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ์Œ
  • CSR์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง๊ณผ ๋™์‹œ์— ๋ชจ๋“  html๊ณผ js๋ฅผ ๋ถˆ๋Ÿฌ์˜จ ์ƒํƒœ์ด๊ธฐ ๋•Œ๋ฌธ์—, TTV(Time to View, ๋ณด์—ฌ์ง€๋Š” ์‹œ์ )์™€ ๋™์‹œ์— TTI(Time to Interact, ์ธํ„ฐ๋ ‰์…˜,์‚ฌ์šฉ์ž์™€์˜ ํ†ต์‹ ์ด ๊ฐ€๋Šฅํ•ด์ง€๋Š” ์‹œ์ ) ๋ชจ๋“  ๋™์ ์ธ ํ–‰๋™์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋จ
  • SSR์˜ ๊ฒฝ์šฐ, html๊ณผ ์ผ๋ถ€ jsํŒŒ์ผ์€ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ์‚ฌ์ „์— ๋ฐ›์•„ ๋†“์•˜๊ธฐ ๋•Œ๋ฌธ์— TTV ์ƒํƒœ์—์„œ๋„ TTI๊ฐ€ ์ „๋ถ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์ง€๋Š” ์•Š์Œ

  • ์š”์ฆ˜์—๋Š” SSR, CSR ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ SSG(Static Site Generation)๋˜ํ•œ ๋ Œ๋”๋ง ๋ฐฉ๋ฒ•์œผ๋กœ ๋“ฑ์žฅํ•จ
    • SSG: ๋ฆฌ์•กํŠธ๋ฅผ ์˜ˆ๋กœ ๋“ค๋ฉด 'Gatsby' ๋˜๋Š” 'Next'์™€ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ๋ Œ๋”๋ง์„ ํ•˜๋Š” ๊ฒƒ์ธ๋ฐ, ์›นํŽ˜์ด์ง€๋ฅผ ์ •์ ์œผ๋กœ ๋ฏธ๋ฆฌ ์ƒ์„ฑํ•ด๋‘๊ณ , ์„œ๋ฒ„์— ๋ฐฐํฌํ•ด๋†“๋Š” ๊ฒƒ
  • SSG์—์„œ๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ์„ html ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ๊ฐ€์ง€๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋™์ ์ธ ์š”์†Œ๋„ ์ถฉ๋ถ„ํžˆ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Œ.


  • ๊ฒฐ๋ก , 
    • CSR๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค๋ฉด, ๋‚ด๊ฐ€ ์ตœ์ข…์ ์œผ๋กœ ๋ฒˆ๋“ค๋งํ•˜์—ฌ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด๋‚ด์ฃผ๋Š” jsํŒŒ์ผ์„ ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด ํšจ์œจ์ ์œผ๋กœ ๋งŽ์ด ๋ถ„ํ• ํ•˜์—ฌ ์ฒซ ๋ฒˆ์งธ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๊ธฐ ์œ„ํ•ด์„œ ํ•„์š”ํ•œ ์ •๋ง ํ•„์ˆ˜์ ์ธ html ์š”์†Œ๋งŒ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์„ ์ง€ ๊ณ ๋ฏผํ•ด์•ผ ํ•˜๊ณ 
    • SSR์˜ ๊ฒฝ์šฐ, ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๊ณ  ์ธํ„ฐ๋ ‰์…˜(TTI)ํ•˜๋Š” ์‹œ๊ฐ„์˜ ๋‹จ์ฐจ๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด์„œ ์–ด๋–ค ๋…ธ๋ ฅ์„ ํ•  ์ˆ˜ ์žˆ์„์ง€ ๊ณ ๋ฏผํ•ด์•ผ ํ•จ
    • ์–ด๋–ค ๊ฒƒ์ด ์ตœ๊ณ ๋‹ค, ์ œ์ผ ๋‚ซ๋‹ค๋ผ๋Š” ํŒ๋‹จ ๋ณด๋‹ค๋Š” ๋‚ด๊ฐ€ ๋งŒ๋“ค์–ด์•ผ ํ•˜๋Š” ์›น์‚ฌ์ดํŠธ ํŠน์„ฑ์— ๋งž๊ฒŒ ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์˜ ๋ Œ๋”๋ง์„ ํ™œ์šฉํ•˜์—ฌ ํŽ˜์ด์ง€๋ฅผ ๊ตฌ์„ฑ