티스토리 뷰

Node.js
Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.
nodejs.org
Middleware
▶ 미들웨어(Middleware) 란?
HTTP 요청과 응답 사이에서 단계별 동작을 수행해주는 함수
- HTTP 요청이 들어온 순간부터 시작됨
- 미들웨어는 HTTP 요청과 응답 객체를 처리하거나 다음 미들웨어를 실행
- HTTP 응답이 마무리될 때까지 미들웨어 동작 사이클이 실행

▶ Middleware 작성법
req, res, next 를 인자로 갖는 함수를 작성하면 해당 함수는 미들웨어로 동작할 수 있음
- req : HTTP 요청을 처리하는 객체
- res : HTTP 응답을 처리하는 객체
- next : 다음 미들웨어를 실행하는 함수
req, res 객체를 통해 HTTP 요청과 응답을 처리하거나 next 함수를 통해 다음 미들웨어를 호출
const logger = (req, res, next) => {
console.log(`Request ${req.path}`);
next();
}
const auth = (req, res, next) => {
if (!isAdmin(req)) {
next(new Error('Not Authorized'));
return;
}
next();
}
! next() 함수가 호출되지 않으면 미들웨어 사이클이 멈춰서 HTTP 요청과 응답이 제대로 처리되지 않으니 주의
* Route Handler도 미들웨어의 한 종류
: Route Handler는 라우팅 함수 (get, post, put, delete 등) 에 적용된 미들웨어로,
일반적인 미들웨어와는 다르게 path parameter 를 사용할 수 있음
▶ Middleware 사용법
: 미들웨어는 적용되는 위치에 따라 어플리케이션 미들웨어, 라우터 미들웨어, 오류처리 미들웨어로 분류 가능
→ 필요한 동작 방식에 따라 미들웨어를 적용할 위치 결정
1) 어플리케이션 미들웨어
: app객체에 use나 http method함수를 사용하여 연결한 미들웨어
- 미들웨어를 모든 요청에 공통적으로 적용하기 위한 방법
- HTTP 요청이 들어온 순간부터 적용된 순서대로 동작
app.use((req, res, next) => { // 실행순서 1
console.log(`Request ${req.path}`);
next();
});
app.use(auth); // 2
app.get('/', (req, res, next) => { //3
res.send('Hello Express');
});
2) 라우터 미들웨어
: 미들웨어가 router객체에 적용되는 것 외에는 어플리케이션 미들웨어와 사용방법은 동일
- 특정 경로의 라우팅에만 미들웨어를 적용하기 위한 방법
- app 객체에 라우터가 적용된 이후 순서대로 동작
router.use(auth); //3
router.get('/', (req, res, next) => { //4
res.send('Hello Router');
});
app.use((req, res, next) => { // 실행순서 1
console.log(`Request ${req.path}`);
next();
});
app.use('/admin', router); // 2
3) 미들웨어 서브스택
: use 나 http method 함수에 미들웨어를 적용할 때 한번에 여러개의 미들웨어를 동시에 적용
- 주로 한 개의 경로에 특정해서 미들웨어를 여러개로 적용하기 위한 방법
- 전달된 인자 순서대로 동작
app.use(middleware1, middlware2, ...); // 실행순서 middleware1 -> middlware2 -> ...
app.use('/admin', auth, adminRouter);
app.get('/', logger, (req, res, next) => {
res.send('Hello Express');
});
4) 오류처리 미들웨어
: err, req, res, next 네가지 인자를 가지는 미들웨어
- 일반적으로 가장 마지막에 위치함
- 이전에 적용된 미들웨어 중 next 에 인자를 넘기는 경우 중간 미들웨어들은 뛰어넘고 오류처리 미들웨어가 바로 실행
app.use((req, res, next) => {
if (!isAdmin(req)) {
next(new Error('Not Authorized')); // next에 Error를 인자로 넘기면
return;
}
next();
});
app.get('/', (req, res, next) => { // 이 미들웨어는 뛰어넘고
res.send('Hello Express');
});
app.use((err, req, res, next) => { // 오류처리 미들웨어 실행
res.send('Error Occurred');
});
5) 함수형 미들웨어
: 하나의 미들웨어를 작동모드를 선택하면서 사용하고 싶은 경우 미들웨어를 함수형으로 작성하여 사용 가능
(ex. API 별로 사용자의 권한을 다르게 제한하고 싶은 경우)
- 아래 auth 함수는 미들웨어 함수를 반환하는 함수
- auth 함수 실행 시 미들웨어의 동작이 결정되는 방식으로 작성된 코드
- 일반적으로 동일한 로직에 설정값만 다르게 미들웨어를 적용하고 싶을 경우 사용
const auth = (memberType) => {
return (req, res, next) => {
if (!checkMember(req, memberType)) {
next(new Error(`member not ${memberType}`));
return;
}
next();
}
}
app.use('/admin', auth('admin'), adminRouter);
app.use('/users', auth('member'), userRouter);
▶ Middleware Libraries (미들웨어 라이브러리)
Express.js 는 다양한 미들웨어들이 이미 만들어져 라이브러리로 제공
유용한 미들웨어를 npm을 통해 추가하여 사용 가능
Express.js 홈페이지나 npm 온라인 저장소에서 찾아볼 수 있음

이 글은 엘리스 AI트랙 5기 강의를 들으며 정리한 내용입니다.
'개발공부 > 🟩 Node.js' 카테고리의 다른 글
| [NodeJS] Node.js와 MongoDB (0) | 2022.07.31 |
|---|---|
| [NodeJS] Express.js로 REST API 구현하기 (0) | 2022.07.30 |
| [NodeJS] 웹과 Express.js (0) | 2022.07.27 |
| [NodeJS] NPM과 모듈 (0) | 2022.07.27 |
| [NodeJS] Node.js 이해하기 (0) | 2022.07.26 |
프론트엔드 개발자 삐롱히의 개발 & 공부 기록 블로그