• SEB 섹션2. 13일차 TIL - Web Server (1)_Mini node server

    2021. 9. 8.

    by. 자율학습 코딩봇

     

    오늘은 Node.js를 활용하여 작은 서버를 구현하였다. 서버 같은 건 어느 세월에 구현해보나 하고 생각하고 있었는데 이제서야 서버를 구현해보는 경험을 할 수 있었다. 그런데 예상 했던 것보다 훨씬 쉽지가 않았다. ^^

     

    아니 뭐 이렇게 새로 알아야하는 메소드랑 개념들이 많은지 조금 헷갈리고 그리고 진행되는 과정에서 어떠한 형태로 데이터가 있을까 전혀 가늠이 되지 않아서 초반에 상당한 애를 먹었다. 그냥 VS_Code로 알고리즘 함수 돌려보는 거랑 역시 격이 다르다;;;;

     


     

    mini node server 스프린트에서 필요했던 기본지식은 이전에 다루었던 http 통신과 관련이 있는 내용이었다. http 통신과 관련된 내용은 최대한 제외하고 이번에는 좀 더 새롭게 학습한 내용에 맞추어 글을 적어본다.

     

    Web Server 요청

    node.js에서는 서버를 생성할 수 있는 API를 제공하고 있다. 이번 스프린트는 node.js의 공식문서에서 HTTP 트랜잭션 해부 문서의 내용을 참고하면서 진행되었다.

     

    1. 서버 생성

    아래 코드와 같이 http 모듈에서 제공하는 createServer 메소드를 활용하면 웹 서버 객체가 생성된다. 처음에는 이거 하나만 쓰면 서버가 생긴다고? 생각했는데 진짜 되긴 해서 놀랐다;;

     

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

     

    위 내용에서 createServer의 인자로 활용되는 콜백함수의 인자인 request와 response는 각각 서버로 전달된 요청과 그리고 서버에서 받은 요청에 대해서 보내게될 응답 객체이다.

     

     

    2. 요청 객체

    요청 객체인 request는 아래와 같이 구조 분해 할당이 가능하다. 

     

    const { method, url } = request;

     

    혹은 request.method와 같이 일반 객체의 키를 활용한 방법도 당연히 가능하다.

     

     

    3. 요청 바디

    요청 객체에 담긴 바디의 데이터를 구하기 위해서는 다음과 같은 방식으로 구현되어야 한다.

     

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

     

    무언가 또 메소드 같은 것들이 줄지어서 연결된 모습을 보니 promise가 떠오르는데 이와 관련해서 문서 상에서는 이와 같은 로직을 npm에서 concat-stream이나 body와 같은 모듈을 활용하여 위 로직을 감출 수 있다고 소개하고 있다. 여기서 이전에는 주로 받아오는 데이터를 json의 형태로 취급을 하였는데 여기서는 Buffer라는 객체로 취급을 하고 있다.

     

     

    web server 응답

    요청에서 필요한 부분을 학습한 것에 이어서 앞서 전달되었던 요청에 대한 응답 내용은 아래와 같다.

     

    1. 응답 헤더 설정

    아래 코드와 같이  응답 코드와 헤더들을 설정할 수 있다.

     

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

     

    2. 응답 바디 작성

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

     

    응답 바디의 내용을 추가하는 것은 response.write()를 활용하여 추가가 가능하다. 그리고 응답 바디의 내용을 마무리 하려는 경우 response.end()를 활용하여 응답 내용을 모두 종결하여 응답 내용을 전송 할 수 있다. 혹은 위에서 response.write()로 작성된 모든 내용을 response.end()의 인자로 전달하여 정리할 수 있다.

     

     

    댓글