티스토리 뷰
웹 서버에서 요청을 받을 때, 모든 요청에 대한 공통적인 처리를 하고 싶을 때 필요한 것이 미들웨어(Middleware)입니다.
미들웨어
■ 서버의 요청-응답 과정에서 중간에 위치하여 특정 기능을 수행하는 함수입니다.
■ 모든 요청에 대해서 로그(Logging)를 남기거나,
특정 사용자만 API를 접근(Authentication & Authorization)하게 하고 싶을 때도 미들웨어를 사용합니다.
■ 사용자가 웹페이지에서 Form을 통해 전송한 데이터를
서버에서 쉽게 파싱(Body Parser)하기위하여 사용할수도 있습니다. (express.js Middleware)
■ 다양한 백엔드 리소스에 대한 연결을 관리합니다.
백엔드 데이터베이스에 대한 빠르고 효율적인 액세스를 위해 연결 풀을 생성 할 수 있습니다.
■ 클라이언트의 요청에 따라 로직을 구현할 수 있는 능력이 있습니다.
■ 동시처리, 로드 밸런싱, 트랜잭션 관리에서 중요한 역할을 합니다.
■ 백엔드 리소스에 대한 액세스를 보호하는 데 중요한 역할을 합니다
Express.js 미들웨어 작성하기
app.use((req, res, next) => {
// 필요한 코드
});
req
- 요청에 대한 정보가 담겨있는 객체
- HTTP Header, Query Parameters, URL 등 브라우저가 서버로 보내는 정보들이 담겨있음
res
- 응답을 위한 기능이 제공
- 어떤 HTTP Status Code로 응답할지, 어떤 데이터 형식으로 응답할지, 헤더는 어떤 값을 넣어 응답할지 등의 기능제공
next
- 다음 스택으로 정의된 미들웨어를 호출
Request 로그 남기는 미들웨어 작성
express라이브러리를 설치하고
// app.js
const express = require('express');
const app = express();
//Request 로그 남기는 미들웨어
app.use((req, res, next) => {
console.log('Request URL:', req.originalUrl, ' - ', new Date());
next();
});
app.get('/', (req, res) => {
res.send('Hello, Express!');
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
아래의 미들웨어를 작성해주면 해당 서버를 들어갔을때의 로그를 확인할 수 있습니다.
또한 위 코드 처럼 미들웨어가 겹치는 경우에는 첫번재 미들웨어부터 순차적으로 진입하게 됩니다.
다만 미들웨어가 다음으로 넘어가기 위해서는 next()가 있어야 하며 next()가 실행되지 않으면
다음 미들웨어는 실행되지 않고 클라이언트의 요청은 종료됩니다.
미들웨어에서 응답을 보내는 경우 res.send()나 res.json()과 같은 메서드를 호출하는 경우에는 next()를 호출하면 안됩니다.
만약 호출을 하게된다면 이미 요청이 종료된 상태에서 다른 미들웨어가 응답을 보내려고 하여
중복된 요청이 전달되는 문제가 발생하게 됩니다.
라우터와 미들웨어의 차이
• 라우터와 미들웨어는 서로 다른 방식처럼 보이지만 라우터는 미들웨어 기반으로 구현된 객체이므로 미들웨어와 동일한 방식으로 작동합니다.
• 라우터는 미들웨어 함수를 특정 경로에 바인딩하는 역할을 하며, 요청이 들어온 URL경로에 따라 서로 다른 미들웨어를 실행시킬수 있게 도와줍니다.
'프로그래밍 기초 > Node.js' 카테고리의 다른 글
카카오 로그인 연동하기 (1) | 2024.02.05 |
---|---|
데이터 유효성 검증과 에러처리 (1) | 2024.02.01 |
REST API구현하기 [할일 메모 사이트] (1) | 2024.01.29 |
Express.js의 req, res 객체 (0) | 2024.01.24 |
Node.js특징 (0) | 2024.01.22 |