๐Ÿธminzzi
Minzzi์•ผ
๐Ÿธminzzi
์ „์ฒด ๋ฐฉ๋ฌธ์ž
์˜ค๋Š˜
์–ด์ œ
  • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (132)
    • ์˜ค๋ฅ˜ํ•ด๊ฒฐ (14)
    • FE (36)
      • Next.js (17)
      • React (4)
      • React Native (0)
      • TypeScript (1)
      • JavaScript (14)
    • BE (0)
      • Nest.js (0)
    • ๋ฐ๋ธŒ์ฝ”์Šค (7)
    • ์›น ํ”„๋กœ์ ํŠธ (5)
    • CS (28)
      • Algorithm (5)
      • Python (4)
      • C++ (2)
      • Operating System (4)
      • Computer Networking (3)
      • Data Structure (1)
      • Machine Learning (3)
      • Tip (6)
    • Github (4)
    • Flutter (3)
      • ํ”„๋กœ์ ํŠธ (3)
    • Private (3)
      • ํšŒ๊ณ  (7)
      • ๋ฉด์ ‘ (17)
    • ๊ฐœ๋ฐœ๋„์„œ (7)

๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

  • ํ™ˆ

๊ณต์ง€์‚ฌํ•ญ

์ธ๊ธฐ ๊ธ€

ํƒœ๊ทธ

  • ๋ฉด์ ‘
  • ์‹คํ–‰์ปจํ…์ŠคํŠธ
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ
  • ์ด๋ฏธ์ง€ ์ตœ์ ํ™”
  • ์›์‹œํƒ€์ž…
  • ์ฝœ์Šคํƒ
  • layout shift
  • ํž™์˜์—ญ
  • reflow
  • ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ…
  • ํ‹ฐ์Šคํ† ๋ฆฌ์ฑŒ๋ฆฐ์ง€
  • ํ˜ธ์ด์ŠคํŒ…
  • ์ด๋ฒคํŠธ๋ฃจํ”„
  • SSR
  • ๋ชจ๋˜๋ฆฌ์•กํŠธ๋”ฅ๋‹ค์ด๋ธŒ
  • next.js
  • react
  • ์˜ค๋ธ”์™„
  • ์‹คํ–‰์ปจํƒ์ŠคํŠธ
  • ๋ ‰์‹œ์ปฌ

์ตœ๊ทผ ๋Œ“๊ธ€

์ตœ๊ทผ ๊ธ€

ํ‹ฐ์Šคํ† ๋ฆฌ

hELLO ยท Designed By ์ •์ƒ์šฐ.
๐Ÿธminzzi
FE/React

[React] ๋ชจ๋˜ ๋ฆฌ์•กํŠธ ๋”ฅ๋‹ค์ด๋ธŒ 4. ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ์ฃผ์š” ์ •๋ฆฌ

[React] ๋ชจ๋˜ ๋ฆฌ์•กํŠธ ๋”ฅ๋‹ค์ด๋ธŒ 4. ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ์ฃผ์š” ์ •๋ฆฌ
FE/React

[React] ๋ชจ๋˜ ๋ฆฌ์•กํŠธ ๋”ฅ๋‹ค์ด๋ธŒ 4. ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง ์ฃผ์š” ์ •๋ฆฌ

2024. 5. 30. 18:11

1. ์‹ฑ๊ธ€ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๋ž€?

์‹ฑ๊ธ€ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์•ฝ์ž์ธ SPA๋Š” ๋ Œ๋”๋ง๊ณผ ๋ผ์šฐํŒ…์— ํ•„์š”ํ•œ ๋Œ€๋ถ€๋ถ„์˜ ๊ธฐ๋Šฅ์„ ์„œ๋ฒ„๊ฐ€ ์•„๋‹Œ ๋ธŒ๋ผ์šฐ์ €์˜ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์— ์˜์กดํ•˜๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธํ•œ๋‹ค. SPA๋Š” ๋ง ๊ทธ๋Œ€๋กœ ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€๋กœ ๊ตฌํ˜„๋˜๋ฉฐ ์ƒˆ๋กœ์šด ํŽ˜์ด์ง€๋ฅผ ๋ฐ›์•„์˜ค์ง€ ์•Š๋Š”๋‹ค. ์ตœ์ดˆ์— ์ฒซ ํŽ˜์ด์ง€์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋‘ ๋ถˆ๋Ÿฌ์˜จ ์ดํ›„์— ํŽ˜์ด์ง€ ์ „ํ™˜ ๋‹จ๊ณ„์—์„œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋ธŒ๋Ÿฌ์šฐ์ €์˜ history.pushState์™€ history.replaceState๋กœ ์ด๋ค„์ง€๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„์—์„œ HTML์„ ๋‚ด๋ ค๋ฐ›์ง€ ์•Š๊ณ  ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€์—์„œ ๋ชจ๋“  ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•œ๋‹ค.

 

