node.js 를 활용한 HTTP server 구축

마데슾 : My Dev Space·2020년 2월 2일
0

Server

목록 보기
1/12
post-custom-banner

이번 스프린트는 node.js를 활용하여 간단한 HTTP server 서버를 구축해 보는 것이다.
간단하다고는 하는데 server를 처음 접해본 나에겐 너무 어려운 스프린트였다..

  1. 클라이언트에서 받은 요청을 어떻게 받는지?
  2. 요청에 대한 응답을 어떻게 클라이언트로 보내주는지?

두가지 의문점을 가지고 시작도 못하고 있었다..

그래서 helpdesk와 구글링을 통해 여러가지를 찾아보았고,
아래의 경로대로 따라 들어가보니 nodeJS 사용에 도움이되는 문서들이 많이 있었다..!!
1. nodejs 사이트접속
2. 상단 문서 메뉴 클릭
3. 좌측상단 가이드 메뉴 클릭

Node.js HTTP 처리 과정에 대한 이해를 도와주는 문서를 찾을 수 있었다. => 문서링크

이 문서의 목적은 Node.js HTTP 처리 과정을 잘 이해하게 하는 것입니다. 언어나 프로그래밍 환경과 관계없이 상식선에서 HTTP 요청이 어떻게 동작하는지는 알고 있어야 합니다. Node.js의 EventEmitters와 Streams에도 어느 정도 익숙해야 합니다. 익숙하지 않다면 관련 API 문서를 미리 훑어보는 편이 좋습니다.

