Node.js http 모듈

김경식·2022년 1월 28일
2

자바스크립트

목록 보기
5/6
post-thumbnail

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

request는 서버로 보내는 요청에 대한 정보가 들어있으며, Header와 (optional)body로 구성되어 있다.

const { headers } = request;
const userAgent = headers['user-agent'];

⭐️ 모든 header는 소문자로만 표현된다. 이는 어떤 목적이든 header를 파싱하는 작업을 간편하게 해준다.

Body

let body = [];

request.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
});

⭐️ body에 담긴 데이터는 Buffer 형태로 들어온다. 때문에 chunk 파라메터로 받아 문자열로 바꿔준다.

Error

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

response는 서버가 클라이언트에게 할 응답으로, request와 마찬가지로 header와 (optional)body로 구성되어 있다.

statusCode (상태코드)

따로 설정하지 않으면 상태코드는 항상 200이다. 경우에 따라 상태코드를 변경하기 위해선 statusCode를 사용한다.

response.statusCode = 404;
Status Code Meaning
200 요청 성공
304 304 요청에 대한 응답이 수정되지 않음
400 Bad request: 잘못된 문법으로 인해 서버가 요청을 이해할 수 없음
403 Forbidden: 해당 Client가 접근 권한이 없음
404 Not Found: Server가 요청받은 리소스를 찾을 수 없거나, 알수없는 url을 요청받음
500 서버가 처리할 수 없는 요청

⭐️ 이외의 상태코드는 여기에서 확인해 볼 수 있다.

writeHead

상태코드와 헤더를 같이 설정하는 메소드이다.
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의 내용을 간략하게 설명하면 아래와 같다.

  • 모든 도메인('*')을 허용한다.
  • GET, POST, PUT, DELETE, OPTIONS' => 메소드는 GET, POST, PUT, DELET, OPTION만 허용한다.
  • 헤더에는 content-type과 accept만 허용 된다.
  • preflight request는 10초까지 허용 된다.
    쉽게 말해 서버에서 클라이언트에게 보내는 메세지라고 보면되겠다.
    끝으로 response.end()를 통해 보낼데이터를 body에 담아 전달하면된다.
    ⭐️ end 메소드를 쓰기전에 상태코드와 헤더가 설정되어 있어야 한다.

글을 마치며...

브라우저와 서버가 어떻게 통신을 하는지 알게 되었고, 모르는 내용을 구글링하면서 찾아보는 재미가 쏠쏠했던거 같다. 개인적으로 자바스크립트라는 언어는 정말 싫었는데 오늘 node.js http모듈을 공부하면서 조금씩 재미를 느끼는중이라 참 다행이라고 생각한다.

0개의 댓글