드림오구
article thumbnail

🌊 HTTP모듈 서버 만들기

으악 어려워!

Node.js 공식문서의 HTTP 트랜잭션 해부를 뜯어보려 한다..

 

서버 생성

웹 서버 객체를 생성한다. 이 서버로 오는 HTTP 요청마다 createServer에 전달된 함수가 한 번씩 호출 된다. 

const http = require('http');

const server = http.createServer((request, response) => {
  // 여기서 작업이 진행됩니다!
});

 

메서드, URL, 헤더

Node가 request객체에 유용한 프로퍼티를 넣어두어 우리는 이 프로퍼티를 사용할 수 있다.

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

 

헤더의 설정과 관계 없이 모든 헤더는 소문자로만 표현해야한다.

 

 

요청 바디

핸들러에 전달된 request 객체는 [MDN]ReadableStream 인터페이스를 구현하고 있고 이 스트림에 리스너를 등록하거나 다른 스트림에 연결 할 수 있다. 스트림의 'data'와 'end' 이벤트에 이벤트 리스너를 등록하여 데이터를 받을 수 있다.

data 이벤트에서 발생시킨 청크는 문자열 데이터이며, 이 데이터를 미리 설정한 body 배열에 추가한 다음 end 이벤트에서 문자열로 만드는 것이 가장 좋다. 

 

let body = [];
request.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
  // 여기서 `body`에 전체 요청 바디가 문자열로 담겨있습니다.
  // 이 end에서 우리는 응답해주면 된다. 
});

 

  • chunk(청크) : 데이터의 조각
  • buffer(버퍼) : chunk를 받아주는 용기. chunk들을 buffer에 채운 후 다 차면 buffer을 통째로 옮기고 새 buffer에 아직 옮기지 못한 데이터 조각을 다시 채우는 과정
    • buffering(버퍼링) : 데이터 조각을 buffer에 채우는 일

  • stream (스트림) : buffer가 다 차면 이를 전송하고 다시 buffer를 채우는 작업을 연속히 하는 것.

 

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();
    // 여기서 헤더, 메서드, url, 바디를 가지게 되었고
    // 이 요청에 응답하는 데 필요한 어떤 일이라도 할 수 있게 되었습니다.
  });
}).listen(8080); // 이 서버를 활성화하고 8080 포트로 받습니다.

 

 

헤더 데이터 전송

writeHead 메서드를 이용하여 명시적으로 응답 스트림에 헤더를 작성할 수도 있다. 

response.writeHead(200, /*HTTP 상태 코드*/ { 
  'Content-Type': 'application/json',//헤더
  'X-Powered-By': 'bacon'
});

 

 

서버 실행

node 파일명.js

 

node 서버는 저장시 프로그램을 매번 다시 실행해줘야 하기 때문에 서버를 껐다 켜지 않아도 수정사항이 적용되는 nodemon을 이용하였다.

 

nodemon 설치하여 npm start로 서버 실행하기.

  1. 터미널에 npm install nodemon 입력하여 설치
  2. package.json의 "script"에 nodemon에 사용할 명령어 추가
"start" : "nodemon 파일명.js"

 

 

Node.js 공식문서 를 참고하였습니다.
예시 코드는 공식문서에서 확인할 수 있습니다. 

 

profile

드림오구

@드림오구