SPA๋Š” ์ตœ์ดˆ ์ฒซ ํŽ˜์ด์ง€๋ฅผ ๋ฐ›์„ ๋•Œ๋Š” SSR์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ดํ›„์—๋Š” CSR์„ ์ด์šฉํ•˜์—ฌ ๋ Œ๋”๋ง์„ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค. 

1.1 SPA์—์„œ ํŽ˜์ด์ง€ ์ „ํ™˜์ด ์ผ์–ด๋‚˜๋Š” ๊ณผ์ •์„ ์„ค๋ช…ํ•˜์‹œ์˜ค

ํŽ˜์ด์ง€ ์ „ํ™˜ ์‹œ ์ƒˆ๋กœ์šด HTML ํŽ˜์ด์ง€๋ฅผ ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ๋‹ค์Œ ํŽ˜์ด์ง€์˜ ๋ Œ๋”๋ง์— ํ•„์š”ํ•œ ์ •๋ณด๋งŒ HTTP ์š”์ฒญ ๋“ฑ์œผ๋กœ ๊ฐ€์ ธ์˜จ ๋‹ค์Œ, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ <body/> ๋‚ด๋ถ€์— DOM์„ ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ํŽ˜์ด์ง€๊ฐ€ ์ „ํ™˜๋œ๋‹ค.

1.2 SPA์˜ ์žฅ์ ์„ ์„ค๋ช…ํ•˜์‹œ์˜ค

  • ํŽ˜์ด์ง€ ์ „ํ™˜์— ํ•„์š”ํ•œ ์ผ๋ถ€ ์˜์—ญ๋งŒ ๋‹ค์‹œ ๊ทธ๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ›จ์”ฌ ๋” ๋งค๋„๋Ÿฌ์šด UI๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • SPA์—์„œ๋Š” ๋‹จ์ง€ ๋ธŒ๋ผ์šฐ์ € ๋‚ด๋ถ€์—์„œ ์ž‘๋™ํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋งŒ ์ž˜ ์ž‘์„ฑํ•˜๋ฉด ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‰ฝ๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.
  • ์ด์— ํ”„๋ŸฐํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์ข€ ๋” ๊ฐ„ํŽธํ•œ ๊ฐœ๋ฐœ ๊ฒฝํ—˜์„ ์ œ๊ณตํ–ˆ๋‹ค.

1.3 JAM ์Šคํƒ์ด ๋ฌด์—‡์ธ์ง€ ์„ค๋ช…ํ•˜์‹œ์˜ค.

JAM์Šคํƒ์ด๋ž€ JavaScript, API, Markup ์Šคํƒ์„ ์ค„์—ฌ ๋งํ•˜๋Š” ์Šคํƒ์ด๋‹ค. React, Vue, Angular ๋“ฑ ํ”„๋ ˆ์ž„์›Œํฌ(React๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ด๋‹ค)๋“ค์˜ ๋“ฑ์žฅ์œผ๋กœ ๋Œ€๋ถ€๋ถ„์˜ ์ž‘์—…์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด, ํ”„๋ŸฐํŠธ์—”๋“œ๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์™€ ๋งˆํฌ์—…(HTML, CSS)์„ ๋ฏธ๋ฆฌ ๋นŒ๋“œํ•ด ๋‘๊ณ  ์ •์ ์œผ๋กœ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๋ฉด ์ดํ›„ ์ž‘๋™์€ ๋ชจ๋‘ ์‚ฌ์šฉ์ž์˜ ํด๋ผ์ด์–ธํŠธ์—์„œ ์‹คํ–‰๋˜๋ฏ€๋กœ ์„œ๋ฒ„ ํ™•์žฅ์„ฑ ๋ฌธ์ œ์— ์ข€ ๋” ์ž์œ ๋กœ์›Œ์งˆ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ๋‹ค.

 