1. 서버 생성

  • 모든 node 웹 서버 애플리케이션은 웹 서버 객체를 만들어야 하는데 이 때 createServer를 이용한다
  • HTTP 요청이 서버에 오면 node가 트랜잭션을 다루려고 request와 response 객체를 전달하며 요청 핸들러 함수를 호출한다.
  • 요청을 실제로 처리하려면 listen 메서드가 server 객체에서 호출되어야 한다. 대부분은 서버가 사용하고자 하는 포트 번호를 listen에 전달하기만 하면 된다.
    server.listen(PORT, ip, () => {
      console.log(`http server listen on ${ip}:${PORT}`);
    });
    		```
  • 몇 가지 다른 옵션도 있으므로 [API 문서](https://nodejs.org/api/http.html를 참고하면 된다.
const http = require('http');

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

2. 요청 바디

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

각 'data' 이벤트에서 발생시킨 청크(?)Buffer(?)이다. 이 청크가 문자열 데이터라는 것을 알고 있다면 이 데이터를 배열에 수집한 다음 'end' 이벤트에서 이어 붙인 다음 문자열로 만드는 것이 가장 좋다.

알아볼것

  • 청크 ?
  • Buffer ?
    - Buffer란 Node.js 에서 제공하는 Binary 의 데이터를 담을 수 있는 Object 이다
    - 바이너리 데이터라는 말 그대로 01001010... 과 같은 데이터가 Buffer 객체에 담긴다는 말이다.
// 예시1 
let body = [];
request.on('data', (chunk) => {
  body.push(chunk);
}).on('end', () => {
  body = Buffer.concat(body).toString();
  // 여기서 `body`에 전체 요청 바디가 문자열로 담겨있습니다.
});

// 예시2
req.on('data', chunk => {
  let data = '';
  data += chunk;
  // 이어 붙인 다음 문자열로 만드는 것이 가장 좋습니다.(바로 문자열에 합해주었습니다.)
});

3. HTTP 상태코드

따로 설정하지 않으면 응답의 HTTP 상태 코드는 항상 200이다. 상태 코드를 변경하려면 statusCode 프로퍼티를 설정해야 한다.

response.statusCode = 404; // 클라이언트에게 리소스를 찾을 수 없다고 알려줍니다.

4. 응답 헤더 설정

  • 응답에 헤더를 설정할 때 헤더 이름의 대소문자는 중요하지 않다.
  • 헤더를 여러 번 설정한다면 마지막에 설정한 값을 보낼 것이다.
response.setHeader('Content-Type', 'application/json');
response.setHeader('X-Powered-By', 'bacon');

5. 명시적인 헤더 데이터 전송

지금까지 설명한 헤더와 상태 코드를 설정하는 메서드는 "암묵적인 헤더"를 사용하고 있다고 가정합니다. 이는 바디 데이터를 보내기 전 적절한 순간에 헤더를 보내는 일을 노드에 의존하고 있다는 의미입니다.

명시적으로 응답 스트림에 헤더를 작성하는 writeHead 메서드가 있다. 이 메서드는 스트림에 상태 코드와 헤더를 작성한다.

response.writeHead(200, {
  'Content-Type': 'application/json',
  'X-Powered-By': 'bacon'
});

(암묵적이든 명시적이든) 일단 헤더를 설정하고 나면 응답 데이터를 전송할 준비가 된 것이다.

6. 응답 바디 전송

// 방법 1
response.write('<html>');
response.write('<body>');
response.write('<h1>Hello, World!</h1>');
response.write('</body>');
response.write('</html>');
response.end();

// 방법 2
response.end('<html><body><h1>Hello, World!</h1></body></html>');
  • 주의할점 : HTTP 응답에서 바디 전에 헤더가 있기때문에 바디에 데이터 청크를 작성하기 전에 상태 코드와 헤더를 설정해야 한다.

예제

에코 서버 예제

에코 서버는 요청받은 데이터를 그대로 응답으로 돌려보내는 서버이다.
요청 스트림에서 데이터를 가져와 응답 스트림에 쓰기만 하면 된다.

const http = require('http');

http.createServer((request, response) => {
  let body = [];
  request.on('data', (chunk) => {
    body.push(chunk);
  }).on('end', () => {
    body = Buffer.concat(body).toString();
    response.end(body);
  });
}).listen(8080);

위의 코드에서 아래의 조건이 추가되면

  • 요청 메서드가 POST인 경우
  • URL이 /echo인 경우
  • 위의 두가지 조건에 모두 해당되지 않는 경우에는 404를 응답한다.
const http = require('http');

http.createServer((request, response) => {
  if (request.method === 'POST' && request.url === '/echo') {
    let body = [];
    request.on('data', (chunk) => {
      body.push(chunk);
    }).on('end', () => {
      body = Buffer.concat(body).toString();
      response.end(body);
    });
  } else {
    response.statusCode = 404;
    response.end();
  }
}).listen(8080);

이번 스프린트에서 사용한 HTTP 상태코드

mdn을 참고하여 작성한 글입니다.

01. 201 - Created

  • 요청이 성공적이었으며 그 결과로 새로운 리소스가 생성되었습니다.
  • 이 응답은 일반적으로 POST 요청 또는 일부 PUT 요청 이후에 따라온다.

02. 200 - OK

  • 요청이 성공적으로 되었습다. 성공의 의미는 HTTP 메소드에 따라 달라진다
    • GET: 리소스를 불러와서 메시지 바디에 전송되었습니다.
    • HEAD: 개체 해더가 메시지 바디에 있습니다.
    • PUT 또는 POST: 수행 결과에 대한 리소스가 메시지 바디에 전송되었습니다.
    • TRACE: 메시지 바디는 서버에서 수신한 요청 메시지를 포함하고 있습니다.

03. 404 - Not Found

  • 서버는 요청받은 리소스를 찾을 수 없습니다.
  • 브라우저에서는 알려지지 않은 URL을 의미한다.
  • API에서 종점은 적절하지만 리소스 자체는 존재하지 않음을 의미할 수도 있다. 서버들은 인증받지 않은 클라이언트로부터 리소스를 숨기기 위하여 이 응답을 403 대신에 전송할 수도 있다.
profile
👩🏻‍💻 🚀
post-custom-banner

0개의 댓글