ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ ๏ธ Next.js์์ ์ปค์คํ ์๋ฒ(Custom Server) ๊ตฌ์ถํ๊ธฐ
octo54 2025. 5. 12. 10:05๐ ๏ธ 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"
}
โ ์ปค์คํ ์๋ฒ ์ฌ์ฉ ์ ์ฃผ์์ฌํญ
- Vercel ๋ฏธ์ง์
- Vercel์์๋ ์ปค์คํ ์๋ฒ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- AWS EC2, DigitalOcean, Heroku ๋ฑ ์์ฒด ํธ์คํ ํ์
- ์๋ ์ต์ ํ ๊ธฐ๋ฅ ๋นํ์ฑํ
- ์ปค์คํ ์๋ฒ๋ฅผ ์ฌ์ฉํ๋ฉด Next.js์ ์ผ๋ถ ์ต์ ํ ๊ธฐ๋ฅ์ด ๋นํ์ฑํ๋ ์ ์์ต๋๋ค.
- ํนํ, ์ ์ ํ์ด์ง ์ต์ ํ์ ์๋ฒ๋ฆฌ์ค ํจ์ ์ง์์ด ๋ถ๊ฐํฉ๋๋ค.
- SSR ๋ฐ ์ฑ๋ฅ ๊ณ ๋ ค
- ์๋ฒ ์ธก์์ ์ง์ ๋ผ์ฐํ ์ ์ฒ๋ฆฌํ๋ฏ๋ก, ์ฑ๋ฅ ์ต์ ํ๋ฅผ ์ํด ์บ์ฑ ์ ๋ต์ด ํ์ํฉ๋๋ค.
- ํ์ํ ๋ถ๋ถ๋ง SSR๋ก ์ฒ๋ฆฌํ๊ณ ๋๋จธ์ง๋ ์ ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
โ ๋ฐฐํฌ ์ ๋ต
- Docker๋ฅผ ํ์ฉํ ๋ฐฐํฌ
FROM node:18-alpine
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
CMD ["node", "server.js"]
- 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 ์๋ฒ ๊ตฌ์ถ
'framework > NextJS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๐ Next.js Draft Mode ์ฌ์ฉ ๊ฐ์ด๋ (0) | 2025.05.14 |
---|---|
๐ชฒ Next.js ๋๋ฒ๊น ๊ฐ์ด๋ (0) | 2025.05.13 |
๐ NestJS ModuleRef โ ๋์ ๋ชจ๋ ์ธ์คํด์ค ์ฃผ์ ์์ ๊ฐ์ด๋ (0) | 2025.05.12 |
๐จ Next.js App Router์์ CSS-in-JS ์ฌ์ฉํ๊ธฐ (0) | 2025.05.09 |
๐ก๏ธ Next.js Content Security Policy(CSP) ์ค์ ๊ฐ์ด๋ (0) | 2025.05.09 |
- Total
- Today
- Yesterday
- ๊ฐ๋ฐ๋ธ๋ก๊ทธ
- ํ์ด์ฌ ์๊ณ ๋ฆฌ์ฆ
- CI/CD
- gatsbyjs
- ๋ฐฑ์๋๊ฐ๋ฐ
- nodejs
- ํ๋ก ํธ์๋
- Next.js
- seo ์ต์ ํ 10๊ฐ
- rag
- Webpack
- Python
- Prisma
- github
- NestJS
- llm
- PostgreSQL
- SEO์ต์ ํ
- fastapi
- AI์ฑ๋ด
- Ktor
- Docker
- kotlin
- nextJS
- REACT
- ๊ด๋ฆฌ์
- ์น๊ฐ๋ฐ
- App Router
- LangChain
- ํ๋ก ํธ์๋๋ฉด์
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |