Express.js는 Node.js 위에서 동작하는 웹 프레임워크 중 전 세계 점유율 1위를 차지하는 사실상의 표준(De Facto Standard)입니다. 지저분한 라우팅 코드(if/else)를 직관적으로 분리해주며, 수천 개의 플러그인(미들웨어)을 장착할 수 있는 확장성을 자랑합니다.
가장 중요한 개념: 미들웨어 (Middleware)
미들웨어는 공장 컨베이어 벨트의 작업자들과 같습니다. 클라이언트의 요청이 들어오면, 1번 작업자(예: 로그 기록)가 일을 한 뒤 next()를 호출하여 2번 작업자(예: 권한 검사)에게 바통을 넘깁니다. 최종적으로 라우터가 res.send()로 클라이언트에 응답을 보내면 이 여정이 끝납니다.
Express 미들웨어 파이프라인
클라이언트의 요청이 들어왔을 때, 여러 미들웨어를 거치며 순차적으로 처리된 후 최종 라우터에서 응답을 반환하는 과정을 확인해 보세요.
express_app.js
const express = require('express');
const app = express();
// 1. 첫 번째 미들웨어: Logger (모든 요청에 대해 무조건 실행됨)
app.use((req, res, next) => {
console.log(`[미들웨어 1: Logger] 접속 시간 기록 완료. -> next() 호출`);
next(); // 다음 미들웨어로 바통 터치!
});
// 2. 두 번째 미들웨어: Auth (권한 검증)
app.use((req, res, next) => {
console.log(`[미들웨어 2: Auth] 사용자 권한 검증 성공! -> next() 호출`);
next();
});
// 3. 최종 라우터 (클라이언트에게 응답을 반환하고 체인 종료)
app.get('/', (req, res) => {
console.log(`[최종 라우터: app.get("/")] 환영 페이지 응답(res.send) 전송 완료! ✅`);
res.send('<h1>Welcome to Express</h1><p>미들웨어를 무사히 통과했습니다.</p>');
});
app.listen(3000, () => {
console.log('Express 서버가 3000번 포트에서 대기 중입니다...');
});
localhost:3000/
Welcome to Express
미들웨어를 무사히 통과했습니다.
Server Console
$ node express_app.js
Express 서버가 3000번 포트에서 대기 중입니다...
> 클라이언트 요청 수신됨 (GET /)
[미들웨어 1: Logger] 접속 시간 기록 완료. -> next() 호출
[미들웨어 2: Auth] 사용자 권한 검증 성공! -> next() 호출
[최종 라우터: app.get("/")] 환영 페이지 응답(res.send) 전송 완료! ✅