BioPlayground

🧬
목록으로

미들웨어란 무엇인가

Express 미들웨어가 무엇인지, 요청이 서버를 통과하는 과정을 파이프라인으로 이해합니다.

중급
|
8
|
검증 완료 (2026-07)
미들웨어Express요청 파이프라인next 함수로깅
진행률0/18 (0%)

미들웨어란 무엇인가

이 토픽을 마치면

미들웨어가 무엇인지 설명할 수 있고, Express에서 요청이 처리되는 순서(파이프라인)를 이해하며, 직접 미들웨어를 만들어 적용할 수 있습니다.


요청과 응답 사이의 "중간 처리"

웹 서버에 요청이 들어오면 바로 응답을 보내는 것이 아닙니다. 그 사이에 여러 단계를 거칩니다.

text
요청(Request) → [로깅] → [인증 확인] → [본문 파싱] → 라우트 핸들러 → 응답(Response)

이 중간 단계 하나하나가 미들웨어(Middleware) 입니다. "요청이 들어와서 응답이 나가기까지 중간에서 무언가를 하는 함수"라고 정의할 수 있습니다.


Express 미들웨어의 구조

Express에서 미들웨어는 3개의 파라미터를 받는 함수입니다.

javascript
function myMiddleware(req, res, next) {
  // req: 요청 객체 (클라이언트가 보낸 정보)
  // res: 응답 객체 (서버가 보낼 정보)
  // next: 다음 미들웨어로 넘기는 함수
  
  console.log(`${req.method} ${req.url}`);
  next(); // 이걸 호출하지 않으면 요청이 여기서 멈춤!
}

app.use(myMiddleware);

next()가 핵심입니다. 이것을 호출해야 다음 미들웨어(또는 라우트 핸들러)로 넘어갑니다. next()를 빠뜨리면 클라이언트는 응답을 영원히 기다리게 됩니다.


실전 미들웨어 — 로깅, 인증, 에러

요청 로깅

javascript
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

인증 확인

javascript
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()로 모든 요청에 적용할 수도 있고, 특정 라우트의 두 번째 인자로 넣어서 선택적으로 적용할 수도 있습니다.

에러 처리 미들웨어

javascript
// 파라미터 4개 — Express가 에러 핸들러로 인식
app.use((err, req, res, next) => {
  console.error(err.stack);
  res.status(500).json({ error: '서버 내부 오류' });
});

에러 처리 미들웨어는 파라미터가 4개입니다 (err 추가). Express는 이 시그니처로 에러 핸들러를 구분합니다. 코드 어디서든 next(err)를 호출하면 여기로 도착합니다.


실행 순서가 곧 파이프라인

미들웨어는 app.use()로 등록한 순서대로 실행됩니다. 순서를 바꾸면 동작이 달라집니다.

javascript
// 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.bodyundefined입니다. 미들웨어는 코드의 위치가 곧 실행 순서입니다.


핵심 정리

미들웨어는 거창한 개념이 아닙니다. (req, res, next) 함수를 순서대로 연결한 파이프라인입니다. 로깅, 인증, 파싱, 에러 처리 — 웹 서버에서 반복되는 모든 "중간 작업"이 미들웨어입니다. Express뿐 아니라 대부분의 웹 프레임워크(Django, Rails, Spring)에도 같은 개념이 있으니, 한 번 이해하면 어디서든 적용할 수 있습니다.