Node.js

[Node.js / Javascript] Async 모듈로 비동기 함수들 교통 정리 해주기

나태준 2019. 6. 1. 02:27
반응형

오늘 쓴 Node.js 첫 게시글에 올렸듯 난 Node.js의 비동기적 실행 구조에 익숙하지가 않다. 그리고 실제로 비동기적 구조에도 실행 순서가 필요한 경우가 많다.

 

그런데 콜백으로만 이걸 처리하다보면 콜백 지옥에 빠지기 쉽상이다. 구조상 콜백으로만 안되는 경우도 많고.

 

그럴 때 쓰는 모듈이 Async 모듈이다.

 

그런데 지금 생각난건데 계속 메소드라는 말을 썼었는데 Node.js는 함수인 것 같기도 하고... 클래스 개념이 없으니... 근데 또 라이브러리화 되어있는건 메소드인가 싶기도 하고... 잘 모르겠다


1. 모듈 선언해준다. 당연히 잊지말고 npm install 해주고

var async = require('async');

 

2-1. async.waterfall

사실 컴공생한테 워터폴 하면 떠오르는건 소프트웨어 공학에서의 워터폴식 개발 프로세스일거다.

 

일단 async.waterfall에 대해 좀 생각해보자.

 

그냥 이름만 들어도 폭포수처럼 콜백을 넘길 거 같은 느낌이 들지 않는가! 아님 말고!

 

구조는 간단하다.

async.waterfall([func1, func2, ...], result_func);

이정도 되시겠다.

 

문제는 이 안에서 콜백값을 넘기는 방식이다.

 

귀찮으니 서버코드 들고와서 예제를 들고싶지만 서버 구조가 다 드러나므로 무리인 것 같고, 간단히 예제코드를 작성해봤다.

async.waterfall([
  (callback) => { 
    var a = 1;
    var b = 2;
    callback(null, a, b);
  },
  (one, two, callback) => { 
    console.log(one, two);
  }
]);

예제코드가 실제로 작동하는걸 보장하진 않지만 작동할거다.

 

결과는 당연히 콘솔에

1 2

가 찍힐꺼고

 

 

첫번째 함수에서 콜백 호출 부분을 잘 봐야 되는데 첫번째 인수가 null이다.

 

왜냐면 async.waterfall 내에서의 첫번째 인수는 error 처리 부분이기 때문이다.

 

그러니까 두번째 함수의 인수가 (one, two, callback)이라고 해도 실제론 (error, one, two)이라는 거다.

 

물론 따지고보면 틀렸을 수도 있다. (난 Node.js 초보니까.)

 

근데 이렇게 이해하고 쓰면 사용 시 헷갈리진 않는다.

 

 

그런데 예제코드를 잘 보면 구조가 좀 이상하다.

async.waterfall([func1, func2]);

이런 구조다. result_func가 없다.

 

 

왜냐하면 생략이 가능하기 때문이다. 

 

이게 Node.js 특징인지 async.waterfall이 오버로딩 되있는건지는 잘 모르겠지만 없어도 된다.

 

굳이 쓰겠다면,

async.waterfall([
  (callback) => { 
    var a = 1;
    var b = 2;
    callback(null, a, b);
  },
  (one, two, callback) => { 
    callback(null, one + two);
  }
],
  (error, result) => {
    if (error) 
      throw error;
    else
      console.log(result);
  }
);

이렇게 쓰면 될 것 같다.

 

결과는

3

이 나오겠지..

 

라고 생각하기 쉽지만 사실

12

가 나올거다.

 

왜냐면 1이랑 2가 string 취급을 받을꺼기 때문에...

 

물론 아닐 수도 있다. 해보진 않았으니까. 근데 맞을꺼다.

 

뭐 대충 이런식으로 쓰면 된다.

 

2-2. async.parallel

뭐 얘도 waterfall이랑 구조는 비슷하다.

async.parallel([func1, func2, ...], result_func);

다만 얘는 여러 함수의 result를 result_func에서 한번에 받을 수 있다.

 

예제 코드를 보자.

async.parallel([
  (callback) => {
    callback(null, 1);
  },
  (callback) => {
    callback(null, 2);
  }
], (error, results) => {
  console.log(results);
});

뭐 이런 코드면 대충

[1, 2]

거나

['1', '2']

뭐 이런게 나오지 않을까 싶다.

 

이게 서버 초기엔 parallel을 썼었는데 나중가서 리팩토링하면서 지워버리고 waterfall로 대체해서 기억이 가물가물하다.

 

근데 결과를 리스트형으로 줬던게 맞는 것 같다.

 

나머지 뭐 forever나 그런게 있는데 개인적으론 쓸모 없어서 패스.

 

두개만 있으면 async 모듈은 다 쓴거다.

반응형
자바스크립트를 활성화시켜주세요!
[활성화]