728x90
반응형
2. http 모듈: 웹 서버와 클라이언트의 모든 것 🌐
http 모듈은 Node.js를 사용하여 HTTP 서버를 만들거나 다른 HTTP 서버에 요청을 보내는 클라이언트 기능을 구현할 때 사용됩니다. 앞서 "Hello Node.js!" 예제에서 간단히 경험해 보셨듯이, 이 모듈은 Node.js가 웹 서버로 동작할 수 있게 하는 핵심 기반입니다. Java의 java.net.HttpURLConnection, java.net.ServerSocket, 서블릿 API (예: javax.servlet.http.HttpServlet) 등과 유사한 역할을 수행한다고 볼 수 있습니다.
주요 http 모듈 기능 및 객체:
- http.createServer([options], [requestListener]): 새로운 HTTP 서버 객체를 생성하고 반환합니다.
- options (선택 사항): 서버 설정을 위한 객체입니다.
- requestListener (선택 사항): 클라이언트 요청이 있을 때마다 실행될 함수입니다. 이 함수는 IncomingMessage 객체 (req)와 ServerResponse 객체 (res)를 인자로 받습니다.
-
JavaScript
const http = require('http'); const server = http.createServer((req, res) => { // 요청 처리 로직 res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Hello from HTTP module!\n'); }); server.listen(3000, () => { console.log('Server listening on port 3000'); });
- server.listen(): HTTP 서버가 특정 포트와 호스트에서 클라이언트의 연결을 수신 대기하도록 합니다.
- server.listen(port[, hostname][, backlog][, callback])
- server.listen(path[, backlog][, callback]) (IPC 서버용)
- server.listen(handle[, backlog][, callback])
- http.Server 클래스: http.createServer()가 반환하는 객체의 클래스입니다. 다양한 이벤트를 발생시킵니다.
- 'request' 이벤트: 클라이언트로부터 새로운 요청이 들어올 때마다 발생합니다. createServer에 전달하는 requestListener 함수는 이 이벤트의 리스너입니다.
JavaScript
// 위의 createServer 예제는 내부적으로 다음과 같이 동작합니다. const server = http.createServer(); server.on('request', (req, res) => { res.writeHead(200, { 'Content-Type': 'text/plain' }); res.end('Hello from HTTP module via event listener!\n'); }); server.listen(3000); - 'connection' 이벤트: 새로운 TCP 연결이 수립될 때 발생합니다.
- 'close' 이벤트: 서버가 닫힐 때 발생합니다.
- server.close([callback]): 서버가 새로운 연결을 받지 않도록 하고, 기존 연결이 모두 종료되면 서버를 닫습니다.
- 'request' 이벤트: 클라이언트로부터 새로운 요청이 들어올 때마다 발생합니다. createServer에 전달하는 requestListener 함수는 이 이벤트의 리스너입니다.
- http.IncomingMessage 클래스 (req 객체): HTTP 요청에 대한 정보를 담고 있는 객체입니다. requestListener 함수의 첫 번째 인자로 전달됩니다. (Java Servlet의 HttpServletRequest와 유사)
- 주요 속성 및 메소드:
- req.url: 요청 URL 문자열입니다. (예: /users?id=123)
- req.method: HTTP 요청 메소드입니다. (예: 'GET', 'POST', 'PUT')
- req.headers: 요청 헤더 객체입니다. (모든 헤더 이름은 소문자로 변환됩니다.)
- req.httpVersion: HTTP 프로토콜 버전입니다.
- req.socket: 요청에 연결된 net.Socket 객체입니다.
- 데이터 수신 (예: POST 요청의 본문): 요청 본문 데이터는 스트림(Stream) 형태로 들어옵니다. 따라서 'data' 이벤트와 'end' 이벤트를 사용하여 데이터를 조각조각 받아 합쳐야 합니다.
Java 서블릿에서는 request.getReader()나 request.getParameter() 등으로 비교적 쉽게 처리했던 부분이지만, Node.js에서는 스트림을 직접 다루는 경우가 많습니다. 이는 대용량 데이터 처리 시 메모리 효율성을 높여줍니다. (나중에 배울 Express.js와 같은 프레임워크는 이러한 처리를 미들웨어를 통해 간편하게 해줍니다.)JavaScript
// POST 요청 데이터 처리 예시 let body = []; req.on('data', (chunk) => { body.push(chunk); }).on('end', () => { body = Buffer.concat(body).toString(); // 여기서 body 변수에 전체 요청 본문이 담기게 됩니다. // JSON.parse(body) 등으로 파싱하여 사용할 수 있습니다. console.log('Request body:', body); });
- 주요 속성 및 메소드:
- http.ServerResponse 클래스 (res 객체): 클라이언트에게 보낼 HTTP 응답을 생성하는 객체입니다. requestListener 함수의 두 번째 인자로 전달됩니다. (Java Servlet의 HttpServletResponse와 유사)
- 주요 메소드:
- res.writeHead(statusCode[, statusMessage][, headers]): 응답 헤더를 작성합니다. 이 메소드는 응답 당 한 번만 호출해야 하며, res.write()나 res.end()보다 먼저 호출되어야 합니다.
- statusCode: HTTP 상태 코드 (예: 200, 404, 500)
- statusMessage (선택 사항): 상태 메시지 (예: 'OK', 'Not Found')
- headers (선택 사항): 응답 헤더 객체 (예: { 'Content-Type': 'application/json' })
- res.setHeader(name, value): 응답 헤더의 단일 값을 설정합니다. writeHead 전에 여러 번 호출할 수 있습니다.
- res.getHeader(name): 이미 설정된 헤더 값을 가져옵니다.
- res.removeHeader(name): 이미 설정된 헤더를 제거합니다.
- res.write(chunk[, encoding][, callback]): 응답 본문의 일부를 보냅니다. 여러 번 호출될 수 있습니다.
- res.end([data][, encoding][, callback]): 응답 전송을 완료합니다. 이 메소드가 호출되어야 클라이언트에게 응답이 실제로 전달됩니다. data 인자를 전달하면 res.write(data, encoding) 호출 후 res.end(callback)을 호출한 것과 같습니다.
- res.statusCode: 응답 상태 코드를 설정합니다. (예: res.statusCode = 404;) writeHead이 호출되기 전에 설정해야 합니다.
- res.statusMessage: 응답 상태 메시지를 설정합니다.
- res.writeHead(statusCode[, statusMessage][, headers]): 응답 헤더를 작성합니다. 이 메소드는 응답 당 한 번만 호출해야 하며, res.write()나 res.end()보다 먼저 호출되어야 합니다.
- 주요 메소드:
- http.request(options[, callback]) 또는 http.request(url[, options][, callback]): HTTP 클라이언트 요청을 만듭니다. 다른 서버의 API를 호출할 때 사용됩니다. (Java의 HttpURLConnection이나 Apache HttpClient, OkHttp 등과 유사)
- options: 요청 설정을 위한 객체 또는 URL 문자열입니다. (호스트, 포트, 메소드, 경로, 헤더 등)
- callback(response): 서버로부터 응답을 받으면 호출되는 함수입니다. response 객체는 http.IncomingMessage의 인스턴스입니다.
JavaScriptconst http = require('http'); const options = { hostname: 'jsonplaceholder.typicode.com', port: 80, path: '/todos/1', method: 'GET', headers: { 'Content-Type': 'application/json', } }; const req = http.request(options, (res) => { console.log(`Status Code: ${res.statusCode}`); let data = ''; res.on('data', (chunk) => { data += chunk; }); res.on('end', () => { console.log('Response Body:', JSON.parse(data)); }); }); req.on('error', (error) => { console.error('Request Error:', error); }); // POST 요청의 경우 req.write()로 본문을 전송하고 req.end()를 호출해야 합니다. // const postData = JSON.stringify({ title: 'foo', body: 'bar', userId: 1 }); // req.setHeader('Content-Length', Buffer.byteLength(postData)); // req.write(postData); req.end(); // 요청 전송을 완료합니다. GET 요청에서도 반드시 호출해야 합니다. - http.get(options[, callback]) 또는 http.get(url[, options][, callback]): http.request()와 유사하지만, HTTP GET 메소드로 고정되고 req.end()를 자동으로 호출합니다. 간단한 GET 요청에 편리합니다.
HTTPS 지원
HTTPS 통신을 위해서는 http 모듈 대신 https 모듈을 사용해야 합니다. https 모듈은 http 모듈과 거의 동일한 API를 제공하지만, SSL/TLS 암호화를 위한 추가적인 옵션(예: SSL 인증서 및 개인 키)을 필요로 합니다.
JavaScript
const https = require('https');
const fs = require('fs'); // SSL 인증서 파일을 읽기 위해
const options = {
key: fs.readFileSync('server-key.pem'), // 개인 키 파일 경로
cert: fs.readFileSync('server-cert.pem') // 인증서 파일 경로
};
https.createServer(options, (req, res) => {
res.writeHead(200);
res.end('Hello HTTPS World!\n');
}).listen(8443); // HTTPS 기본 포트는 443
http 모듈은 Node.js 웹 개발의 기초가 되며, 이 모듈의 동작 방식을 이해하는 것은 Express.js와 같은 상위 레벨 프레임워크를 더 깊이 있게 사용하는 데 도움이 됩니다. 특히 요청과 응답 객체의 스트림 기반 처리 방식에 익숙해지는 것이 중요합니다.
728x90
반응형
'프로그래밍 > NODEJS 강좌 BY GEMINI' 카테고리의 다른 글
| 주요 내장 모듈 살펴보기 - events: 이벤트 기반 프로그래밍의 핵심 (Java의 이벤트 리스너와 유사점) (0) | 2025.06.04 |
|---|---|
| 주요 내장 모듈 살펴보기-path: 파일 및 디렉토리 경로 처리 (Java의 java.nio.file.Path와 유사) (0) | 2025.06.04 |
| 주요 내장 모듈 살펴보기 (0) | 2025.06.04 |
| 2️⃣ Node.js 핵심 모듈: 강력한 기본기 다지기 (0) | 2025.05.28 |
| Java vs. Node.js: 서버 사이드 패러다임 비교 🔄 (0) | 2025.05.28 |