+ ์ด์ „์—๋Š” ์„œ๋ฒ„ ํ™•์žฅ์„ฑ ๋ฌธ์ œ์— ์–ด๋ ค์›€์ด ์žˆ์—ˆ๋‚˜?

๊ทธ๋ ‡๋‹ค. ์ด์ „์—๋Š” LAMP ์Šคํƒ, (Linux, Apache, MySQL, PHP/Python)์œผ๋กœ ์›น ๊ฐœ๋ฐœ์ด ๊ตฌ์„ฑ๋˜์–ด ์žˆ์—ˆ๋Š”๋ฐ, ์ด๋•Œ๋งŒํ•ด๋„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์—์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ด ์ œํ•œ์ ์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€๋ถ€๋ถ„์˜ ์ฒ˜๋ฆฌ๋ฅผ ์„œ๋ฒ„์—์„œ ํ•ด์•ผ๋งŒ ํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋Šฅ์ด ๋‹ค์–‘ํ•ด์ง€๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ๋Š˜์–ด๋‚˜๋ฉด ์ด์™€ ๋™์‹œ์— ์„œ๋ฒ„๋„ ํ™•์žฅํ•ด์•ผ ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ํด๋ผ์šฐ๋“œ์˜ ๊ฐœ๋…์ด ๋ถ€์กฑํ–ˆ๋˜ ์ด๋•Œ๋Š” ์„œ๋ฒ„ ํ™•์žฅ์„ฑ์— ์–ด๋ ค์›€์„ ๊ฒช์—ˆ๋‹ค.

 

+ JAM ์Šคํƒ๊ณผ Node.js์˜ ๊ณ ๋„ํ™”๋กœ ์ธ๊ธฐ๋ฅผ ์–ป๊ณ  ์žˆ๋Š” ์Šคํƒ์€ ๋ฌด์—‡์ธ๊ฐ€?

  1. MEAN(MongoDB, Express.js, AngularJS, Node.js)
  2. MERN(MongoDB, Express.js, React, Node.js)

2. ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์ด๋ž€?

์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง์˜ ์•ฝ์–ด์ธ SSR์€ ์„œ๋ฒ„์—์„œ ๋ชจ๋“  ๋ Œ๋”๋ง ์ž‘์—…์„ ํ•˜๊ณ  ์‚ฌ์šฉ์ž์—๊ฒŒ ํ™”๋ฉด์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ํด๋ผ์ด์–ธํŠธ ๋ Œ๋”๋ง์€ ์‚ฌ์šฉ์ž ๊ธฐ๊ธฐ์˜ ์„ฑ๋Šฅ์— ์˜ํ–ฅ์„ ๋ฐ›์ง€๋งŒ SSR์€ ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น„๊ต์  ์•ˆ์ •์ ์ธ ๋ Œ๋”๋ง์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

2.1 SSR์˜ ์žฅ๋‹จ์ ์„ ์„ค๋ช…ํ•˜์‹œ์˜ค

