기술 학습

req, res, next 란?

hawon6691 2026. 2. 4. 11:46
728x90

1. 정체 파악하기 (Definition)

  • req (Request, 요청 객체): 클라이언트(브라우저)가 보낸 모든 정보가 담겨 있습니다. "누가, 어디서, 무엇을 가지고 왔나?"를 알고 싶을 때 뒤져보는 가방입니다.
  • res (Response, 응답 객체): 서버가 클라이언트에게 보낼 도구들이 들어 있습니다. "데이터를 보낼까? 파일을 보낼까? 에러를 낼까?"를 결정하는 리모컨입니다.
  • next (Next, 다음 단계 호출 함수): 현재 미들웨어에서 할 일을 다 마쳤으니, "다음 검문소(미들웨어)로 넘어가!"라고 신호를 주는 벨입니다.

2. 왜 사용하는가? (Purpose)

이 세 가지 인자가 있어야만 서버가 체계적인 업무 분담을 할 수 있습니다.

  1. 데이터 전달 (req): 사용자가 입력한 아이디, 현재 위치, 쿠키 등을 파악해야 로직을 짭니다.
  2. 결과 통보 (res): 처리가 끝났으면 "성공했어" 혹은 "로그인해"라고 말을 해줘야 브라우저가 대기를 멈춥니다.
  3. 흐름 제어 (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