ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

๐Ÿ› ๏ธ Next.js์—์„œ ์ปค์Šคํ…€ ์„œ๋ฒ„(Custom Server) ๊ตฌ์ถ•ํ•˜๊ธฐ

Next.js๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋‚ด์žฅ ์„œ๋ฒ„๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ, ํŠน์ • ์š”๊ตฌ ์‚ฌํ•ญ์ด๋‚˜ ๋งž์ถคํ˜• ๋ผ์šฐํŒ…์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ปค์Šคํ…€ ์„œ๋ฒ„๋ฅผ ์ง์ ‘ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ปค์Šคํ…€ ์„œ๋ฒ„๋ฅผ ํ†ตํ•ด Express, Koa, Fastify ๋“ฑ ๋‹ค์–‘ํ•œ Node.js ์„œ๋ฒ„ ํ”„๋ ˆ์ž„์›Œํฌ์™€ ์—ฐ๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


โœ… ์ปค์Šคํ…€ ์„œ๋ฒ„๋ž€?

์ปค์Šคํ…€ ์„œ๋ฒ„๋Š” Next.js ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ง์ ‘ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” Node.js ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.
๊ธฐ๋ณธ ์ œ๊ณต ์„œ๋ฒ„๋ฅผ ๋Œ€์ฒดํ•˜์—ฌ, ๋” ๋ณต์žกํ•œ ๋ผ์šฐํŒ…์ด๋‚˜ ๋ฏธ๋“ค์›จ์–ด ํ†ตํ•ฉ์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ปค์Šคํ…€ ์„œ๋ฒ„์˜ ํ™œ์šฉ ์˜ˆ

  • ๋™์  API ๋ผ์šฐํŒ…
  • ๋ฏธ๋“ค์›จ์–ด ์‚ฌ์šฉ (์ธ์ฆ, ๋กœ๊ทธ ๋“ฑ)
  • ์™ธ๋ถ€ ์„œ๋น„์Šค์™€์˜ ์—ฐ๋™ (OAuth, WebSocket ๋“ฑ)
  • ํŠน์ • ํ—ค๋” ์„ค์ • (๋ณด์•ˆ ํ—ค๋” ์ถ”๊ฐ€)

โœ… ๊ธฐ๋ณธ ์ปค์Šคํ…€ ์„œ๋ฒ„ ์„ค์ •

1. ์„œ๋ฒ„ ํŒŒ์ผ ์ƒ์„ฑ

ํ”„๋กœ์ ํŠธ ๋ฃจํŠธ์— server.js ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

const { createServer } = require('http');
const { parse } = require('url');
const next = require('next');

const port = process.env.PORT || 3000;
const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev });
const handle = app.getRequestHandler();

app.prepare().then(() => {
  createServer((req, res) => {
    const parsedUrl = parse(req.url, true);
    handle(req, res, parsedUrl);
  }).listen(port, () => {
    console.log(`๐Ÿš€ ์„œ๋ฒ„ ์‹คํ–‰ ์ค‘: http://localhost:${port}`);
  });
});

2. ์Šคํฌ๋ฆฝํŠธ ์ˆ˜์ •

๋ฐ˜์‘ํ˜•

package.json ํŒŒ์ผ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

"scripts": {
  "dev": "node server.js",
  "build": "next build",
  "start": "NODE_ENV=production node server.js"
}

โœ… Express๋ฅผ ์‚ฌ์šฉํ•œ ๊ณ ๊ธ‰ ์ปค์Šคํ…€ ์„œ๋ฒ„

1. ์„ค์น˜

npm install express

2. ์„œ๋ฒ„ ์„ค์ •

server.js๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

const express = require('express');
const next = require('next');

const port = process.env.PORT || 3000;
const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev });
const handle = app.getRequestHandler();

app.prepare().then(() => {
  const server = express();

  // ์ปค์Šคํ…€ ๋ผ์šฐํŒ…
  server.get('/hello', (req, res) => {
    res.send('์•ˆ๋…•ํ•˜์„ธ์š”! Next.js ์ปค์Šคํ…€ ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.');
  });

  // Next.js์˜ ๊ธฐ๋ณธ ํ•ธ๋“ค๋Ÿฌ
  server.all('*', (req, res) => {
    return handle(req, res);
  });

  server.listen(port, () => {
    console.log(`๐Ÿš€ ์„œ๋ฒ„ ์‹คํ–‰ ์ค‘: http://localhost:${port}`);
  });
});

โœ… TypeScript๋กœ ์ปค์Šคํ…€ ์„œ๋ฒ„ ๊ตฌ์„ฑ

1. ์„ค์น˜

npm install ts-node typescript @types/node

2. ์„œ๋ฒ„ ํŒŒ์ผ ์ƒ์„ฑ

server.ts ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

import express from 'express';
import next from 'next';

const port = parseInt(process.env.PORT || '3000', 10);
const dev = process.env.NODE_ENV !== 'production';
const app = next({ dev });
const handle = app.getRequestHandler();

