Node.js만으로도 HTTP 서버를 만들 수 있지만, 라우팅·미들웨어·에러 처리를 직접 구현하면 코드가 금세 복잡해진다. Express.js는 그 반복 작업을 추상화한 경량 웹 프레임워크로, Node.js 생태계에서 사실상의 표준으로 자리잡았다. 복잡한 설정 없이 몇 줄만으로 프로덕션 수준의 HTTP 서버를 구성할 수 있다.
Express는 Node.js 내장 http 모듈 위에 얹은 얇은 레이어다. 직접 http.createServer를 작성할 때보다 라우팅, 요청/응답 헬퍼, Middleware 체인 등을 선언적으로 구성할 수 있게 해준다.
Client Request
│
▼
┌─────────────────────────────┐
│ Express App │
│ ┌────────────────────────┐ │
│ │ Middleware Stack │ │
│ │ (logger → auth → ...) │ │
│ └────────────┬───────────┘ │
│ ▼ │
│ ┌────────────────────────┐ │
│ │ Router │ │
│ │ GET / → handler │ │
│ │ POST /api → handler │ │
│ └────────────┬───────────┘ │
└───────────────┼─────────────┘
▼
HTTP Response
Middleware: 요청과 응답 사이에서 실행되는 함수. next를 호출해 다음 미들웨어로 제어를 넘긴다.
Node.js http 모듈은 URL 파싱, 메서드 분기, 바디 파싱을 모두 수작업으로 해야 한다. Express는 이를 간결하게 처리한다.
| 기능 | 순수 Node.js | Express |
|---|---|---|
| 라우팅 | if/else 분기 | app.get, app.post |
| 바디 파싱 | 스트림 수동 수집 | express.json 미들웨어 |
| 정적 파일 | 직접 구현 | express.static |
| 에러 처리 | try/catch 전역 관리 | 4-인자 미들웨어 |
npm init -y
npm install express
const express = require('express');
const app = express();
app.use(express.json());
app.get('/', (req, res) => {
res.send('Hello, Express!');
});
app.post('/api/echo', (req, res) => {
res.json({ received: req.body });
});
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
app.use: 모든 경로에 Middleware를 등록하는 메서드. 순서가 실행 순서와 동일하다.
passport, multer, helmet 등 Express용 미들웨어가 풍부하다.Express는 빠른 프로토타이핑, REST API 서버, 소규모 마이크로서비스에 적합하다. 반면 대형 엔터프라이즈 프로젝트에서 강한 구조와 DI(Dependency Injection)가 필요하다면 NestJS 같은 상위 프레임워크가 낫다.
REST API: HTTP 메서드(GET·POST·PUT·DELETE)로 자원을 조작하는 설계 방식. Express는 이 패턴을 구현하기 가장 간단한 도구 중 하나다.