Node.js http 모듈을 사용해 웹서버를 구축하는 과정을 알아보자
아래의 내용은 node.js의 HTTP 트랜잭션 해부 공식문서를 정리한 내용이다
모든 node웹 서버 애플리 케이션은 웹 서버 객체를 만들어야 하는데, createServer
를 이용한다.
const http = require('http');
const server = http.createServer((request, response) => {
// code...
});
server.listen(3000, () => {
console.log('server running, Port 3000');
})
모듈을 사용하기 위해 http 모듈을 require
로 불러오고, createServer
메소드를 통해 request
, response
객체를 전달하고, listen
메소드를 통해 접속하는 포트를 할당한다.
request는 서버로 보내는 요청에 대한 정보가 들어있으며, Header와 (optional)body로 구성되어 있다.
const { headers } = request;
const userAgent = headers['user-agent'];
⭐️ 모든 header는 소문자로만 표현된다. 이는 어떤 목적이든 header를 파싱하는 작업을 간편하게 해준다.
let body = [];
request.on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
});
⭐️ body에 담긴 데이터는 Buffer 형태로 들어온다. 때문에 chunk
파라메터로 받아 문자열로 바꿔준다.
request.on('error', (err) =>{
console.error(err.stack);
})
⭐️ 단순히 error를 로깅만 하더라도 error
리스너를 추가해야 한다. "만약 사용하지 않는다면 Node.js 프로그램을 종료시킬 수도 있는 오류를 던질것입니다." 라고 공식문서에 기재되어있다.
종합해보면 아래코드와 같다.
const http = require('http');
http.createServer((request, response) => {
const { headers, method, url } = request;
let body = [];
request.on('error', (err) => {
console.error(err);
}).on('data', (chunk) => {
body.push(chunk);
}).on('end', () => {
body = Buffer.concat(body).toString();
});
}).listen(3000);
response는 서버가 클라이언트에게 할 응답으로, request와 마찬가지로 header와 (optional)body로 구성되어 있다.
따로 설정하지 않으면 상태코드는 항상 200이다. 경우에 따라 상태코드를 변경하기 위해선 statusCode를 사용한다.
response.statusCode = 404;
Status Code | Meaning |
---|---|
200 | 요청 성공 |
304 | 304 요청에 대한 응답이 수정되지 않음 |
400 | Bad request: 잘못된 문법으로 인해 서버가 요청을 이해할 수 없음 |
403 | Forbidden: 해당 Client가 접근 권한이 없음 |
404 | Not Found: Server가 요청받은 리소스를 찾을 수 없거나, 알수없는 url을 요청받음 |
500 | 서버가 처리할 수 없는 요청 |
⭐️ 이외의 상태코드는 여기에서 확인해 볼 수 있다.
상태코드와 헤더를 같이 설정하는 메소드이다.
writeHead 메소드는 클라이언트에 보낼 response의 header라고 이해하면된다.
if(method === 'OPTIONS') {
response.writeHead(200, defaultCorsHeader);
response.end();
};
const defaultCorsHeader = {
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Methods': 'GET, POST, PUT, DELETE, OPTIONS',
'Access-Control-Allow-Headers': 'Content-Type, Accept',
'Access-Control-Max-Age': 10
};
defaultCorsHeader
의 내용을 간략하게 설명하면 아래와 같다.
response.end()
를 통해 보낼데이터를 body에 담아 전달하면된다.브라우저와 서버가 어떻게 통신을 하는지 알게 되었고, 모르는 내용을 구글링하면서 찾아보는 재미가 쏠쏠했던거 같다. 개인적으로 자바스크립트라는 언어는 정말 싫었는데 오늘 node.js http모듈을 공부하면서 조금씩 재미를 느끼는중이라 참 다행이라고 생각한다.