반응형

이 글의 동영상 강의 1편입니다.

https://youtu.be/560LIgIiU8g

다음은 동영상 강의 2편입니다.

https://youtu.be/LoZhQXs85r8

 

이 글은 NodeJS 공식 홈페이지의 다음 글을 참고하여 작성하였습니다.

https://nodejs.org/ko/docs/guides/anatomy-of-an-http-transaction/

 

HTTP 트랜잭션 해부 | Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

 

NodeJS로 서버를 개발하려고 하려면 HTTP의 처리 과정을 이해하여야 합니다.

NodeJS에서 제공하는 http 모듈의 사용법과 같이 배워보도록 하겠습니다.

 

웹서버 만들기

  • 우선 웹서버 객체를 만듭니다.
const http = require('http');

const server = http.createServer((request, response) => {
});
  • 이때 사용된 createServer는 server 객체를 생성하고 발생한 이벤트를 전달하는 역할을 하므로 다음과 같이 변경할 수 있습니다.
const server = http.createServer();
server.listen(8080);
server.on('listening', () => {
   console.log(`listen on 8080 !!!`);
});

 

Request 처리하기

  • 생성한 서버에서 request를 받아 처리할 수 있습니다.
server.on('request', (request, response) => {
   console.log(request.headers);
   response.write('<h1>Node Server</h1>');
   response.end();
});
  • request에는 url, method, header 등의 정보가 포함됩니다.
server.on('request', (request, response) => {
  const { headers, method, url } = request;
  const userAgent = headers['user-agent'];
  console.log(`method : ${method}`);
  console.log(`url : ${url }`);
  console.log(`userAgent : ${userAgent}`);

  response.write('<h1>Node Server</h1>');
  response.end();
});
  • post나 put의 request에서 stream으로 전달되는 data와 end를 이용하면 body를 읽어올 수 있습니다.
  let body = [];
  request.on('error', (err) => {
    console.error(err);
  }).on('data', (chunk) => {
    body.push(chunk);
  }).on('end', () => {
    body = Buffer.concat(body).toString();
    console.log(body);

    response.write('<h1>Node Server</h1>');
    response.end();
  });
  • 테스트를 위해서 postman에서 다음과 같이 변경 합니다.
    • request method를 GET에서 POST로 바꿉니다.
    • headers에 다음 값을 추가합니다.
      • Content-Type: application/json

  • Body탭에서 다음 항목을 변경합니다.
    • body type을 none에서 raw로 변경합니다.
    • data type을 JSON으로 변경합니다.

  • Send를 클릭하면 다음과 같은 결과를 확인할 수 있습니다.

  • request에서 error 이벤트를 받아 오류를 처리할 수 있습니다.
request.on('error', (err) => {
  // 여기서 `stderr`에 오류 메시지와 스택 트레이스를 출력합니다.
  console.error(err.stack);
});

 

Response 사용하기

  • statusCode를 이용해 상태 코드를 전달할 수 있습니다.
    지정하지 않을 경우의 상태코드는 항상 200입니다.
response.statusCode = 404; // 클라이언트에게 리소스를 찾을 수 없다고 알려줍니다.
  • setHeader를 이용해 header를 설정할 수 있습니다.
response.setHeader('Content-Type', 'application/json');
response.setHeader('X-Powered-By', 'bacon');
  • 아래와 같이 명시적으로 header를 정의 할 수 있습니다.
response.writeHead(200, {
  'Content-Type': 'application/json',
  'X-Powered-By': 'bacon'
});
  • write와 end를 이용해 response body를 만들 수 있습니다.
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>');
  • respone에서 error event는 다음과 같이 처리할 수 있습니다.
response.on('error', (err) => {
  console.error(err);
});
  • 지금 까지의 내용을 정리하면 다음과 같이 코드를 작성할 수 있습니다.
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.writeHead(200, {'Content-Type': 'application/json'})
    const responseBody = { headers, method, url, body };
    response.end(JSON.stringify(responseBody))
  });
}).listen(8080);

에코 서버 만들기

  • 다음과 같이 /echo로 요청하는 post 메소드에 대해서 응답하는 서버를 만들 수 있습니다.
const http = require('http');

http.createServer((request, response) => {
  request.on('error', (err) => {
    console.error(err);
    response.statusCode = 400;
    response.end();
  });
  response.on('error', (err) => {
    console.error(err);
  });
  if (request.method === 'POST' && request.url === '/echo') {
    request.pipe(response);
  } else {
    response.statusCode = 404;
    response.end();
  }
}).listen(8080);

이상으로 nodejs의 http 요청을 처리하는 기본적인 방법에 대해 알아보았습니다.

 

반응형

+ Recent posts