[์žฅ์ ]

  • ์ตœ์ดˆ ํŽ˜์ด์ง€ ์ง„์ž…์ด ๋น„๊ต์  ๋น ๋ฅด๋‹ค.
    • ์ผ๋ฐ˜์ ์œผ๋กœ ์„œ๋ฒ„์—์„œ HTTP ์š”์ฒญ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋น ๋ฅด๊ณ , HTML์„ ๊ทธ๋ฆฌ๋Š” ์ž‘์—…๋„ ์„œ๋ฒ„์—์„œ ํ•ด๋‹น HTML์„ ๋ฌธ์ž์—ด๋กœ ๋ฏธ๋ฆฌ ๊ทธ๋ ค์„œ ๋‚ด๋ ค์ฃผ๋Š” ๊ฒƒ์ด ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ธฐ์กด HTML์— ์‚ฝ์ž…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋น ๋ฅด๋‹ค.
  • ๊ฒ€์ƒ‰ ์—”์ง„๊ณผ SNS ๊ณต์œ  ๋“ฑ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ œ๊ณต์ด ์‰ฝ๋‹ค.
    • SSR์€ ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”์— ์œ ์šฉํ•˜๋‹ค.
    • SPA์—์„œ๋Š” ๊ฒ€์ƒ‰์—”์ง„์—๊ฒŒ HTML์ด๋‚˜ ๊ฐ์ข… ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•ด์•ผ ํ•˜์ง€๋งŒ ๋กœ๋ด‡์€ ํŽ˜์ด์ง€๋ฅผ ๋ณด๋Š” ๊ฒƒ์ด ์•„๋‹Œ ํŽ˜์ด์ง€์˜ ์ •์ ์ธ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ๋ชฉ์ ์ด๋ผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ฑฐ๋‚˜ ์‹คํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค. 
    • SSR์—์„œ๋Š” ๊ฒ€์ƒ‰ ์—”์ง„์— ์ œ๊ณตํ•  ์ •๋ณด๋ฅผ ์„œ๋ฒ„์—์„œ ๊ฐ€๊ณตํ•ด HTML์‘๋‹ต์œผ๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™”์— ๋งค์šฐ ์šฉ์ดํ•˜๋‹ค.
  • ๋ˆ„์  ๋ ˆ์ด์•„์›ƒ ์ด๋™์ด ์ ๋‹ค.
    • ๋ˆ„์  ๋ ˆ์ด์•„์›ƒ ์ด๋™์ด๋ž€ ์‚ฌ์šฉ์ž์—๊ฒŒ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ค€ ์ดํ›„์— ๋’ค๋Šฆ๊ฒŒ ์–ด๋–ค HTML ์ •๋ณด๊ฐ€ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜์–ด ๋งˆ์น˜ ํ™”๋ฉด์ด ๋œ์ปฅ๊ฑฐ๋ฆฌ๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ถ€์ •์ ์ธ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์˜๋ฏธํ•œ๋‹ค.
    • SPA์—์„œ๋Š” ํŽ˜์ด์ง€ ์ฝ˜ํ…์ธ ๊ฐ€ API ์š”์ฒญ์— ์˜์กดํ•˜๊ณ , API ์š”์ฒญ์˜ ์‘๋‹ต ์†๋„๊ฐ€ ์ œ๊ฐ๊ฐ์ด๋ฉฐ, ์ด๋ฅผ ์ ์ ˆํžˆ ์ฒ˜๋ฆฌํ•ด๋‘์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋ˆ„์  ๋ ˆ์ด์•„์›ƒ ์ด๋™ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ํ•˜์ง€๋งŒ SSR์—์„œ๋Š” ์ด๋Ÿฌํ•œ API ์š”์ฒญ์ด ์™„์ „ํžˆ ์™„๋ฃŒ๋œ ์ดํ›„์— ์™„์„ฑ๋œ ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ์ œ๊ณตํ•˜๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ์—์„œ ๋น„๊ต์  ์ž์œ ๋กญ๋‹ค.
  • ์‚ฌ์šฉ์ž์˜ ๋””๋ฐ”์ด์Šค ์„ฑ๋Šฅ์— ๋น„๊ต์  ์ž์œ ๋กญ๋‹ค
    • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฆฌ์†Œ์Šค ์‹คํ–‰์˜ ๋ถ€๋‹ด์„ ์„œ๋ฒ„์—์„œ ๋‚˜๋ˆŒ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž์˜ ๋””๋ฐ”์ด์Šค ์„ฑ๋Šฅ์œผ๋กœ๋ถ€ํ„ฐ ์กฐ๊ธˆ ๋” ์ž์œ ๋กœ์›Œ์งˆ ์ˆ˜ ์žˆ๋‹ค.
    • ํ•˜์ง€๋งŒ ์ธํ„ฐ๋„ท ์†๋„๊ฐ€ ๋А๋ฆฌ๋‹ค๋ฉด ์–ด๋– ํ•œ ๋ฐฉ๋ฒ•๋ก ์„ ์“ฐ๋“  ๋А๋ฆด ๊ฒƒ์ด๊ณ , ์‚ฌ์šฉ์ž ๋ฐฉ๋ฌธ์ด ํญ์ฆํ•ด ์„œ๋ฒ„์— ๋ถ€๋‹ด์ด ์ฆ๊ฐ€ํ•˜๊ณ  ์ด๋ฅผ ์œ„ํ•œ ์ ์ ˆํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ๋งˆ๋ จ๋˜์–ด ์žˆ์ง€ ์•Š๋‹ค๋ฉด SSR๋„ ์ถฉ๋ถ„ํžˆ ๋А๋ฆด ์ˆ˜ ์žˆ๋‹ค.
  • ๋ณด์•ˆ์— ์ข€ ๋” ์•ˆ์ „ํ•˜๋‹ค.
    • SSR์€ ์ธ์ฆ ํ˜น์€ ๋ฏผ๊ฐํ•œ ์ž‘์—…์„ ์„œ๋ฒ„์—์„œ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ทธ ๊ฒฐ๊ณผ๋งŒ ๋ธŒ๋ผ์šฐ์ €์— ์ œ๊ณตํ•ด ๋ณด์•ˆ ์œ„ํ˜‘์„ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค.

