ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Node.js] async 모듈을 통해 동기식으로 처리해보자
    개발/Javascript 2018. 11. 11. 19:13


    많은 분들이 Node.js를 처음 접할 때 겪게되는 어려운 점 중 하나가 바로, 

    Javascript는 비동기 방식으로 함수를 처리한다는 점입니다.


    즉, C나 Java같은 언어같은 경우에는, 일반적으로 작성한 순서대로 함수가 동기적으로 실행이 되지만,

    Javascript는, 함수가 순서대로 실행된다는 보장이 되지 않습니다.


    저도 마찬가지로 처음에 Node.js 를 접했을 때, 이 부분 때문에 많이 고생을 했었던 기억이 납니다...



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    function func_1(){
        setTimeout(function () {
        console.log('func_1 function is called');
      }, 200);
    }
    function func_2(){
        setTimeout(function () {
        console.log('func_2 function is called');
      }, 100);
    }
     
    func_1();
    func_2();
     
    cs



    위와 같은 코드를 실행한다면, 


    보통 C나 Java같은 언어를 주로 해왔던 상황에서는,

    당연히, func_1함수가 먼저 실행이되고, 

    func_1함수가 끝나게 되면 그 이후에 func_2함수가 실행이 된다고 생각하게되므로,



    1
    2
    func_1 function is called
    func_2 function is called

    cs



    이라는 결과를 얻는다고 생각이 되지만,

    실제로는


    1
    2
    func_2 function is called
    func_1 function is called
    cs


    라는 결과를 얻게 됩니다. 


    그래서, 함수를 순차적으로 실행시키기 위해 코드를 짜다 보면,

    흔히 말하는 '콜백지옥'에 빠지기 쉽습니다.


    이러한 콜백지옥을 해결하기위한 방법으로, async/await, promise, aysnc모듈 등등의 방법이 있지만,

    요번에는 aysnc모듈을 소개하고자 합니다.




    async모듈은, 비동기방식을 동기방식으로 쉽게 바꿔주기 위한 모듈입니다.


    async모듈은 비동기 처리를 위한 많은 방식의 함수를 제공하지만,

    이 포스팅에서는, 가장 많이쓰이고(?), 대표적인 waterfall 함수를 소개해드리고자 합니다!


    waterfall함수는, 

    함수를 순차적으로 실행함과 동시에, 

    해당 작업의 결과를 다음작업의 인자로 넘겨줄 수 있는 특징을 가지고 있습니다.



    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    var async = require('async');
     
    async.waterfall([
        function(callback) {
            callback(null'first');
        }, // 1 
        function(arg, callback) {
            console.log("arg : " + arg);
            callback(null'second');
        }, // 2 
        function(arg, callback) {
            console.log("arg : " + arg);
            callback(null'finish');
        }  // 3 
    ], function (err, result) {
        if(err){
          console.log('Error 발생');
        }else {
          console.log('result : '+ result);
        }  // 4
    });
    cs


    waterfall 방식의 기본 예제 코드입니다.


    waterfall의 기본 컨셉을 이해하기 위한

    각각 함수마다, first, second, finish라는 값을 다음 함수의 인자로 넘겨주어서, 최종적으로 

    마지막 값인 finish가 출력되는 예제입니다.


    //1 에서, 

    첫 번째 함수는 별다른 수행 없이, first라는 값을 전달합니다


    //2 에서,

    두 번째의 함수의 arg 인자에는, 첫번째 함수가 전달한 first라는 값을 가지고 있습니다.

    그러므로, 

    arg : first를 출력하고

    다음 함수로 second라는 값을 전달합니다.


    //3 에서,

    이전과 마찬가지로, 

    arg : second를 출력하고,

    다음 함수로 finish라는 값을 전달합니다.


    //4 에서,

    만약 이전 어떤 함수에서든지 에러가 발생하게 된다면, 함수 진행을 멈추고,

    //4의 err로 넘어오게 됩니다.

    에러가 없을 시,

    result : finish를 출력하고 끝나게 됩니다.


    최종 결과 : 


    1
    2
    3
    4
    arg : first
    arg : second
    result : finish
     
    cs




    참고 : async module docs

    댓글

Designed by Tistory.