framework/NextJS

๐Ÿง  Next.js ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ๊ฐ€์ด๋“œ

octo54 2025. 5. 27. 10:50
๋ฐ˜์‘ํ˜•

๐Ÿง  Next.js ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ๊ฐ€์ด๋“œ

Next.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์€ ์„œ๋ฒ„ ์„ฑ๋Šฅ, ์•ˆ์ •์„ฑ, ๋ฐฐํฌ ํ™˜๊ฒฝ์—์„œ์˜ ๋น„์šฉ ๋“ฑ์— ์ง์ ‘์ ์ธ ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค.
์ด ๊ฐ€์ด๋“œ์—์„œ๋Š” App Router ๊ธฐ๋ฐ˜ ํ”„๋กœ์ ํŠธ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ์ดํ•ดํ•˜๊ณ  ์ตœ์ ํ™”ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค.


โœ… 1. Next.js ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ ๊ฐœ์š”

์ฃผ์š” ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์„ฑ ์š”์†Œ

๊ตฌ์„ฑ ์š”์†Œ ์„ค๋ช…

๋ Œ๋”๋ง ๋ฉ”๋ชจ๋ฆฌ ๊ฐ ์š”์ฒญ๋งˆ๋‹ค ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉ
์บ์‹œ ๋ฉ”๋ชจ๋ฆฌ ์ •์  ์ž์‚ฐ, ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ๊ฒฐ๊ณผ, ๋ฐ์ดํ„ฐ ํŽ˜์นญ ๊ฒฐ๊ณผ ๋“ฑ
Node.js ๋Ÿฐํƒ€์ž„ ๋ฉ”๋ชจ๋ฆฌ Next.js ์„œ๋ฒ„๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ๋Ÿฐํƒ€์ž„ ๋ฉ”๋ชจ๋ฆฌ
๋ฏธ๋“ค์›จ์–ด ๋ฐ Edge Function ๋ฐฐํฌ ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์กด์žฌ

โœ… 2. ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ์„ ํ™•์ธํ•˜๋Š” ๋ฐฉ๋ฒ•

1. process.memoryUsage()

์„œ๋ฒ„ ์ฝ”๋“œ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

console.log(process.memoryUsage());

์ถœ๋ ฅ ์˜ˆ์‹œ:

{
  rss: 51200000,
  heapTotal: 30500000,
  heapUsed: 25500000,
  external: 1000000
}

ํ•ญ๋ชฉ ์„ค๋ช…

rss ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ (Resident Set Size)
heapTotal JS ์—”์ง„์ด ํ™•๋ณดํ•œ ํž™ ๋ฉ”๋ชจ๋ฆฌ ์ด๋Ÿ‰
heapUsed ์‹ค์ œ ์‚ฌ์šฉ ์ค‘์ธ ํž™ ๋ฉ”๋ชจ๋ฆฌ
external C++ ๋˜๋Š” ์™ธ๋ถ€ ๋ชจ๋“ˆ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ

2. Vercel ๋ถ„์„ ๋„๊ตฌ

  • Vercel์—์„œ๋Š” ๋นŒ๋“œ/์‹คํ–‰ ํ™˜๊ฒฝ์—์„œ ๋ฉ”๋ชจ๋ฆฌ ๋ฐ ์š”์ฒญ ์‹œ๊ฐ„์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋Š” ๋กœ๊ทธ ๋„๊ตฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  • ํ•จ์ˆ˜ ๊ธฐ๋ฐ˜ ๋ฐฐํฌ ์‹œ, 128MB / 512MB / 1024MB์™€ ๊ฐ™์€ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ

โœ… 3. ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™” ์ „๋žต

๋ฐ˜์‘ํ˜•

1. ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ์ตœ์ ํ™”

  • ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์š”์ฒญ: getServerSideProps ๋˜๋Š” fetch ๋กœ์ง์—์„œ ํ•„ํ„ฐ๋ง๋œ ๋ฐ์ดํ„ฐ๋งŒ ๋กœ๋”ฉ
  • ์ปดํฌ๋„ŒํŠธ ์žฌ์‚ฌ์šฉ: ๊ฐ™์€ ์š”์ฒญ์—์„œ ์ค‘๋ณต ๋ Œ๋”๋ง์„ ํ”ผํ•˜๋„๋ก ์บ์‹œ ๋ ˆ์ด์–ด ํ™œ์šฉ

2. ์ •์  ํŽ˜์ด์ง€ ํ™œ์šฉ

  • generateStaticParams() ๋˜๋Š” fetchCache: 'force-cache' ์‚ฌ์šฉ์œผ๋กœ SSR ๋Œ€์‹  SSG๋กœ ์ฒ˜๋ฆฌ
  • ๋ถˆํ•„์š”ํ•œ ์„œ๋ฒ„ ๋ฆฌ๋ Œ๋”๋ง ๋ฐฉ์ง€

