제임스조
19
2020-01-19 14:29:43
3
428

[JavaScript] ES6의 Promise 쿼리의 동기처리 결과에 대한 의문


안녕하세요, 

Promise의 all 함수와 비교적 최근 개념인 async/await 함수에서 DB쿼리 실행시 의문이 들어 질문드립니다.

아래는 쿼리가 순차적으로 실행됩니다 . sql1 이후 sql2 이후 ......sql5까지.

이벤트 처리방식의 자바스크립트 비동기 함수에서 동기화를 강제하기 위한 좋은 방법인 것 까지는 이해했으나

const queryExec = sql => new Promise ((resolve, reject) => {
  con.query(sql, function (err, res) => {
    err ? reject(err) : resolve(res) // reject는 예외 처리를 할 때 사용합니다.
  })
});
(async () => {
  try {
    const res1 = await queryExec(sql1)
    const res2 = await queryExec(sql2)
    const res3 = await queryExec(sql3)
    const res4 = await queryExec(sql4)
    const res5 = await queryExec(sql5)
    /* ... 최종 처리 코드 작성 ... */
  } catch (err) {
    console.log(err)
  }
})()


위의 방식은 모든 5개의 쿼리가 수행되는 시간만큼 걸리기 때문에 이를 병렬처리하여 아래와 같이 promise all을

사용하게되면 쿼리의 최종 처리시간이 획기적으로 단축된다고 여기저기서 장점을 설명하고 있습니다.

하지만 시간은 단축이 되겠으나 만약 첫번째 쿼리가 DB에서 회원인지 아닌지 판별한 후

두번째 쿼리로 넘어가야하는 로직이라면 아래와 같이 병렬처리시 각각의 쿼리가 제대로 실행될 수 있는 것인지 궁금합니다.

(async () => {
  try {
    Promise
      .all([queryExec(sql1), queryExec(sql2), queryExec(sql3), queryExec(sql4), queryExec(sql5)])
      .then(values => {
        const [res1, res2, res3, res4, res5] = values
        /* ... 최종 처리 코드 작성 ... */
      })
  } catch (err) {
    console.log(err)
  }
})()


예제를 든 사이트나 몇몇 가이드에서는 회원 중복여부 후 분기되는 쿼리들을 나열하여 설명 하더군요.

어떻게 병렬로 처리하는데 서로 연관이 있는 쿼리가 각자 수행되서 시간을 단축시킬 수 있다고 하는것인지,

어쨌든 회원여부를 판단하기 위해서는 병렬처리가 아닌 그 전의 쿼리가 선행되어 결과가 나와야만 가능하다

생각되는데 예제가 틀린 것인지 제 생각이 틀린 것인지 궁금합니다.


1
  • 답변 3

  • 세브라이드
    2k
    2020-01-19 14:45:49

    제대로 실행되지 않습니다. Promise.all은 순서가 없습니다.

    첫번째 쿼리만 반드시 첫번째 실행되어야 하고 이후 쿼리는 순서가 상관이 없다면



    (async () => {
      try {
        const res1 = await queryExec(sql1);  
        const [res2, res3, res4, res5] = await Promise.all([
          queryExec(sql2),   
          queryExec(sql3),   
          queryExec(sql4),   
          queryExec(sql5),
      ]);
      } catch (err) {
        console.log(err)
      }
    })()
    



    이런 식으로 짤 수는 있겠습니다.

  • 제임스조
    19
    2020-01-19 14:54:21

    의혹에 대한 명확한 설명 감사드립니다. ^^

  • Frudy
    6k
    2020-01-19 15:28:19

    와드

  • 로그인을 하시면 답변을 등록할 수 있습니다.