[๋‹จ์ ]

  • ์†Œ์Šค์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ ํ•ญ์ƒ ์„œ๋ฒ„๋ฅผ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.
    • ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์ฝ”๋“œ๋Š” window์— ๋Œ€ํ•œ ์ ‘๊ทผ์„ ์ตœ์†Œํ™”ํ•ด์•ผ ํ•˜๊ณ , window ์‚ฌ์šฉ์ด ๋ถˆ๊ฐ€ํ”ผํ•˜๋ฉด ํ•ด๋‹น ์ฝ”๋“œ๊ฐ€ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š๋„๋ก ์ฒ˜๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.
  • ์ ์ ˆํ•œ ์„œ๋ฒ„๊ฐ€ ๊ตฌ์ถ•๋ผ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
    • SSR์€ ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์„ ๋ฐ›์•„ ๋ Œ๋”๋ง์„ ์ˆ˜ํ–‰ํ•  ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์€ ์ ˆ๋Œ€ ์‰ฌ์šด ๊ฒƒ์ด ์•„๋‹ˆ๋‹ค. 
    • ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์— ๋”ฐ๋ผ ์ ์ ˆํ•˜๊ฒŒ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌผ๋ฆฌ์ ์ธ ๊ฐ€์šฉ๋Ÿ‰์„ ํ™•๋ณดํ•ด์•ผ ํ•˜๊ณ , ๋•Œ๋กœ๋Š” ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์žฅ์•  ์ƒํ™ฉ์— ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณต๊ตฌ ์ „๋žต๋„ ํ•„์š”ํ•˜๋‹ค. ๋˜ํ•œ ์š”์ฒญ์„ ๋ถ„์‚ฐ์‹œํ‚ค๊ณ , ํ”„๋กœ์„ธ์Šค๊ฐ€ ์˜ˆ๊ธฐ์น˜ ๋ชปํ•˜๊ฒŒ ๋‹ค์šด๋  ๋•Œ๋ฅผ ๋Œ€๋น„ํ•ด PM2์™€ ๊ฐ™์€ ํ”„๋กœ์„ธ์Šค ๋งค๋‹ˆ์ €์˜ ๋„์›€๋„ ํ•„์š”ํ•˜๋‹ค.
  • ์„œ๋น„์Šค ์ง€์—ฐ์— ๋”ฐ๋ฅธ ๋ฌธ์ œ
    • SPA์—์„œ๋Š” ๋А๋ฆฐ ์ž‘์—…์„ ์ˆ˜ํ–‰์ค‘์— '๋กœ๋”ฉ ์ค‘'๊ณผ ๊ฐ™์€ ์•ˆ๋‚ด๋ฅผ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ SSR์—์„œ ์ง€์—ฐ์ด ์ผ์–ด๋‚˜๋ฉด ์‚ฌ์šฉ์ž๋Š” ๋ Œ๋”๋ง ์ž‘์—…์ด ๋๋‚ ๋•Œ๊นŒ์ง€ ์–ด๋–ค ์ •๋ณด๋„ ์ œ๊ณต๋ฐ›์„ ์ˆ˜ ์—†๋‹ค. ๊ทธ๋ž˜์„œ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๊ณ  ์ž‘์—…์ด ๋ณต์žกํ•ด์ง€๋Š” ๋“ฑ ๋ณ‘๋ชฉ ํ˜„์ƒ์ด ์‹ฌํ•ด์ง€๋ฉด SSR์€ ๋” ์•ˆ ์ข‹์€ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

