생활코딩/WEBn

[Node.js] 비동기/동기(Sync)와 콜백, request

hayjo 2020. 9. 15. 22:33

[강의 출처] opentutorials.org/course/3332

 

WEB2 - Node.js - 생활코딩

수업소개 이 수업은 JavaScript를 이용해서 Node.js를 제어해 동적으로 HTML 코드를 생성하는 웹애플리케이션을 만드는 방법에 대한 수업입니다.  수업대상 예를들어 1억개의 페이지로 이루어진 웹사

opentutorials.org


Node.js에서의 비동기처리

  • 동기(Synchronous): 작업을 순차적으로 처리
  • 비동기(Asynchronous): 작업을 병렬적으로 처리
  • 비동기로 처리하면 대기시간이 없어 빠르기 때문에 퍼포먼스가 중요한 작업에 권장됨
  • node.js에서는 비동기가 default로, 동기처리용 함수는 Sync 형태로 제공됨(ex fs.readFile, fs.readFileSync)
  • 비동기의 경우, 작업이 완료되면 callback 함수를 호출해서 다음 작업(병렬 처리)으로 넘어감

 

동기(Synchronous) 처리

var fs = require('fs');

console.log('A');
var result = fs.readFileSync('./sample.txt', 'utf-8');
console.log(result);
console.log('C');

/* 순차적으로 실행되어
A
B
C
*/

 

동기(Asynchronous) 처리

console.log('A');
fs.readFile('./sample.txt', 'utf-8', function(err, result){
  console.log(result);
});
console.log('C');

/*
readFile 함수가 실행되는 동안에 그 다음줄인 console.log('C');가 먼저 실행되어
A
C
B
*/

 

 

request.on()

  • 전송 받은 데이터를 여는 방법
  • [참고] stackoverflow.com/questions/4295782/how-to-process-post-data-in-node-js
  • Node.js에서는 post방식으로 데이터를 전송 받을 때, (전송량 과다로 생기는 이슈 방지를 위해)
  • 일정량의 데이터를 수신할 때마다 callback 함수를 호출하고, 그 callback 함수의 인자에 수신한 데이터를 담아서 넘겨준다.
  • 따라서 아래 코드는 callback을 호출할 때마다 body에 수신한 데이터를 추가하는 형태로 작성되어 있다.
var qs = require('querystring');

function(request, response) {
  if(request.method == "POST") {
    var body = '';
    
    request.on('data', function(data) {
      body += data;
      
      // 만약 데이터가 너무 많으면 연결 종료 - 일종의 보안장치
      if (body.length > 1e6){
        request.connection.destroy();
      };
    });
    
    request.on('end', function() {
      var post = qs.parse(body);
    });
  }
}