웹 서버의 기초: 내장 http 모듈
Express나 NestJS 같은 프레임워크를 사용하기 전에, Node.js가 웹 서버로서 어떻게 동작하는지 뼈대를 알아야 합니다. Node.js는 설치 즉시 http 모듈을 내장하고 있어 단 몇 줄의 코드만으로 전 세계에서 접속할 수 있는 웹 서버를 열 수 있습니다.
요청(Req)과 응답(Res)의 흐름
서버를 열기 위해 http.createServer() 함수를 호출합니다. 이 함수 안에는 클라이언트가 접속할 때마다 자동으로 실행되는 콜백 함수를 넣어주며, 이 함수는 항상 req와 res 두 개의 객체를 전달받습니다.
| 객체 |
역할 |
주요 속성 및 메서드 |
| req (Request) |
브라우저가 무엇을 원하는지(요청)가 담긴 택배 송장 같은 객체입니다. |
req.url (접속 주소) req.method (GET, POST 등) |
| res (Response) |
서버가 브라우저에게 결과를 돌려줄 때(응답) 사용하는 택배 상자 같은 객체입니다. |
res.writeHead() (상태코드) res.end() (전송 완료) |
⚠️ 주의: 프레임워크가 왜 필요할까?
순수 http 모듈만으로도 서버를 만들 수 있지만, 페이지 수가 10개, 100개로 늘어나면 if (req.url === '...') 구문이 수백 개로 늘어나 코드가 지저분해집니다. 이를 깔끔하게 정리해주고 보안, 파일 업로드 등 복잡한 기능을 쉽게 구현하게 해주는 것이 바로 Express.js 입니다.
HTTP 서버 코드 작성과 브라우저 접속 결과
외부 프레임워크 없이 내장 http 모듈만으로 서버를 띄우고, 접속한 클라이언트에게 응답(Response)을 보내는 과정입니다.
const http = require('http');
// 1. 웹 서버 객체 생성
const server = http.createServer((req, res) => {
// 브라우저에서 요청(Request)이 들어올 때마다 이 콜백 함수가 실행됩니다.
// 클라이언트가 요청한 URL(주소)에 따라 분기 처리 (라우팅)
if (req.url === '/') {
// 2. 응답(Response) 헤더 작성 (상태코드 200 정상, HTML 문서임을 알림)
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
// 3. 실제 데이터 전송 및 응답 종료
res.end('<h1>Welcome to Home</h1><p>메인 페이지입니다.</p>');
console.log('[서버 로그] GET / 요청 처리 완료');
} else if (req.url === '/about') {
res.writeHead(200, { 'Content-Type': 'text/html; charset=utf-8' });
res.end('<h1>About Us Page</h1><p>Node.js로 만든 서버입니다.</p>');
console.log('[서버 로그] GET /about 요청 처리 완료');
} else {
// 404 Not Found 에러 처리
res.writeHead(404, { 'Content-Type': 'text/plain; charset=utf-8' });
res.end('404 Not Found - 페이지를 찾을 수 없습니다.');
console.log(`[서버 로그] 잘못된 접근: ${req.url}`);
}
});
// 2. 서버 실행 및 포트(Port) 할당
server.listen(3000, () => {
console.log('서버가 3000번 포트에서 대기(Listen) 중입니다...');
console.log('브라우저를 열고 http://localhost:3000 으로 접속해 보세요.');
});
Welcome to Home
메인 페이지입니다.
Server Console
$ node server.js
서버가 3000번 포트에서 대기(Listen) 중입니다...
브라우저를 열고 http://localhost:3000 으로 접속해 보세요.
[서버 로그] GET / 요청 처리 완료