Node.js네트워크와 HTTP

요청 본문 읽기와 JSON 응답

Node.js 기본 HTTP 서버에서 요청 본문을 읽고 JSON 응답을 보내는 가장 실전적인 패턴을 정리합니다.

마지막 수정 2026년 3월 20일

기본 패턴

javascript
import { createServer } from "node:http";

const server = createServer(async (req, res) => {
  if (req.method !== "POST" || req.url !== "/users") {
    res.writeHead(404);
    res.end("Not Found");
    return;
  }

  let body = "";
  for await (const chunk of req) {
    body += chunk;
  }

  const payload = JSON.parse(body);

  res.writeHead(201, { "Content-Type": "application/json" });
  res.end(JSON.stringify({ ok: true, user: payload.name }));
});

설명

  • 기본 HTTP 서버에서 요청 본문은 한 번에 문자열로 주어지지 않고, 스트림처럼 조금씩 들어옵니다.
  • 작은 JSON 요청은 for await ... of req로 청크를 모아 문자열로 합친 뒤 JSON.parse() 하는 패턴이 가장 이해하기 쉽습니다.
  • 응답도 문자열이나 버퍼로 직접 보내므로, Content-Type 헤더와 상태 코드를 명시하는 습관이 중요합니다.
  • 프레임워크는 이 과정을 감춰 주지만, 바닥에서 한 번 직접 다뤄 보면 요청 본문 파싱과 응답 직렬화가 무엇인지 분명해집니다.
  • 단순 카드처럼 보여도, 실무 서버에서 "요청이 어떻게 들어오고 응답이 어떻게 나가는가"를 이해하는 핵심 문법입니다.

짧은 예제

javascript
res.writeHead(200, { "Content-Type": "application/json; charset=utf-8" });
res.end(JSON.stringify({ message: "ok" }));

빠른 정리

항목역할
for await (const chunk of req)요청 본문 청크 읽기
JSON.parse(body)JSON 문자열 파싱
res.writeHead(status, headers)상태 코드와 헤더 설정
res.end(JSON.stringify(data))JSON 응답 전송

주의할 점

요청 본문을 무조건 문자열로 모으면 큰 요청에서 메모리 부담이 커질 수 있습니다. 큰 업로드나 파일 전송은 스트림 처리와 크기 제한을 함께 고려하는 편이 안전합니다.

참고 링크

1 sources