6/30 TIL (NextJs)

Hwiยท2024๋…„ 6์›” 30์ผ

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
60/96

๐Ÿ“š ์ง„ํ–‰ํ•œ ๊ณต๋ถ€ ๐Ÿ“š

  • NextJs ๊ฐœ์š”

01. NextJs ์†Œ๊ฐœ

(1) ๊ณต์‹๋ฌธ์„œ์—์„œ์˜ ์†Œ๊ฐœ


React ํ”„๋ ˆ์ž„์›Œํฌ์ธ NextJs

(2)ํ”„๋ ˆ์ž„์›Œํฌ์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฐจ์ด

  • ํ”„๋ ˆ์ž„์›Œํฌ

    ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ธฐ๋Šฅ ๊ตฌํ˜„์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•„์š”ํ•œ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์  ์žฌ์›์„ ์ง€์›ํ•˜๋Š” ๊ธฐ์ˆ ์˜ ์กฐํ•ฉ

  • Spring Framework : Java ๊ธฐ๋ฐ˜์˜ ์›น(๋ฐฑ์—”๋“œ) ํ”„๋ ˆ์ž„์›Œํฌ
    • FE๊นŒ์ง€ ๊ฐ€๋Šฅํ•œ full stack coverage framwork
    • JSP, Themeleaf
  • Vue.js, Angular.js : JavaScript ๊ธฐ๋ฐ˜ ์›น ํ”„๋ก ํŠธ์—”๋“œ SPA ํ”„๋ ˆ์ž„์›Œํฌ
  • Django, Flask : Python ๊ธฐ๋ฐ˜ ์›น ํ”„๋ ˆ์ž„์›Œํฌ
  • Ruby on Rails
  • .NET Framework
  • Express.js, NestJS : JavaScript ๊ธฐ๋ฐ˜ ๋ฐฑ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

    ๊ณตํ†ต ๊ธฐ๋Šฅ์˜ ๋ชจ๋“ˆํ™”๊ฐ€ ์ด๋ฃจ์–ด์ง„ ํ”„๋กœ๊ทธ๋žจ์˜ ์ง‘ํ•ฉ

  • React.js, react-router-dom, redux

    ์ œ์–ด์˜ ์—ญ์ „(IoC : Inversio of Control)์œผ๋กœ๋„ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Œ


    ๋ณธ๋ž˜ ๊ฐœ๋ฐœ ์‹œ ์ œ์–ด๋ฅผ ํ•˜๋Š” ๊ฒƒ์€ ๊ฐœ๋ฐœ์ž์˜ ์—ญํ• 

ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์‹œํ‚ค๋Š” ๋Œ€๋กœ ์ฝ”๋“œ๋ฅผ ์งœ๊ฒŒ ๋˜๋ฉด ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์•Œ์•„์„œ ์ œ์–ด์˜ ํ๋ฆ„์„ ๊ฐ€์ ธ๊ฐ€๋Š” ๊ฒƒ

์ฆ‰, React์—์„œ๋Š” Routing์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์„ค์น˜ํ•˜๊ณ , ์„ธํŒ…์„ ํ•ด์•ผํ–ˆ์ง€๋งŒ
NextJs์—์„œ๋Š” ๋ฏธ๋ฆฌ ์ •ํ•ด๋’€๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ ๋ฐฉ๋ฒ•์— ๋งž๊ฒŒ ์ฝ”๋“œ๋งŒ ์ ์žฌ์ ์†Œ์— ๋„ฃ์–ด์ฃผ๋ฉด ๋จ

(3) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ์„œ์˜ React.js / ํ”„๋ ˆ์ž„์›Œํฌ๋กœ์„œ์˜ Next.js

  • React.js
    • ๊ณต์‹ํ™ˆํŽ˜์ด์ง€: UI๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
    • ๊ทธ ์ž์ฒด๋งŒ์œผ๋กœ ํ”„๋ ˆ์ž„์›Œํฌ๋ผ ๋ถˆ๋ฆฌ๊ธฐ์—” ๊ธฐ๋Šฅ ๋ถ€์กฑ
  • Next.js

    • ๊ณต์‹ํ™ˆํŽ˜์ด์ง€: ์›น ๊ฐœ๋ฐœ์„ ์œ„ํ•œ React ํ”„๋ ˆ์ž„์›Œํฌ
    • React.js๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ํ™•์žฅ
    • ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๊ณผ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณต

    ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ

    1. ๋‹ค์–‘ํ•œ ๋ Œ๋”๋ง ๊ธฐ๋ฒ•: CSR, SSR, SSG, ISR
    2. ๋ผ์šฐํŒ…: ํŒŒ์ผ(ํด๋”) ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…
    3. route handler: ๋ฐฑ์—”๋“œ ๊ฐ€๋Šฅ
    4. ์Šคํƒ€์ผ๋ง: CSS, Sass, CSS-in-JS
    5. ์ตœ์ ํ™”, ๋ฒˆ๋“ค๋ง
      a. ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…, ์ด๋ฏธ์ง€ ์ตœ์ ํ™”, ์›นํŒฉ ์„ค์ • ๋“ฑ