2.2 ๊ฐ€์žฅ ๋›ฐ์–ด๋‚œ SPA๊ณผ ๊ฐ€์žฅ ๋›ฐ์–ด๋‚œ MPA ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ๊ฐ€?

๊ฐ€์žฅ ๋›ฐ์–ด๋‚œ SPA๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. MPA๊ฐ€ ์—„์ฒญ๋‚œ ์ตœ์ ํ™”๋ฅผ ๊ฐ€๋ฏธํ–ˆ๋‹คํ•˜๋”๋ผ๋„ ๊ฐ€์žฅ ๋›ฐ์–ด๋‚œ SPA๋ผ๋ฉด SPA๊ฐ€ ๊ฐ€์ง„ ๋ธŒ๋ผ์šฐ์ € API์™€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ™œ์šฉํ•œ ๋ผ์šฐํŒ…์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋งค๋„๋Ÿฌ์šด ๋ผ์šฐํŒ…๋ณด๋‹ค ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ์„ ๋ณด์—ฌ์ค„ ์ˆ˜๋Š” ์—†์„ ๊ฒƒ์ด๋‹ค.

 

(๊ฐ€์žฅ ๋›ฐ์–ด๋‚œ SPA๋Š” Gmail์„ ์˜ˆ์‹œ๋กœ ๋“ค์—ˆ์Œ)

2.3 ํ‰๊ท ์ ์ธ SPA์™€ ํ‰๊ท ์ ์ธ MPA ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ธ๊ฐ€?

ํ‰๊ท ์ ์ธ MPA๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค. ํ‰๊ท ์ ์ธ SPA๋Š” ํ‰๊ท ์ ์ธ MPA๋ณด๋‹ค ๋А๋ฆฌ๋‹ค. ์ผ๋ฐ˜์ ์ธ SPA์—์„œ ๋ Œ๋”๋ง๊ณผ ๋ผ์šฐํŒ…์— ์ตœ์ ํ™”๊ฐ€ ๋ผ ์žˆ์ง€ ์•Š๋‹ค๋ฉด ์‚ฌ์šฉ์ž ๊ธฐ๊ธฐ์— ๋”ฐ๋ผ ์„ฑ๋Šฅ์ด ๋“ค์‘ฅ๋‚ ์‘ฅํ•˜๊ณ , ์ ์ ˆํ•œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋„ ๋ผ ์žˆ์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์— MPA ๋Œ€๋น„ ์„ฑ๋Šฅ์ด ์•„์‰ฌ์šธ ๊ฐ€๋Šฅ์„ฑ์ด ํฌ๋‹ค.

 

์‹ฌ์ง€์–ด ์ตœ๊ทผ์—๋Š” MPA์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ผ์šฐํŒ…์œผ๋กœ ์ธํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ API๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ์ถ”๊ฐ€๋˜๊ณ  ์žˆ๋‹ค.

- ํŽ˜์ธํŠธ ํ™€๋”ฉ, back forwrad cache, Shared Element Transitions

2.4 ํ˜„๋Œ€์˜ SSR์— ๋Œ€ํ•ด์„œ ์„ค๋ช…ํ•˜์‹œ์˜ค.

์ตœ์ดˆ ์›น์‚ฌ์ดํŠธ ์ง„์ž…์‹œ SSR๋กœ ์„œ๋ฒ„์—์„œ ์™„์„ฑ๋œ HTML์„ ์ œ๊ณตํ•˜๊ณ  ์ดํ›„ ๋ผ์šฐํŒ…์—์„œ๋Š” ์„œ๋ฒ„์—์„œ ๋‚ด๋ ค๋ฐ›์€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ SPA์ฒ˜๋Ÿผ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