3. Route Handlers ๋˜๋Š” Middleware ์ฃผ์˜

  • Edge ํ™˜๊ฒฝ์—์„œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ์ด ๋” ๋‚ฎ์Œ (์˜ˆ: 128MB)
  • ํฐ ํŒŒ์ผ, ์ด๋ฏธ์ง€, ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š๋„๋ก ์ฃผ์˜

โœ… 4. ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜ ๋ฐฉ์ง€ ํŒ

์›์ธ ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

๊ธ€๋กœ๋ฒŒ ์ƒํƒœ ๋˜๋Š” DB ์—ฐ๊ฒฐ ๋ˆ„์ˆ˜ ์š”์ฒญ๋งˆ๋‹ค DB ์—ฐ๊ฒฐ์„ ๋‹ซ๊ณ , ์ƒํƒœ ์ดˆ๊ธฐํ™”
fetch ์บ์‹œ๊ฐ€ ๊ณผ๋„ํ•˜๊ฒŒ ๋ˆ„์ ๋จ revalidate ๋˜๋Š” cache: 'no-store' ํ™œ์šฉ
์ด๋ฏธ์ง€, Buffer ๋“ฑ ์˜ค๋ž˜ ์œ ์ง€๋จ ํ•„์š” ์‹œ์  ์ดํ›„ ๋ฐ˜๋“œ์‹œ null ๋˜๋Š” ์‚ญ์ œ
let db: Database | null = null;

export async function GET() {
  db = await connectToDB();
  const data = await db.query();
  db = null; // ์—ฐ๊ฒฐ ํ•ด์ œ
  return Response.json(data);
}

โœ… 5. ๋ฐฐํฌ ํ™˜๊ฒฝ์— ๋”ฐ๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ

ํ™˜๊ฒฝ ๊ธฐ๋ณธ ๋ฉ”๋ชจ๋ฆฌ ์ œํ•œ ์œ ์˜์‚ฌํ•ญ

Vercel Edge Function 128MB~512MB ํฌ๋ก ์žก/์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ์ œํ•œ๋จ
Vercel Serverless 1024MB๊นŒ์ง€ ๊ฐ€๋Šฅ ์ง€์—ญ๋งˆ๋‹ค ์†๋„ ์ฐจ์ด ์กด์žฌ
Node.js ์ง์ ‘ ๋ฐฐํฌ ๋ฉ”๋ชจ๋ฆฌ ๋ฌด์ œํ•œ ์ง์ ‘ GC ๊ด€๋ฆฌ ํ•„์š”
Docker --memory ์˜ต์…˜ ๊ฐ€๋Šฅ ์ปจํ…Œ์ด๋„ˆ ๋ ˆ๋ฒจ ์ œํ•œ

โœ… 6. ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ จ ๊ฐœ๋ฐœ ์‹œ ๊ณ ๋ ค ์‚ฌํ•ญ

  • ์„œ๋ฒ„ ์ธก ๋ Œ๋”๋ง์€ ์š”์ฒญ ๋‹จ์œ„๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๋จ
  • ํŽ˜์ด์ง€๊ฐ€ ๋งŽ์„์ˆ˜๋ก ์ดˆ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น๋Ÿ‰์ด ์ปค์งˆ ์ˆ˜ ์žˆ์Œ
  • ์™ธ๋ถ€ API์—์„œ ๋ฐ›์€ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•  ๋•Œ stream์„ ๊ณ ๋ ค

โœ… ์š”์•ฝ

ํ•ญ๋ชฉ ๊ถŒ์žฅ ์ „๋žต

๋ฉ”๋ชจ๋ฆฌ ๋ถ„์„ process.memoryUsage(), Vercel ๋กœ๊ทธ
์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ์บ์‹œ ์‚ฌ์šฉ, ์ค‘๋ณต ๋ฐ์ดํ„ฐ ์ œ๊ฑฐ
fetch ์ตœ์ ํ™” no-store, revalidate, force-cache
์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ Edge ํ•จ์ˆ˜ ๋‚ด์—์„œ ์‚ฌ์šฉ ์ง€์–‘
๋ฐฐํฌ ๋ฉ”๋ชจ๋ฆฌ ์„ค์ • ์„œ๋ฒ„๋ฆฌ์Šค ์ œํ•œ์— ๋งž๊ฒŒ ์กฐ์ •

 

Next.js, ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”, ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ, ์บ์‹œ ์ „๋žต, fetch ์ตœ์ ํ™”, Edge Function, Vercel ๋ฐฐํฌ, ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜, ์„ฑ๋Šฅ ํ–ฅ์ƒ, ๋ฉ”๋ชจ๋ฆฌ ์ธก์ •, App Router, SSR ์ตœ์ ํ™”