02. Next.js ์‚ฌ์šฉ ์ด์œ 

(1) ์‰ฌ์šด ์„ค์ •

  • ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฐœ๋ฐœ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๋„๋ก framework ์—ญํ•  ์ถฉ์‹คํžˆ ์ˆ˜ํ–‰
  • ์œ„์—์„œ ์‚ดํŽด๋ณธ Next.js๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฑฐ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ Default๋กœ ๊ฐ–๊ณ  ์žˆ์Œ

(2) Full Stack

  • API Route๋ฅผ ์ง€์›ํ•˜์—ฌ full stack ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ํ•จ
  • ์ž‘์€ ๊ธฐ์—…, ์ž‘์€ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ์ข‹์Œ
  • ๋šœ๋ ทํ•œ ํ•œ๊ณ„์ ์ด ์žˆ์Œ
    • ๋ณต์žกํ•œ ๋ฐฑ์—”๋“œ ๋กœ์ง์€ ๊ตฌํ˜„์ด ์–ด๋ ต๊ฑฐ๋‚˜ ๋ถˆ๊ฐ€: WebSocket, WebRTC ๋“ฑ

      WebSocket, WebRTC ๋ชจ๋‘ ์‹ค์‹œ๊ฐ„ ํ†ต์‹ ์„ ์œ„ํ•ด ์„ค๊ณ„๋œ ๊ธฐ์ˆ 
      ์ฑ„ํŒ…์ด๋‚˜ ํ™”์ƒ ํšŒ์˜, ํŒŒ์ผ ๊ณต์œ  ๋“ฑ์—์„œ ์‚ฌ์šฉ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋จ
      HTTP์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ ์—„์ฒญ๋‚˜๊ฒŒ ํšจ์œจ์ ์ธ ์‹ค์‹œ๊ฐ„ ํ†ต์‹  ์ œ๊ณต

    • FE ๋กœ์ง๊ณผ์˜ ์ค‘์†์„ฑ : ๋ฐฑ์—”๋“œ ๋กœ์ง๋งŒ ๋ณ€๊ฒฝํ•ด์„œ ๋ฐฐํฌํ•ด์•ผ ํ•˜๋ฉด ํ”„๋ก ํŠธ์—”๋“œ๋„ ํ•จ๊ป˜ ๋ฐฐํฌํ•ด์•ผ ํ•จ
    • ๊ทธ๋ž˜์„œ ์•„์ง๊นŒ์ง„ ์™„๋ฒฝํ•˜๊ฒŒ ๋Œ€์ฒดํ•  ์ˆ˜๋Š” ์—†์Œ

(3) ์œ ์šฉํ•œ ๊ธฐ๋ฒ• ์ œ๊ณต

  • (1) ๋ Œ๋”๋ง
    • ๊ธฐ์กด SPA ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์‚ฌ์šฉํ•˜๋˜ CSR์—์„œ ๋ฒ—์–ด๋‚˜
      SSR, ISR, SSG ๋“ฑ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•จ
  • (2) ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…
    • ์›น ํŽ˜์ด์ง€ ๋กœ๋”ฉ ์‹œ๊ฐ„์„ ์ค„์ด๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•
    • ์ „ํ†ต์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š”
      • ์ผ๋ฐ˜์ ์ธ ์›น์‚ฌ์ดํŠธ๋ฅผ ๋ฐฉ๋ฌธํ•  ๋• ํ•ด๋‹น ์›น์‚ฌ์ดํŠธ ์ „์ฒด ์ฝ”๋“œ๋ฅผ ํ•œ ๋ฒˆ์— ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„์„œ ์ฒ˜๋ฆฌ
      • ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๋Š” ํŽ˜์ด์ง€๊นŒ์ง€ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์•„์•ผ๋งŒ ํ•˜๋ฏ€๋กœ ์˜ค๋ž˜๊ฑธ๋ฆด ์ˆ˜ ๋ฐ–์— ์—†์Œ
      • ์‚ฌ์šฉ์ž๊ฐ€ ์ตœ์ดˆ View๋ฅผ ๋ณด๊ธฐ ์œ„ํ•œ ์‹œ๊ฐ„์ด ์˜ค๋ž˜ ๊ฑธ๋ฆผ

        TTV์˜ ๊ฐœ๋…
        Time To View์˜ ์•ฝ์ž๋กœ์จ, ์‚ฌ์šฉ์ž๊ฐ€ ์ตœ์ดˆ View๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์„ ๋•Œ ๊นŒ์ง€์˜ ์‹œ๊ฐ„์„ ๋œปํ•จ

        TTV๊ฐ€ ์งง์œผ๋ฉด ์งง์„์ˆ˜๋ก ์‚ฌ์šฉ์ž๊ฐ€ ๋” ๋น ๋ฅด๊ฒŒ ์ฝ˜ํ…์ธ ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ณ , ์‚ฌ์šฉ์ž ๋งŒ์กฑ๋„๋‚˜ ์„œ๋น„์Šค์˜ ์ „๋ฐ˜์ ์ธ ํ’ˆ์งˆ์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ์ฃผ๊ธฐ ๋•Œ๋ฌธ์— TTV๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์€ ์„ฑ๋Šฅ ์ตœ์ ํ™”์˜ ์ฃผ์š”ํ•œ ์ง€ํ‘œ ์ค‘ ํ•˜๋‚˜๋กœ ์ฑ„ํƒ

    • ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ์‚ฌ์šฉํ•˜๋ฉด
      • ์‚ฌ์šฉ์ž๊ฐ€ ํ•„์š”๋กœ ํ•˜๋Š” ๋ถ€๋ถ„๋งŒ ์šฐ์„  ๋กœ๋”ฉ
      • ๋‚˜๋จธ์ง€๋Š” ํ•„์š”์— ์˜ํ•ด์„œ๋งŒ ๋กœ๋”ฉ
      • TTV ํ–ฅ์ƒ
    React์—์„œ์˜ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ… ๊ตฌํ˜„
