미들웨어란 무엇인가
이 토픽을 마치면
미들웨어가 무엇인지 설명할 수 있고, Express에서 요청이 처리되는 순서(파이프라인)를 이해하며, 직접 미들웨어를 만들어 적용할 수 있습니다.
요청과 응답 사이의 "중간 처리"
웹 서버에 요청이 들어오면 바로 응답을 보내는 것이 아닙니다. 그 사이에 여러 단계를 거칩니다.
요청(Request) → [로깅] → [인증 확인] → [본문 파싱] → 라우트 핸들러 → 응답(Response)이 중간 단계 하나하나가 미들웨어(Middleware) 입니다. "요청이 들어와서 응답이 나가기까지 중간에서 무언가를 하는 함수"라고 정의할 수 있습니다.
Express 미들웨어의 구조
Express에서 미들웨어는 3개의 파라미터를 받는 함수입니다.
function myMiddleware(req, res, next) {
// req: 요청 객체 (클라이언트가 보낸 정보)
// res: 응답 객체 (서버가 보낼 정보)
// next: 다음 미들웨어로 넘기는 함수
console.log(`${req.method} ${req.url}`);
next(); // 이걸 호출하지 않으면 요청이 여기서 멈춤!
}
app.use(myMiddleware);next()가 핵심입니다. 이것을 호출해야 다음 미들웨어(또는 라우트 핸들러)로 넘어갑니다. next()를 빠뜨리면 클라이언트는 응답을 영원히 기다리게 됩니다.
실전 미들웨어 — 로깅, 인증, 에러
요청 로깅
app.use((req, res, next) => {
const now = new Date().toISOString();
console.log(`[${now}] ${req.method} ${req.url}`);
next();
});
// [2026-07-03T10:30:00.000Z] GET /users인증 확인
function authGuard(req, res, next) {
const token = req.headers.authorization;
if (!token) {
return res.status(401).json({ error: '로그인이 필요합니다' });
}
next(); // 토큰이 있으면 다음으로
}
// 특정 라우트에만 적용
app.get('/my-profile', authGuard, (req, res) => {
res.json({ name: '김훈' });
});app.use()로 모든 요청에 적용할 수도 있고, 특정 라우트의 두 번째 인자로 넣어서 선택적으로 적용할 수도 있습니다.
에러 처리 미들웨어
// 파라미터 4개 — Express가 에러 핸들러로 인식
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({ error: '서버 내부 오류' });
});에러 처리 미들웨어는 파라미터가 4개입니다 (err 추가). Express는 이 시그니처로 에러 핸들러를 구분합니다. 코드 어디서든 next(err)를 호출하면 여기로 도착합니다.
실행 순서가 곧 파이프라인
미들웨어는 app.use()로 등록한 순서대로 실행됩니다. 순서를 바꾸면 동작이 달라집니다.
// 1. 본문 파싱 (먼저!)
app.use(express.json());
// 2. 로깅
app.use((req, res, next) => {
console.log(`${req.method} ${req.url}`, req.body);
next();
});
// 3. 라우트
app.post('/users', (req, res) => {
res.json(req.body);
});
// 4. 에러 처리 (항상 마지막)
app.use((err, req, res, next) => {
res.status(500).json({ error: err.message });
});express.json()을 로깅보다 앞에 둬야 req.body에 파싱된 데이터가 들어 있습니다. 순서를 바꾸면 req.body가 undefined입니다. 미들웨어는 코드의 위치가 곧 실행 순서입니다.
핵심 정리
미들웨어는 거창한 개념이 아닙니다. (req, res, next) 함수를 순서대로 연결한 파이프라인입니다. 로깅, 인증, 파싱, 에러 처리 — 웹 서버에서 반복되는 모든 "중간 작업"이 미들웨어입니다. Express뿐 아니라 대부분의 웹 프레임워크(Django, Rails, Spring)에도 같은 개념이 있으니, 한 번 이해하면 어디서든 적용할 수 있습니다.