Node.js-콜백함수, 동기/비동기

1 분 소요

callback함수

    var a = [3,1,2];
    function b (v1, v2) {return v2-v1;};
    a.sort(b);
  • 위와 같이 메소드 인수로 함수가 넣어질때에만 함수가 호출되는 함수를 callback함수라고 한다.
  • b라는 변수를 만들어 메모리할당하는 것이 낭비이므로 익명함수로 아예 호출할 때에만 쓰이도록 인수자리에서 선언을 해버린다.
      a.sort(function(v1, v2) {return v2-v1;});
      a.sort((v1, v2)=>(v2-v1));
    
  • 참고로 sort()는 매개변수로 함수를 받을 수 있는 성격의 아이임.

동기와 비동기 프로그래밍

  • 동기 : 빨래 30분해서 끝내고 설거지 30분 해서 끝내고 청소 30분 해서 종료한다.
  • 비동기 : 빨래, 설거지, 청소 업체에 전화해서 일이 다 끝나면 알려달라고 말만하고 대략 3분만에 일처리가 끝난다. → 이렇게 처리하면 뭐가 먼저 처리될지 알 수 없으므로 순서가 중요하지않을 때 효율적이다.

  • 동기 : 한 명 한 명에게 이메일을 보내는거 → 한명 당 1초라면 만 명의 사람에겐 10000초가 걸림.
  • 비동기 : 발행버튼 누르면 이메일을 보내는 별도의 시스템에게 10000명에게 이메일을 보내라고 위임을 하는것이다. 그리고 난 다른 작업하러 룰루~

→ 동기와 비동기 프로그래밍을 코드로 알아보자

    var fs = require("fs");
    
    // sync방식
    console.log(1);
    var data = fs.readFileSync("test.txt", {encoding : "utf8"});
    console.log(data);
    
    // async방식
    console.log(2);
    fs.readFile("test.txt", {encoding : "utf8"}, function(err,data){
        console.log(3);
        console.log(data)
    });
    console.log(4);
  • 위에서 readFile()메소드 안에 있는 function(){} 이거는 콜백함수이다.
  • 그래서 콜백함수는 비동기프로그래밍에서 쓰인다는 것을 알 수 있다.
  • test.txt에는 hello sync and async라고 쓰여져있다.
  • 위의 코드를 실행하면 아래와 같이 나온다.
      1
      hello sync and async
      2
      4
      3
      hello sync and async
    
  • 출력 결과가 2,3,4가 아닌 2,4,3인 걸 알 수 있다.
  • 이유는 비동기방식의 특징때문이다. 비동기방식인 readFile()은 전화로 해달라고 부탁만해놓고 프로그램은 다음 자기가 할 일인 console.log(4)을 하러가버린거다.
  • 그리고 readFile()이 끝났을 때 그 결과가 나온것이다. 만약 readFile()이 굉장히 길게 10분동안 처리되어야하는 코드이면 먼저 다른 걸 끝내도록 이런 비동기방식이 지향된다. 10분이 걸리는 상황인데 동기방식이면 계속 10분 내내 사용자가 기다려야하는 불상사가 발생한다.

Node.js 서버코드로 동기와 비동기 작동을 알아보자

    const http = require('http');
    
    const hostname = '127.0.0.1';
    const port = 3000;
    
    const server = http.createServer((req, res) => {
        res.statusCode = 200;
        res.setHeader('Content-Type', 'text/plain');
        res.end('Hello World\n');
    });
    
    server.listen(port, hostname, () => {
        console.log(`Server running at http://${hostname}:${port}/`);
    });
  • 위에서 listen()함수는 매개변수로 콜백함수를 설정하는데 이는 비동기적인 작동이다.
  • listen()함수가 시간이 오래걸릴 수 있는 함수이기 때문이다.
  • listen()함수가 완료되었을 때 콜백이 실행되는 것!
  • 콜백함수 쓸 때 새로운 문법이 나왔는데 결국 익명함수 간단하게 표현한 축약형이라 생각하면됨.
      (req, res) => {
          res.statusCode = 200;
          res.setHeader('Content-Type', 'text/plain');
          res.end('Hello World\n');
      }
    
  • 위의 함수는 결국 아래와 같은 말인데 간단히 축약한 것 뿐이다.
      function (req, res){
          res.statusCode = 200;
          res.setHeader('Content-Type', 'text/plain');
          res.end('Hello World\n');
      }
    

카테고리:

업데이트:

댓글남기기