// LazyComponent๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋กœ๋“œํ•จ
// Suspense ์ปดํฌ๋„ŒํŠธ๋Š” LazyComponent๊ฐ€ ๋กœ๋”ฉ์ค‘์ผ ๋•Œ๋Š” fallback์— ์„ค์ •๋œ ๋ถ€๋ถ„์„ ๋ณด์—ฌ์คŒ
// ๋กœ๋”ฉ์ด ์™„๋ฃŒ๋˜๋ฉด ๊ทธ์ œ์„œ์•ผ LazyComponent๋ฅผ ๋ณด์—ฌ์คŒ
import React, { Suspense, lazy } from 'react';

const LazyComponent = lazy(() => import('./LazyComponent'));

function App() {
  return (
    <div>
      <Suspense fallback={<div>Loading...</div>}>
        <LazyComponent />
      </Suspense>
    </div>
  );
}

export default App;
  • Next.js๋Š” ์ด๋ ‡๊ฒŒ ์ฝ”๋“œ ์Šคํ”Œ๋ฆฌํŒ…์„ ๊ตฌํ˜„
    • ๊ฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณ„๋„ JavaScript ๋ฒˆ๋“ค๋กœ ๋ถ„๋ฆฌ
    • ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ค ํŽ˜์ด์ง€์— ๋ฐฉ๋ฌธํ•  ๋•Œ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋กœ๋“œํ•˜๋„๋ก ๋ณด์žฅ
    • ํ”„๋ ˆ์ž„์›Œํฌ์ธ Next.js๋Š” ์ด๋Ÿฐ ๋ถ€๋ถ„์„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ์•Œ์•„์„œ ๋‹ค ํ•ด์คŒ
      ๊ทธ๋ž˜์„œ ๋”๋”์šฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž์ฒด์˜ ๊ตฌ์กฐ์„ค๊ณ„์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง ๊ตฌํ˜„์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Œ

(4) Data Fetching

  • ์šฐ๋ฆฌ๊ฐ€ ์•Œ๊ณ  ์žˆ๋Š” fetch ํ•จ์ˆ˜๊ฐ€ next.js์—์„œ๋Š” ์ข€ ๋” ๊ธฐ๋Šฅ์ด ํ™•์žฅ๋์Œ
  • ์—ฌ๋Ÿฌ ์˜ต์…˜์„ ํ†ตํ•ด ํ•œ ๋ฒˆ๋งŒ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ์ง€, ์ผ์ • ์ฃผ๊ธฐ๋ณ„๋กœ ๊ฐ€์ ธ์˜ฌ์ง€, ์ง€์†์ ์œผ๋กœ ๊ณ„์† ๊ฐ€์ ธ์˜ฌ์ง€ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Œ
  • ์ด ๊ฐœ๋…์€ ๋‚˜์ค‘์— ๋‚ด์šธ SSR, SSG, ISR๊ณผ ๋ฐ€์ ‘ํ•œ ์—ฐ๊ด€์ด ์žˆ์Œ

(5) ์‰ฌ์šด ๋ฐฐํฌ

  • Vercel์—์„œ ์ œ๊ณตํ•˜๋Š” Next.js์ธ ๋งŒํผ ๋ฐฐํฌ๊ฐ€ ๊ต‰์žฅํžˆ ์‰ฌ์›€
  • Full Stack ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค
    • ์ „ํ†ต์ ์ธ ๋ฐฉ๋ฒ•
      • ํ”„๋ก ํŠธ์—”๋“œ: vercel
      • ๋ฐฑ์—”๋“œ: aws ec2
profile
๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ณ  ์‹ถ์–ด~~~

0๊ฐœ์˜ ๋Œ“๊ธ€