기본 패턴
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