app.prepare().then(() => {
  const server = express();

  server.get('/greet', (req, res) => {
    res.send('Hello from TypeScript Server!');
  });

  server.all('*', (req, res) => {
    handle(req, res);
  });

  server.listen(port, () => {
    console.log(`๐Ÿš€ ์„œ๋ฒ„ ์‹คํ–‰ ์ค‘: http://localhost:${port}`);
  });
});

3. ์Šคํฌ๋ฆฝํŠธ ์ˆ˜์ •

"scripts": {
  "dev": "ts-node server.ts",
  "build": "next build",
  "start": "NODE_ENV=production ts-node server.ts"
}

โœ… ์ปค์Šคํ…€ ์„œ๋ฒ„ ์‚ฌ์šฉ ์‹œ ์ฃผ์˜์‚ฌํ•ญ

  1. Vercel ๋ฏธ์ง€์›
    • Vercel์—์„œ๋Š” ์ปค์Šคํ…€ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
    • AWS EC2, DigitalOcean, Heroku ๋“ฑ ์ž์ฒด ํ˜ธ์ŠคํŒ… ํ•„์š”
  2. ์ž๋™ ์ตœ์ ํ™” ๊ธฐ๋Šฅ ๋น„ํ™œ์„ฑํ™”
    • ์ปค์Šคํ…€ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Next.js์˜ ์ผ๋ถ€ ์ตœ์ ํ™” ๊ธฐ๋Šฅ์ด ๋น„ํ™œ์„ฑํ™”๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํŠนํžˆ, ์ •์  ํŽ˜์ด์ง€ ์ตœ์ ํ™”์™€ ์„œ๋ฒ„๋ฆฌ์Šค ํ•จ์ˆ˜ ์ง€์›์ด ๋ถˆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  3. SSR ๋ฐ ์„ฑ๋Šฅ ๊ณ ๋ ค
    • ์„œ๋ฒ„ ์ธก์—์„œ ์ง์ ‘ ๋ผ์šฐํŒ…์„ ์ฒ˜๋ฆฌํ•˜๋ฏ€๋กœ, ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ์บ์‹ฑ ์ „๋žต์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
    • ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ SSR๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ์ •์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.

โœ… ๋ฐฐํฌ ์ „๋žต

  1. Docker๋ฅผ ํ™œ์šฉํ•œ ๋ฐฐํฌ
FROM node:18-alpine

WORKDIR /app
COPY package*.json ./
RUN npm install

COPY . .
RUN npm run build

CMD ["node", "server.js"]
  1. AWS EC2 ๋ฐฐํฌ
    • EC2 ์ธ์Šคํ„ด์Šค์—์„œ Docker๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹คํ–‰
    • AWS Load Balancer๋ฅผ ์ด์šฉํ•˜์—ฌ ํŠธ๋ž˜ํ”ฝ ๊ด€๋ฆฌ

โœ… ์š”์•ฝ

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

๊ธฐ๋ณธ ์„œ๋ฒ„ ์„ค์ • server.js ํŒŒ์ผ ์ƒ์„ฑ, Next.js ์ง์ ‘ ํ•ธ๋“ค๋ง
Express ์„œ๋ฒ„ ์‚ฌ์šฉ ๊ณ ๊ธ‰ ๋ผ์šฐํŒ… ๋ฐ ๋ฏธ๋“ค์›จ์–ด ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
TypeScript ์„œ๋ฒ„ ๊ตฌ์„ฑ ํƒ€์ž… ์•ˆ์ „์„ฑ ๋ณด์žฅ, ts-node ์‚ฌ์šฉ
์ฃผ์˜์‚ฌํ•ญ Vercel ๋ฏธ์ง€์›, ์ž์ฒด ํ˜ธ์ŠคํŒ… ํ•„์š”
๋ฐฐํฌ ์ „๋žต Docker์™€ AWS EC2๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์•ˆ์ •์  ์šด์˜ ๊ฐ€๋Šฅ

 

Next.js, ์ปค์Šคํ…€ ์„œ๋ฒ„, Express, TypeScript, ์„œ๋ฒ„ ๊ตฌ์„ฑ, Docker ๋ฐฐํฌ, AWS EC2, ๋ฏธ๋“ค์›จ์–ด, ๋ผ์šฐํŒ… ์„ค์ •, Node.js ์„œ๋ฒ„ ๊ตฌ์ถ•

โ€ป ์ด ํฌ์ŠคํŒ…์€ ์ฟ ํŒก ํŒŒํŠธ๋„ˆ์Šค ํ™œ๋™์˜ ์ผํ™˜์œผ๋กœ, ์ด์— ๋”ฐ๋ฅธ ์ผ์ •์•ก์˜ ์ˆ˜์ˆ˜๋ฃŒ๋ฅผ ์ œ๊ณต๋ฐ›์Šต๋‹ˆ๋‹ค.
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/05   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•