병렬 실행이 await을 기다려주지 않는 이유
정리 for 문과 for .. of 문은 순차 함수이기에 await 비동기 함수를 순차적으로 실행할 수 있습니다. forEach 문에서는 왜 await 비동기 함수를 기다려주지 않을까? 위 코드는 processItem 이라는 함수가 끝나기 전에 "완료"를 출력할 수 있습니다. 왜냐하면 forEach문은 아래와 같이 동작할 수 있기 때문입니다. forEach 문은 콜백이 반환한 Promise를 기다리지 않습니다. 콜백 내부 상황에서 보았을 때 await 자체는 정상 작동하지만, 바깥의 forEach 문에서는 그 Promise를 수집하거나 기다리지 않기 때문에 전체 작업 완료를 추적할 수 없습니다. 정리하면 각 콜백 내부에서는 await이 적용되기는 하지만, 바깥 함수도 forEach의 완료만을 확인할 뿐 비동기 작업의 완료는 확인하지 못한다는 말입니다. map도 await를 자동으로 기다려주지 않는다. 위 코드에서 results 실제 결과 배열이 아니며, Promise[] 형태로 리턴이 됩니다. map 역시 콜백의 Promise를 기다리지 않고, 그대로 배열에 담아 리턴을 해주기 때문에 모든 작업을 병렬로 실행하고 기다리려면 Promise.all로 래핑해주며 사용해야합니다. 왜 이런 방식으로 동작이 되는지, "순차 실행"과 "병렬 실행"의 관점에서 이해해보자. 다음은 순차 실행코드에 대한 예제입니다. 순차 실행 코드는 하나의 작업이 끝난 뒤 다음 작업을 시작하는 방식입니다. 각 작업이 1초씩 걸린다고 가정했을 때, 총 3번의 작업이 이뤄진다면 총 3초가 걸리게 될 것입니다. 이 방식이 필요한 경우에는 아래와 같습니다. 앞 작업의 결과가 다음 작업에 필요할 때 API 호출 순서를 보장해야할 때 서버 요청 제한 때문에 한 번에 하나씩 호출해야할 때 DB 작업을 순차적으로 처리해야할 때 다음으로 아래는 병렬 실행 코드에 대한 에제이다. 병렬 실행 코드는 모든 작업이 거의 동시에 시작됩니다. 각 작업이 1초씩 걸린다고 가정했을 때 총 3번의 작업이 이뤄진다면 모든 작업이 동시에 수행되기 때문에 총 1초가 걸리게 됩니다.
- 프론트엔드
- 자바스크립트
현우

1