3. SSR์„ ์œ„ํ•ด ๋ฆฌ์•กํŠธ API

  1. renderToString
    • ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๊ทธ๋ ค์•ผ ํ•  HTML ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์–ด๋‚ธ๋‹ค.
    • ํด๋ผ์ด์–ธํŠธ์—์„œ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ์™„์„ฑ๋œ HTML์„ ์„œ๋ฒ„์—์„œ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๊ธฐ์— ์ดˆ๊ธฐ ๋ Œ๋”๋ง์— ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ์„ ๋ณด์ด๋ฉฐ, ๊ฒ€์ƒ‰ ์—”์ง„์ด๋‚˜ SNS ๊ณต์œ ๋ฅผ ์œ„ํ•œ ๋ฉ”ํƒ€ ์ •๋ณด๋„ renderToString์—์„œ ๋ฏธ๋ฆฌ ์ค€๋น„ํ•œ ์ฑ„๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.
    • data-reactroot ์†์„ฑ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— renderToStaticMarkup๊ณผ ๋‹ค๋ฅด๊ฒŒ hydrate ํ•จ์ˆ˜์—์„œ ๋ฃจํŠธ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๊ธฐ์ค€์ ์ด ๋˜์–ด useEffect์™€ ๊ฐ™์€ API๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.
  2. renderToNodeStream
    • renderToString๊ณผ renderToStaticMarkup์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ renderToNodeStream์€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์™„์ „ํžˆ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค.
    • renderToNodeStream๋Š” ์™„์ „ํžˆ Node.js ํ™˜๊ฒฝ์— ์˜์กดํ•˜๊ณ  ์žˆ๋‹ค.
    • ๊ฒฐ๊ณผ๋ฌผ์—์„œ๋„ ์ฐจ์ด๊ฐ€ ์žˆ๋Š”๋ฐ renderToNodeStream๋Š” Node.js์˜ ReadableStream์œผ๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
    • ์™œ ์‚ฌ์šฉํ• ๊นŒ? 
      • ์ŠคํŠธ๋ฆผ : ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒญํฌ(chunk, ์ž‘์€ ๋‹จ์œ„)๋กœ ๋ถ„ํ• ํ•ด ์กฐ๊ธˆ์”ฉ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹
      • ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒฐ๊ณผ๋ฌผ์ด ์œ ๋ทฐ๋ธŒ ์˜์ƒ ๋“ฑ๊ณผ ๊ฐ™์ด ํด ๋•Œ, ํฐ ํฌ๊ธฐ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒญํฌ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•ด ์ˆœ์ฐจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค. (์œ ํŠœ๋ธŒ๋„ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋ช‡ ์ดˆ๋ผ๋„ ๋จผ์ € ๋‹ค์šด๋กœ๋“œ๋˜๋ฉด ๊ทธ ๋ถ€๋ถ„์„ ๋จผ์ € ๋ณด์—ฌ์ฃผ๊ณ , ์ดํ›„์— ๊ณ„์†ํ•ด์„œ ์˜์ƒ์„ ๋‹ค์šด๋กœ๋“œํ•œ๋‹ค.)
  3. hydrate
    • hydrate๋Š” ์ƒ์„ฑ๋œ HTML ์ฝ˜ํ…์ธ ์— ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ํ•ธ๋“ค๋Ÿฌ๋‚˜ ์ด๋ฒคํŠธ๋ฅผ ๋ถ™์ด๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

4. Next.js์—์„œ ๋ฒˆ๋“ค๋ง๊ณผ ์ปดํŒŒ์ผ์„ ๋น ๋ฅด๊ฒŒ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์ง„ ์˜ต์…˜์€ ๋ฌด์—‡์ธ๊ฐ€?

swcMinify, SWC๋Š” ๋ฐ”๋ฒจ์— ๋น„ํ•ด ๋” ๋น ๋ฅธ ์†๋„๋ฅผ ๋ณด์—ฌ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ์—†๋‹ค๋ฉด ์“ฐ๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค.

4.1 Next.js์˜ ๋ผ์šฐํŒ… ๊ตฌ์กฐ๋Š” ๋ฌด์—‡์ธ๊ฐ€?

/pages ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ธฐ์ดˆ๋กœ ๊ตฌ์„ฑ๋œ๋‹ค. 

๊ฐ ํŽ˜์ด์ง€์— ์žˆ๋Š” default export๋กœ ๋‚ด๋ณด๋‚ธ ํ•จ์ˆ˜๊ฐ€ ํ•ด๋‹น ํŽ˜์ด์ง€์˜ ๋ฃจํŠธ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋œ๋‹ค. 

