이번 강좌에서는 Node.js의 유명한 웹 프레임워크인 Express를 사용하여 기본적인 미들웨어를 활용하는 방법을 알아보겠습니다. Express는 RESTful API 서버 및 웹 어플리케이션을 구축하는 데 매우 적합한 프레임워크이며, 강력한 미들웨어 시스템을 갖추고 있습니다. 미들웨어는 요청과 응답 객체를 처리하는 함수로, 다양한 기능들을 제공해 줍니다.
1. 미들웨어란?
미들웨어는 클라이언트의 요청(request)과 서버의 응답(response) 사이에서 중개 역할을 수행하는 함수입니다. 미들웨어는 여러 가지 용도로 사용될 수 있는데, 여기에는 요청 데이터의 처리, 사용자 인증 및 보안 체크, 로그 기록 및 오류 처리 등이 포함됩니다.
2. Express에서 미들웨어 사용하기
Express는 app.use()
메서드를 통해 미들웨어를 등록합니다. 이 메서드는 요청이 들어올 때마다 실행되며, 순차적으로 등록된 미들웨어가 실행됩니다.
3. 기본 미들웨어 설치 및 설정
Express의 기본 미들웨어 중 두 가지인 body-parser와 cookie-parser를 설치하고 설정하는 방법을 알아보겠습니다.
3.1 body-parser
body-parser 미들웨어는 HTTP 요청 본문을 구문 분석하여 자바스크립트 객체로 변환해주는 기능을 합니다. 일반적으로 JSON 형태의 데이터를 쉽게 처리할 수 있도록 돕습니다.
npm install body-parser
3.1.1 body-parser 설정 예제
다음은 body-parser를 사용하는 간단한 설정 예제입니다.
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
const PORT = 3000;
// body-parser 미들웨어 사용
app.use(bodyParser.json()); // JSON 형태의 데이터 파싱
app.use(bodyParser.urlencoded({ extended: true })); // URL 인코딩 데이터 파싱
app.post('/api/data', (req, res) => {
console.log(req.body); // 파싱된 데이터 로그 출력
res.send('데이터 수신 완료');
});
app.listen(PORT, () => {
console.log(`서버가 http://localhost:${PORT} 에서 시작되었습니다.`);
});
위 예제에서 bodyParser.json()
메서드는 클라이언트가 보내는 JSON 형태의 요청 본문을 파싱하고, bodyParser.urlencoded()
메서드는 URL 인코딩된 데이터를 파싱합니다.
3.2 cookie-parser
cookie-parser 미들웨어는 클라이언트의 요청에서 쿠키를 파싱하여 req.cookies
객체에 저장하는 기능을 합니다. 이 기능은 사용자의 상태를 저장하고 관리하는 데 유용합니다.
npm install cookie-parser
3.2.1 cookie-parser 설정 예제
다음은 cookie-parser를 사용하는 간단한 설정 예제입니다.
const express = require('express');
const cookieParser = require('cookie-parser');
const app = express();
const PORT = 3000;
// cookie-parser 미들웨어 사용
app.use(cookieParser());
app.get('/set-cookie', (req, res) => {
res.cookie('myCookie', 'testValue', { maxAge: 900000, httpOnly: true });
res.send('쿠키가 설정되었습니다.');
});
app.get('/get-cookie', (req, res) => {
console.log(req.cookies); // 저장된 쿠키 로그 출력
res.send('쿠키 값을 확인하였습니다.');
});
app.listen(PORT, () => {
console.log(`서버가 http://localhost:${PORT} 에서 시작되었습니다.`);
});
위 예제에서 res.cookie()
메서드를 사용하여 쿠키를 설정하고, req.cookies
를 통해 요청에 포함된 쿠키 값을 확인합니다. 쿠키는 사용자의 세션 정보를 저장하거나, 개인화된 사용자 경험을 제공하는 데 자주 사용됩니다.
4. 실습 예제: 미들웨어 통합하기
이제 body-parser와 cookie-parser를 모두 사용하는 예제를 만들어 보겠습니다. 이 예제는 사용자로부터 데이터를 받아와 쿠키에 저장하고, 후에 그 데이터를 읽어오는 API를 제공합니다.
const express = require('express');
const bodyParser = require('body-parser');
const cookieParser = require('cookie-parser');
const app = express();
const PORT = 3000;
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(cookieParser());
app.post('/submit', (req, res) => {
const { username } = req.body; // 요청 본문에서 username 추출
res.cookie('username', username, { maxAge: 900000, httpOnly: true });
res.send('사용자 이름이 쿠키에 저장되었습니다.');
});
app.get('/welcome', (req, res) => {
const username = req.cookies.username; // 쿠키에서 사용자 이름 추출
if (username) {
res.send(`환영합니다, ${username}님!`);
} else {
res.send('쿠키에 저장된 사용자 이름이 없습니다.');
}
});
app.listen(PORT, () => {
console.log(`서버가 http://localhost:${PORT} 에서 시작되었습니다.`);
});
위 예제에서 클라이언트가 /submit
경로로 POST 요청을 하면, 사용자 이름을 쿠키에 저장하고, /welcome
경로로 GET 요청을 하면 저장된 사용자 이름을 응답으로 돌려줍니다.
5. 미들웨어 체이닝
Express에서는 여러 개의 미들웨어를 체이닝하여 사용할 수 있습니다. 체이닝을 통해 요청을 효율적으로 처리하고, 코드의 가독성을 높일 수 있습니다. 아래는 미들웨어 체이닝의 예입니다.
const express = require('express');
const app = express();
const PORT = 3000;
const logRequest = (req, res, next) => {
console.log(`${req.method} ${req.url}`);
next(); // 다음 미들웨어로 이동
};
app.use(logRequest);
app.get('/', (req, res) => {
res.send('홈페이지');
});
app.listen(PORT, () => {
console.log(`서버가 http://localhost:${PORT} 에서 시작되었습니다.`);
});
위 예제에서 logRequest
미들웨어는 모든 요청에 대해 요청 메서드와 URL을 로그로 출력합니다. next()
호출 없이 미들웨어가 종료된다면, 이후의 미들웨어나 라우터가 실행되지 않으므로, 항상 next()
를 호출해 주어야 합니다.
6. 에러 처리 미들웨어
Express에서는 에러 처리를 위한 특별한 미들웨어를 제공합니다. 에러 처리 미들웨어는 항상 네 개의 인자를 가집니다: (err, req, res, next)
. 예를 들어, 다음은 기본적인 에러 처리 미들웨어의 예입니다.
const express = require('express');
const app = express();
const PORT = 3000;
app.get('/', (req, res) => {
throw new Error('에러 발생!'); // 강제로 오류 발생
});
// 에러 처리 미들웨어
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('무언가 잘못되었습니다!');
});
app.listen(PORT, () => {
console.log(`서버가 http://localhost:${PORT} 에서 시작되었습니다.`);
});
위 예제에서는 /
경로에서 의도적으로 오류를 발생시켜, 이후에 정의된 에러 처리 미들웨어가 호출되도록 하였습니다. 에러 처리 미들웨어는 콘솔에 오류 스택을 출력하고, 클라이언트에게 500 상태 코드를 응답으로 돌려줍니다.
7. 마치며
이번 강좌에서는 Express의 기본 미들웨어 사용법에 대해 알아보았습니다. body-parser와 cookie-parser를 통해 요청 본문 및 쿠키를 처리하는 방법을 배웠으며, 미들웨어 체이닝 및 에러 처리 미들웨어의 중요성도 확인하였습니다. Express 미들웨어는 웹 애플리케이션의 요청 처리에서 매우 중요한 역할을 하므로, 제대로 이해하고 활용하는 것이 중요합니다.
더 나아가, 자신만의 미들웨어를 만들어보거나, 다양한 미들웨어를 활용하여 Express 애플리케이션을 확장해 나가길 추천합니다. 감사합나다!