스마트웹앱콘텐츠전문가/node.js
Express.js로 요청 처리 흐름 관리하기: 미들웨어 활용법
9D4U
2025. 2. 25. 17:13
728x90
반응형
1. 미들웨어(Middleware)란?
미들웨어는 Express.js와 같은 Node.js 웹 프레임워크에서 중요한 개념입니다. 미들웨어는 요청과 응답을 처리하는 과정에서 중간 단계로 동작하는 함수입니다. 간단히 말해, 클라이언트가 서버에 요청을 보내면 그 요청이 실제로 처리되기 전에 여러 미들웨어가 순차적으로 실행됩니다.
미들웨어 함수는 기본적으로 세 가지 인수를 받습니다:
- req: 요청 객체(request object)로, 클라이언트로부터 서버로 전달된 데이터를 담고 있습니다.
- res: 응답 객체(response object)로, 서버가 클라이언트에 전달할 응답을 담고 있습니다.
- next: 요청을 처리하고, 다음 미들웨어로 넘기기 위해 호출하는 함수입니다.
미들웨어는 req와 res 객체를 수정하거나, 요청을 끝내거나, 다음 미들웨어로 넘기는 역할을 합니다.
2. app.use()와 전역 미들웨어
app.use(express.json());
app.use()는 전역 미들웨어를 등록하는 방법입니다. 이 미들웨어는 애플리케이션 내의 모든 요청에 대해 실행됩니다. 위 코드에서 express.json()은 JSON 형식의 요청 본문을 자동으로 파싱해주는 미들웨어입니다.
3. 두 번째 미들웨어 추가
app.use((req, res, next) => {
console.log('Query 객체:', req.query); // req.query 객체 내용 출력
next(); // 다음 미들웨어로 요청을 넘김
});
이 코드는 모든 요청에 대해 실행되는 두 번째 미들웨어를 추가합니다.
- req.query는 쿼리 파라미터를 담고 있는 객체입니다. URL에서 ? 뒤에 오는 key=value 형식의 데이터를 파싱해서 객체로 제공합니다.
{ team: 'red' }
- 예를 들어, 클라이언트가 /api/members?team=red로 요청을 보낸 경우, req.query는 다음과 같이 변환됩니다:
- console.log('Query 객체:', req.query);는 클라이언트가 보낸 쿼리 파라미터를 콘솔에 출력합니다. 예시 출력은:
- Query 객체: { team: 'red' }
- next() 함수는 요청을 다음 미들웨어로 넘깁니다. next()를 호출하지 않으면, 요청은 해당 미들웨어에서 멈추게 됩니다. 이 함수는 요청 처리를 계속 진행하기 위해 꼭 호출해야 합니다.
반응형
4. /api/members 경로 처리
app.get('/api/members', (req, res) => {
const { team } = req.query; // 쿼리 파라미터에서 'team' 값을 추출
if (team) {
const teamMembers = members.filter((m) => m.team === team); // 팀에 맞는 멤버들만 필터링
res.send(teamMembers); // 필터된 멤버들 반환
} else {
res.send(members); // 모든 멤버 반환
}
});
- app.get('/api/members', (req, res) => {...})는 클라이언트가 /api/members 경로로 GET 요청을 보낼 때 처리하는 로직입니다.
- const { team } = req.query;는 구조 분해 할당을 사용하여 req.query에서 team 파라미터 값을 추출합니다.
- 예를 들어, 클라이언트가 /api/members?team=red로 요청하면 team 변수는 'red'가 됩니다.
- if (team) 조건문은 team 파라미터가 있을 때만 해당 팀에 속한 멤버들을 필터링하여 반환하는 로직입니다.
- members.filter((m) => m.team === team)는 members 배열에서 team 값이 일치하는 멤버들만 필터링합니다.
/api/members?team=red로 요청을 보내면 members.filter는 team이 red인 Alice와 Charlie를 반환합니다.const members = [ { name: 'Alice', team: 'red' }, { name: 'Bob', team: 'blue' }, { name: 'Charlie', team: 'red' } ];
- 예를 들어, members 배열에 다음과 같은 멤버가 있다고 할 때:
- res.send(teamMembers);는 필터된 멤버들을 응답으로 클라이언트에게 보냅니다. 만약 team 파라미터가 없다면, members 배열의 모든 멤버를 반환합니다.
5. 실제 요청 흐름 예시
- 클라이언트가 /api/members?team=red로 요청을 보냅니다.
- 첫 번째 미들웨어인 express.json()이 JSON 데이터를 파싱합니다.
- 두 번째 미들웨어가 실행되어 req.query를 콘솔에 출력합니다:
Query 객체: { team: 'red' }
- 서버는 team=red에 맞는 멤버들을 필터링하여 응답을 보냅니다:
[ { "name": "Alice", "team": "red" }, { "name": "Charlie", "team": "red" } ]
미들웨어는 요청을 처리하는 과정에서 중간에 끼어들어 다양한 작업을 할 수 있게 해주는 중요한 기능입니다. req.query 객체를 출력하는 미들웨어를 추가하면, 클라이언트의 요청에 포함된 쿼리 파라미터를 쉽게 추적할 수 있습니다. next()를 호출하여 요청을 다음 단계로 넘기는 것은 미들웨어에서의 핵심 동작입니다. 이를 활용해 동적인 데이터를 필터링하고, 로그를 남기며, 여러 단계에서 요청을 처리할 수 있습니다.
728x90