Promise.all과 Promise.allSettled는 어떤 상황에서 다르게 사용하나요?
답변 포인트
하나의 실패가 전체 작업 실패로 이어져야 하는지, 부분 성공 결과도 필요한지를 기준으로 비교해보세요.
정답 및 해설
빠른 요약
Promise.all은 여러 비동기 작업 중 하나라도 reject되면 즉시 전체가 reject됩니다. 모든 작업이 반드시 성공해야 다음 단계로 갈 수 있을 때 적합합니다.
Promise.all은 여러 비동기 작업 중 하나라도 reject되면 즉시 전체가 reject됩니다. 모든 작업이 반드시 성공해야 다음 단계로 갈 수 있을 때 적합합니다. Promise.allSettled는 모든 작업이 끝날 때까지 기다린 뒤 fulfilled/rejected 상태를 각각 반환하므로, 일부 실패를 허용하고 결과를 모아 처리할 때 적합합니다.
핵심 개념
핵심 기준은 실패 전파 방식과 부분 성공 처리입니다. 이 개념은 단순히 용어를 외우는 것보다, 어떤 문제를 줄이기 위해 등장했는지와 실제 코드나 운영 환경에서 어떤 trade-off를 만드는지 함께 이해하는 것이 중요합니다.
비동기 작업을 병렬로 실행할 때는 성공 결과뿐 아니라 실패를 어디까지 전파할지 결정해야 합니다. 결제처럼 하나라도 실패하면 중단해야 하는 작업과, 여러 위젯 데이터처럼 일부만 실패해도 화면을 구성할 수 있는 작업은 다른 전략이 필요합니다.
동작 흐름
- 병렬로 실행할 비동기 작업 목록을 준비합니다.
- 전체 성공이 필요한지, 부분 성공을 허용할지 결정합니다.
- Promise.all 또는 Promise.allSettled로 결과를 수집합니다.
- 실패한 작업을 재시도하거나 사용자에게 안내할지 처리합니다.
실제 예시
const results = await Promise.allSettled([
fetchUser(),
fetchPosts(),
fetchNotifications(),
]);
const fulfilled = results.filter((result) => result.status === 'fulfilled');대시보드처럼 여러 API 결과를 한 화면에 모을 때는 일부 요청 실패를 분리해서 처리할 수 있습니다.
실무에서 주의할 점
- Promise.all은 빠르게 실패하므로 나머지 작업 결과를 사용할 수 없습니다.
- allSettled를 쓰더라도 실패 원인을 로깅하거나 재시도하는 처리가 필요합니다.
- 무조건 병렬 실행하면 API rate limit이나 브라우저 동시 연결 제한에 걸릴 수 있습니다.
함께 연결해서 보면 좋은 키워드
JS, Promise, 비동기, 에러처리
면접에서 짚으면 좋은 포인트
- 전체 성공이 비즈니스 전제인지, 부분 성공을 화면에서 허용할 수 있는지 먼저 설명하면 좋습니다.
- 실패한 Promise가 이미 시작된 다른 작업을 자동으로 취소하지 않는다는 점도 함께 언급하면 답변이 깊어집니다.
정리
한 줄로 정리하면, Promise.all은 전체 성공이 필요할 때, Promise.allSettled는 일부 실패를 허용하고 모든 결과를 확인해야 할 때 사용합니다. 실무에서는 개념을 적용하는 조건과 적용하지 않았을 때 생기는 문제까지 함께 이해하는 것이 중요합니다.