Express.js는 Node.js 기반의 웹 애플리케이션 프레임워크로, 웹 서버 및 API를 신속하게 개발할 수 있도록 도와줍니다. Express의 가장 큰 장점 중 하나는 바로 ‘미들웨어’ 개념에 있습니다. 이번 강좌에서는 미들웨어의 정의, 필요성, 사용 방법 및 간단한 예제를 통해 이해를 돕도록 하겠습니다.
1. 미들웨어란 무엇인가?
미들웨어는 Express 애플리케이션에서 요청과 응답 사이에 위치한 함수의 집합입니다. 클라이언트의 요청이 서버에 도달했을 때, 요청 객체(req), 응답 객체(res), 그리고 다음 미들웨어 함수(next)를 인수로 받아들입니다. 미들웨어는 특정 작업을 수행한 후, 다음 미들웨어로 요청을 전달할 수 있습니다.
예를 들어, 인증, 로깅, 데이터 파싱, 에러 처리 등과 같은 다양한 기능을 미들웨어를 통해 손쉽게 구현할 수 있습니다.
1.1. 미들웨어의 동작 방식
미들웨어는 요청 처리의 파이프라인을 형성합니다. 클라이언트의 요청이 들어오면, Express는 등록된 미들웨어를 순서대로 실행합니다. 이 때, 미들웨어는 다음 미들웨어를 호출할 수 있게 해주는 next() 함수를 가지고 있으며, 이를 호출하지 않으면 요청 처리가 중단됩니다.
1.2. 미들웨어의 종류
- 애플리케이션 미들웨어: app.use()를 통해 등록된 미들웨어로, 애플리케이션 레벨에서 동작합니다.
- 라우터 미들웨어: 특정 라우터에 적용되는 미들웨어로, app.Router()를 통해 등록합니다.
- 내장 미들웨어: Express에 내장된 미들웨어로, bodyParser와 cookieParser 등이 있습니다.
- 제3자 미들웨어: Express 외부에서 제공되는 미들웨어로, morgan, cors 등을 포함합니다.
2. 미들웨어의 필요성
미들웨어는 웹 애플리케이션의 요청 처리를 구조화하고, 코드의 재사용성을 높이며, 유지보수를 용이하게 만들어줍니다. 많은 기능을 모듈화하여 관리할 수 있기 때문에, 대규모 애플리케이션에서도 일관된 방식으로 요청을 처리할 수 있습니다.
2.1. 코드의 모듈화
미들웨어를 사용하면 기능을 모듈화 할 수 있어 각 미들웨어가 특정 책임을 가지고 작동하게 됩니다. 예를 들어, 인증 미들웨어는 요청이 들어올 때마다 인증을 검사하고, 로깅 미들웨어는 각 요청의 세부사항을 로그에 기록할 수 있습니다. 이러한 분리는 코드를 이해하기 쉽게 하고, 테스트 모듈화 및 재사용을 높입니다.
2.2. 요청과 응답의 체계적인 처리
미들웨어는 요청과 응답의 중간 단계에서 추가 처리를 가능하게 해줍니다. 예를 들어, 사용자의 인증 상태에 따라 요청을 리다이렉트하거나, 요청 데이터를 검증하여 잘못된 데이터에 대한 에러를 반환할 수 있습니다.
3. 미들웨어 사용 방법
미들웨어 설정은 매우 간단합니다. Express 애플리케이션을 생성하고, app.use() 메서드를 사용하여 미들웨어를 추가하면 됩니다.
3.1. 기본 미들웨어 작성하기
const express = require('express');
const app = express();
// 일반적인 미들웨어 예제
app.use((req, res, next) => {
console.log(`${req.method} 요청을 받았습니다: ${req.url}`);
next(); // 다음 미들웨어로 넘김
});
app.get('/', (req, res) => {
res.send('안녕하세요, Express!');
});
app.listen(3000, () => {
console.log('서버가 3000포트에서 실행 중입니다.');
});
3.2. 라우터 미들웨어 사용하기
const express = require('express');
const app = express();
const router = express.Router();
// 라우터 미들웨어
router.get('/user', (req, res) => {
res.send('사용자 정보');
});
app.use('/api', router); // API 경로에 미들웨어 적용
app.listen(3000, () => {
console.log('서버가 3000포트에서 실행 중입니다.');
});
3.3. 제3자 미들웨어 사용하기
제3자 미들웨어를 사용하려면 npm을 통해 해당 미들웨어를 설치하고, 사용할 수 있습니다.
npm install morgan
const express = require('express');
const morgan = require('morgan');
const app = express();
// morgan 미들웨어 등록
app.use(morgan('dev'));
app.get('/', (req, res) => {
res.send('Morgan 로깅을 사용하는 서버');
});
app.listen(3000, () => {
console.log('서버가 3000포트에서 실행 중입니다.');
});
4. 에러 핸들링 미들웨어
Express에서 에러 처리 또한 미들웨어를 통해 수행할 수 있습니다. 에러 핸들링 미들웨어는 일반 미들웨어와 다르게 네 개의 인수를 사용합니다: (err, req, res, next). 이 미들웨어는 애플리케이션의 마지막에 등록되어야 하며, 발생한 에러를 처리하는 역할을 합니다.
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('서버에서 에러가 발생했습니다!');
});
5. 결론
Express에서 미들웨어는 애플리케이션의 핵심적인 요소로, 요청과 응답 처리, 코드 재사용성 및 유지보수성을 증대시키는 데 큰 역할을 합니다. 이번 강좌를 통해 미들웨어의 개념과 필요성을 이해하고, 기본적인 사용법을 익히는 데 도움이 되었기를 바랍니다. 미들웨어를 잘 활용하여 효율적이고 견고한 백엔드 서버 개발에 도전해 보시기 바랍니다.