728x90
1. 정체 파악하기 (Definition)
- req (Request, 요청 객체): 클라이언트(브라우저)가 보낸 모든 정보가 담겨 있습니다. "누가, 어디서, 무엇을 가지고 왔나?"를 알고 싶을 때 뒤져보는 가방입니다.
- res (Response, 응답 객체): 서버가 클라이언트에게 보낼 도구들이 들어 있습니다. "데이터를 보낼까? 파일을 보낼까? 에러를 낼까?"를 결정하는 리모컨입니다.
- next (Next, 다음 단계 호출 함수): 현재 미들웨어에서 할 일을 다 마쳤으니, "다음 검문소(미들웨어)로 넘어가!"라고 신호를 주는 벨입니다.
2. 왜 사용하는가? (Purpose)
이 세 가지 인자가 있어야만 서버가 체계적인 업무 분담을 할 수 있습니다.
- 데이터 전달 (req): 사용자가 입력한 아이디, 현재 위치, 쿠키 등을 파악해야 로직을 짭니다.
- 결과 통보 (res): 처리가 끝났으면 "성공했어" 혹은 "로그인해"라고 말을 해줘야 브라우저가 대기를 멈춥니다.
- 흐름 제어 (next): 로그 확인 미들웨어 -> 로그인 체크 미들웨어 -> 실제 데이터 처리 미들웨어 순으로 질서 있게 이동하기 위해 필요합니다.
3. 어떻게 사용하는가? (Usage)
실제 코드로 보면 훨씬 쉽습니다.
① req로 정보 읽기
JavaScript
app.get('/user/:id', (req, res, next) => {
const userId = req.params.id; // URL에 담긴 ID 읽기
const userAgent = req.headers['user-agent']; // 브라우저 정보 읽기
next(); // 다음 미들웨어로 고고!
});② res로 대답하기
JavaScript
app.get('/hello', (req, res) => {
res.status(200).send('안녕하세요!'); // 200번 상태 코드와 메시지 전송
// 응답을 보냈으므로 여기서는 보통 next()를 호출하지 않습니다. (상황 종료)
});③ next로 흐름 넘기기 (중요!)
JavaScript
const checkAdmin = (req, res, next) => {
if (req.query.admin === 'true') {
next(); // 관리자면 다음 단계(실제 페이지)로 이동!
} else {
res.status(403).send('권한이 없습니다.'); // 관리자 아니면 여기서 차단(응답 끝)!
}
};4. 실전 요약: 이럴 땐 이걸 쓰세요!
| 상황 | 사용하는 도구 | 예시 코드 |
|---|---|---|
| 사용자가 보낸 데이터가 궁금할 때 | req | req.body, req.query |
| 브라우저에 화면이나 JSON을 보여줄 때 | res | res.render(), res.json() |
| "난 할 일 다 했으니 다음 사람한테 넘길래" | next | next() |
| "에러가 났어! 에러 처리기 호출해줘" | next | next(err) |
⚠️ 주의할 점
res.send()나 res.json()으로 응답을 보냈는데 그 밑에 또 next()를 쓰거나, 응답을 두 번 보내려고 하면 "Error: Cannot set headers after they are sent to the client" 라는 유명한 에러를 만나게 됩니다. 한 명의 손님(요청)에게는 한 번의 대답(응답) 만 해야 한다는 걸 기억하세요!
728x90
'기술 학습' 카테고리의 다른 글
| NestJS는 왜 TypeScript를 사용할까? (0) | 2026.02.05 |
|---|---|
| TypeScript란? (0) | 2026.02.05 |
| 미들웨어(Middleware)란? (0) | 2026.02.04 |
| Passport란? (0) | 2026.02.04 |
| 엔드포인트란? (0) | 2026.02.02 |