4.2 getServerSideProps์˜ ์œ ๋ฌด์˜ ์ฐจ์ด๋ฅผ ์„ค๋ช…ํ•˜์‹œ์˜ค.

getServerSideProps๊ฐ€ ์—†๋‹ค๋ฉด ์„œ๋ฒ„์—์„œ ์‹คํ–‰ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ํŽ˜์ด์ง€๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค. ๋”ฐ๋ผ์„œ getServerSideProps๋ฅผ ๋„ฃ์–ด์ฃผ์ง€ ์•Š๋Š”๋‹ค๋ฉด ๋นŒ๋“œ ์‹œ์ ์— ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋„ ๋˜๋Š” ํŽ˜์ด์ง€๋กœ ๊ฐ„์ฃผํ•ด๋ฒ„๋ ค window๋„ undefined๊ฐ€ ์•„๋‹ˆ๋‹ค. 

4.3 Next.js์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” CSS์˜ ์‚ฌ์šฉ ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋‚˜์—ดํ•˜์‹œ์˜ค.

  1. ์ „์—ญ ์Šคํƒ€์ผ
  2. ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ CSS
  3. SCSS์™€ SASS
  4. CSS-in-JS
    • styled-jsx, styled-components, Emotion, Linaria ๋“ฑ

 

 

์ €์ž‘์žํ‘œ์‹œ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'FE > React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[React] SPA, CSR์€ ๊ฐ™์„๊นŒ ๋‹ค๋ฅผ๊นŒ  (0) 2024.05.30
React ๊ฐœ๋ฐœ์‹œ Node.js๋ฅผ ์„ค์น˜ํ•˜๋Š” ์ด์œ   (0) 2024.03.15
ํŽ˜์ด์ง€ ์ด๋™ ์‹œ ์Šคํฌ๋กค ์œ„์น˜ ํ•ญ์ƒ ์œ„์— ๊ณ ์ •์‹œํ‚ค๊ธฐ  (0) 2024.02.17
    'FE/React' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
    • [React] SPA, CSR์€ ๊ฐ™์„๊นŒ ๋‹ค๋ฅผ๊นŒ
    • React ๊ฐœ๋ฐœ์‹œ Node.js๋ฅผ ์„ค์น˜ํ•˜๋Š” ์ด์œ 
    • ํŽ˜์ด์ง€ ์ด๋™ ์‹œ ์Šคํฌ๋กค ์œ„์น˜ ํ•ญ์ƒ ์œ„์— ๊ณ ์ •์‹œํ‚ค๊ธฐ
    ๐Ÿธminzzi
    ๐Ÿธminzzi

    ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”

    ๋‹จ์ถ•ํ‚ค

    ๋‚ด ๋ธ”๋กœ๊ทธ

    ๋‚ด ๋ธ”๋กœ๊ทธ - ๊ด€๋ฆฌ์ž ํ™ˆ ์ „ํ™˜
    Q
    Q
    ์ƒˆ ๊ธ€ ์“ฐ๊ธฐ
    W
    W

    ๋ธ”๋กœ๊ทธ ๊ฒŒ์‹œ๊ธ€

    ๊ธ€ ์ˆ˜์ • (๊ถŒํ•œ ์žˆ๋Š” ๊ฒฝ์šฐ)
    E
    E
    ๋Œ“๊ธ€ ์˜์—ญ์œผ๋กœ ์ด๋™
    C
    C

    ๋ชจ๋“  ์˜์—ญ

    ์ด ํŽ˜์ด์ง€์˜ URL ๋ณต์‚ฌ
    S
    S
    ๋งจ ์œ„๋กœ ์ด๋™
    T
    T
    ํ‹ฐ์Šคํ† ๋ฆฌ ํ™ˆ ์ด๋™
    H
    H
    ๋‹จ์ถ•ํ‚ค ์•ˆ๋‚ด
    Shift + /
    โ‡ง + /

    * ๋‹จ์ถ•ํ‚ค๋Š” ํ•œ๊ธ€/์˜๋ฌธ ๋Œ€์†Œ๋ฌธ์ž๋กœ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ‹ฐ์Šคํ† ๋ฆฌ ๊ธฐ๋ณธ ๋„๋ฉ”์ธ์—์„œ๋งŒ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.