미들웨어(Middleware)
● 서버의 요청(Request) - 응답(Response) 과정에서 중간에 위치하여
특정 기능을 수행하는 함수
● 모든 요청에 대해서 로그(Logging) 남기거나,
특정 사용자만 API(=Authentication & Authorization)를 접근 가능하게 할 때 사용
● 사용자가 웹 페이지에서 Form을 통해 전송한 데이터를 서버에서 쉽게
파싱(Body Parser)하여 사용하게 하는 미들웨어도 존재
Express.js의 Middleware
app.use(express.urlencoded({ extended: false }));
app.use(express.json());
- 위와 같은 형식의 미들웨어
- Body Parser : 클라이언트이 요청(Request) 본문 데이터인 body를
쉽게 파싱할 수 있게 해주는 미들웨어
- unlencoded : from-urlencoded 라는 규격의 body 데이터를
쉽게 코드에서 사용할 수 있게 도와주는 미들웨어
- json : JSON 규격의 body 데이터를 코드에서 사용할 수 있게 해주는 미들웨어
Middleware는 어떻게 작성할까?
app.use((req, res, next) => {
// 필요한 코드
});
● req, res, next = 인자(Parameter)
● req : 요청(Request)에 대한 정보가 담겨있는 객체
- HTTP Headers, Query Parameters, URL 등 브라우저가 서버로 보내는 정보들이 담겨 있음
● res : 응답(Response)을 위한 기능 제공
- 어떤 HTTP Status Code로 응답 할지, 어떤 데이터 형식으로 응답 할지,
헤더는 어떤 값을 넣어 응답 할지 다양한 기능 제공
● next : 다음 스택으로 정의된 미들웨어를 호출
예시 Middleware 사용
Request 로그 남기는 Middleware
app.use((req, res, next) => {
console.log('Request URL:', req.originalUrl, ' - ', new Date());
next();
});
- 콘솔에 req.originalUrl, 시간에 대한 정보를 담아서 출력
- 후에 next()로 다음 미들웨어를 호출
Middleware는 어떤 경우에 사용하는게 적합한가?
● 인증 Middleware : 사용자가 로그인 상태인지 확인
● 로깅 Middleware : 클라이언트의 요청에 대한 정보를 기록
● 에러 핸들링 Middleware : 에러 처리
여러개의 Middleware가 겹치는 경우 동작하는 방식
app.use((req, res, next) => {
console.log('첫번째 미들웨어');
next();
});
app.use((req, res, next) => {
console.log('두번째 미들웨어');
next();
});
app.use((req, res, next) => {
console.log('세번째 미들웨어');
next();
});
// print: 첫번째 미들웨어
// print: 두번째 미들웨어
// print: 세번째 미들웨어
- 여러개의 Middleware가 겹치는 경우, 첫 번째 Middleware부터 순차적 진입
- 단, Middleware 거치는 중간에 next()가 실행되지 않으면 다음 미들웨어 실행 X
→ 클라이언트 요청 종료
Router와 Middleware 차이
● Router는 Middleware 기반으로 구현된 객체. 즉, Middleware와 동일한 방식으로 작동
● Router는 Middleware 함수를 특정 경로에 바인딩하는 역할
● 요청이 들어온 URL 경로에 다라 서로 다른 MiddleWare 실행을 도와줌
에러 처리 Middleware
● 왜 필요한가
- 원치 않았떤 비즈니스 로직이 수행되는 것을 막기 위해
- 서버 코드를 안정적으로 구성할 수 있음
● Express.js의 에러 처리 Middleware
○ 사용 방식
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('Something broke!');
});
- err : 이전 미들웨어에서 발생한 에러를 전달받은 객체
- req, res : HTTP 요청과 응답 관리하는 객체
- next : 다음 Middleware 실행 객
'IT > Server' 카테고리의 다른 글
[Server] HTTP Status Code (1) | 2024.11.29 |
---|---|
[Server] 서버, 클라이언트 / 웹 어플리케이션 서버, 게임 서버 (0) | 2024.11.25 |
[Node.js] 3. Request, Response (2) | 2024.11.20 |
[Node.js] 2. Express.js, API, REST API (1) | 2024.11.19 |
[Node.js] 1. Node.js (1) | 2024.11.18 |