TIL 8주차 3일 - Mini Node Server

Sang heon lee·2021년 6월 30일
0

TIL 리스트

목록 보기
33/60

1. HTTP 모듈

  • node.js에서는 HTTP 요청을 보내거나, 응답을 받을 수 있는 도구를 제공합니다.

  • HTTP 요청을 처리하고 응답을 보내주는 프로그램을 웹 서버(Web Server)라고 부릅니다.

  • node.js의 http 모듈을 이용해 웹 서버를 만듭니다.
    node.js에서 파일을 읽거나 쓰기 위해 fs 모듈을 사용하듯이,
    HTTP 요청과 응답을 다루기 위해 http 모듈을 사용합니다.
    (http 모듈 API 문서 : https://nodejs.org/dist/latest-v14.x/docs/api/http.html)

  • API 문서와는 HTTP 트랜잭션 해부(Anatomy of an HTTP Transaction) 라는 공식 가이드 문서를 통해 HTTP 요청과 응답에 대한 작업을 배울 수 있습니다.
    (https://nodejs.org/ko/docs/guides/anatomy-of-an-http-transaction/)

2. HTTP 트랜잭션 해부 (Anatomy of an HTTP Transaction)

2.1 Create the Server

  • 'createServer' 를 이용하여 웹 서버 객체를 만듭니다.
    이 서버로 오는 HTTP 요청마다 'createServer'에 전돨된 함수가 한 번씩 호출됩니다.
const http = require('http');  // http 모듈을 사용한다!

const server = http.createServer((request, response) => {
  // 요청시, 응답시의 작업 내용을 넣는다.
});
  • 상기의 코드는 하기의 내용을 축약 문법을 사용한 것입니다. 마치 addEventListener 와 같이 'request' 라는 이벤트가 발생하면 뒤의 함수가 실행된다.
const server = http.createServer();

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

2.2 Request 처리

2.2.1 Method, URL and Headers

  • request, response 의 타입은 객체입니다.
    (request는 IncomingMessage의 인스턴스, response 는 ServerResponse의 인스턴스)
const { method, url } = request;

const { headers } = request;
const userAgent = headers['user-agent'];    
// request 객체 내에 headers 객체가 따로 존재
  • 위의 경우 처럼 구조 분해 문법을 써도 되고
    request.method , request.url 등으로 풀어쓰는 것도 가능합니다.

2.2.2 Request Body

  • POST 나 PUT 요청을 받을 때는 요청 바디(Request Body)가 중요합니다. 이 스트림에 이벤트 리스너를 등록하거나 다른 스트림에 파이프로 연결할 수 있습니다.(파이프는 공식 가이드 문서에서 에코 서버 예제를 참고)

  • 스트림의 'data'와 'end' 이벤트에 이벤트 리스너를 등록해서 데이터를 받을 수 있습니다.

  • 개념이 부족하여 정확한 번역이 힘들기에 원본은 남겨둡니다.
    This stream can be listened to or piped elsewhere just like any other stream. We can grab the data right out of the stream by listening to the stream's 'data' and 'end' events.

let body = [];

request.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
  // 여기서 `body`에 전체 요청 바디가 문자열로 담겨있습니다.
});

2.2.3 A Quick Thing About Errors

request.on('error, (err)=>{
  console.error(err)
})

2.3 Response 처리

2.3.1 HTTP Status Code

  • 따로 설정하지 않으면 응답의 HTTP 상태 코드는 항상 200 입니다. (https://www.whatap.io/ko/blog/40/)

  • 상태 코드를 변경하려면 statusCode 속성을 설정합니다.

response.statusCode = 404;

2.3.2 Setting Response Headers

response.setHeader('Content-Type', 'application/json');
response.setHeader('X-Powered-By', 'bacon');

2.3.3 Explicitly Sending Header Data (명시적인 헤더 데이터 전송)

  • HTTP Status Code 와 Setting Response Headers 를 한번에 처리 합니다. response.writeHead(상태 코드, {헤더 내용})
response.writeHead(200, {
  'Content-Type': 'application/json',
  'X-Powered-By': 'bacon'
});

2.3.4 Sending Response Body

  • 바디를 작성하기 전에는 상태 코드와 헤더가 작성되어 있어야 한다.
    response.writeHead(상태 코드, {헤더 내용})
response.write('<html>');
response.write('<body>');
response.write('<h1>Hello, World!</h1>');
response.write('</body>');
response.write('</html>');
response.end();

// 위의 문장을 한 문장으로 정리할수 있다.
response.end('<html><body><h1>Hello, World!</h1></body></html>');

2.4 전체 내용

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();

  response.on('error', (err) => {
    console.error(err);
  });
  response.statusCode = 200;
  response.setHeader('Content-Type', 'application/json');
  // 주의: 위 두 줄은 다음 한 줄로 대체할 수도 있습니다.
  // response.writeHead(200, {'Content-Type': 'application/json'})

  const responseBody = { headers, method, url, body };

  response.write(JSON.stringify(responseBody));
  response.end();
  // 주의: 위 두 줄은 다음 한 줄로 대체할 수도 있습니다.
  // response.end(JSON.stringify(responseBody))
  });
}).listen(8080); // 이 서버를 활성화하고 8080 포트로 받습니다.  

2.5 에코 서버 예제

  • 요청 받은 데이터를 그대로 응답으로 돌려보내는 상황

  • 특정 조건에서만 응답하려는 경우

  • 코드는 가이드 문서를 통해 확인

느낀 점 && 미비한 점

비슷하면서도 새로운 메소드가 있어 처음에는 이해 하기가 좀 난해했다.
물론 실무는 위의 경우처럼 간단하지는 않을거라 생각한다.

또한 아직 HTTP 메시지 중 헤더는 용어도 어렵고 접근하기가 먼가 겁이 많이 난다.
아예 모르지는 않아야 하기에 조금씩 조금씩 건드려봐야겠다.

profile
개초보

0개의 댓글