AggregateError
AggregateError
Error는 ECMAScript 201(ECMA-62 12 Edition)에서 도입된 JavaScript의 내장 오류 객체로, 여러 개의 오류를의 오류 객체 통합하여 표현할 수 있도록 설계되었습니다. 주로 비동기 작업에서 여러 개의 프로미스가 동시에 실패할 경우, 각각의 오류를 별도로 처리하지 않고 하나의 오류로 묶어 처리할 수 있어 코드의 가독성과 오류 처리의 효율성을 높여줍니다.
개요
JavaScript 오류 처리는 [try...catch](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EC%98%A4%EB%A5%98%EC%B2%98%EB%A6%AC/try...catch)
문과 Error
객체를 통해 이루어지며, 다양한 상황에 맞는 전용 오류 타입(예: [TypeError](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EC%98%A4%EB%A5%98%EC%B2%98%EB%A6%AC/TypeError)
, [SyntaxError](/doc/%EA%B8%B0%EC%88%A0/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D/%EC%98%A4%EB%A5%98%EC%B2%98%EB%A6%AC/SyntaxError)
)이 존재합니다. AggregateError
는 이러한 오류 처리 체계의 확장으로, 여러 오류가 동시에 발생하는 상황에서 유용하게 사용됩니다.
특히 Promise.any()
와 같은 비동기 메서드에서 중요한 역할을 하는데, 이 메서드는 주어진 프로미스 중 하나라도 성공하면 결과를 반환하지만, 모든 프로미스가 실패할 경우 AggregateError
를 발생시킵니다. 이는 개발자가 어떤 프로미스들이 어떤 이유로 실패했는지를 한 번에 파악할 수 있게 해줍니다.
주요 사용 사례
1. Promise.any()
와 함께 사용
Promise.any()
는 주어진 프로미스 배열 중 가장 먼저 성공하는 프로미스의 결과를 반환합니다. 그러나 모든 프로미스가 거부(rejected)될 경우, AggregateError
를 던집니다.
const promises = [
Promise.reject(new Error("첫 번째 실패")),
Promise.reject(new Error("두 번째 실패")),
Promise.reject(new Error("세 번째 실패"))
];
Promise.any(promises)
.then(result => console.log(result))
.catch(error => {
if (error instanceof AggregateError) {
console.log("모든 프로미스가 실패했습니다.");
error.errors.forEach(err => console.error(err.message));
}
});
출력 결과:
모든 프로미스가 실패했습니다.
첫 번째 실패
두 번째 실패
세 번째 실패
이 예제에서 AggregateError
객체는 errors
속성을 통해 실패한 모든 오류를 배열 형태로 제공합니다.
2. 수동으로 AggregateError 생성
AggregateError
는 직접 생성할 수도 있습니다. 이는 여러 비동기 작업을 병렬로 처리하고, 그 결과에서 여러 오류를 수집하여 통합할 때 유용합니다.
try {
throw new AggregateError([
new TypeError("잘못된 유형"),
new RangeError("범위 초과")
], "여러 오류가 발생했습니다.");
} catch (error) {
if (error instanceof AggregateError) {
console.log(error.message); // "여러 오류가 발생했습니다."
error.errors.forEach(err => console.log(err.name));
}
}
출력 결과:
여러 오류가 발생했습니다.
TypeError
RangeError
AggregateError의 구조
AggregateError
는 다음과 같은 속성을 가집니다:
속성 | 설명 |
---|---|
message |
오류 메시지 (생략 가능, 기본값은 "AggregateError" ). |
errors |
실패한 오류들의 배열. 이 배열은 Error 객체 또는 그 하위 타입을 포함합니다. |
stack |
스택 추적 정보. 개발 및 디버깅에 사용됩니다. |
예시: 속성 접근
const aggError = new AggregateError(
[new Error("A"), new Error("B")],
"병합 오류 테스트"
);
console.log(aggError.message); // "병합 오류 테스트"
console.log(aggError.errors.length); // 2
console.log(aggError.stack); // 스택 정보 출력
브라우저 및 환경 지원
AggregateError
는 비교적 최근에 도입된 기능이므로, 사용 전에 지원 여부를 확인하는 것이 중요합니다.
환경 | 지원 여부 | 최소 버전 |
---|---|---|
Chrome | ✅ | 85+ |
Firefox | ✅ | 79+ |
Safari | ✅ | 14+ |
Node.js | ✅ | 15.0.0+ |
Edge | ✅ | 85+ |
💡 노트: 오래된 환경에서는
AggregateError
가 정의되지 않을 수 있으므로, 폴리필이나 조건부 처리가 필요할 수 있습니다.
관련 개념
Promise.allSettled()와의 비교
Promise.all()
은 하나라도 실패하면 즉시 거부되고, 실패한 이유는 첫 번째 오류만 전달합니다.Promise.allSettled()
는 모든 프로미스의 결과(성공/실패)를 반환하므로, 실패한 프로미스의 원인을 모두 확인할 수 있지만, 오류를 자동으로 통합하지는 않습니다.Promise.any()
는 모든 프로미스가 실패했을 때AggregateError
를 자동으로 생성하여 실패 원인을 통합합니다.
참고 자료
- MDN Web Docs - AggregateError
- ECMAScript 2021 Specification
- V8 JavaScript Engine Blog - Promise.any() and AggregateError
요약
AggregateError
는 JavaScript에서 여러 오류를 하나의 오류 객체로 묶어 처리할 수 있도록 해주는 중요한 기능입니다. 특히 비동기 프로그래밍에서 여러 프로미스가 동시에 실패하는 상황을 효과적으로 다루는 데 필수적이며, Promise.any()
와의 조합을 통해 코드의 안정성과 유지보수성을 높일 수 있습니다. 현대적인 JavaScript 환경에서는 널리 지원되므로, 비동기 오류 처리 전략에 적극적으로 활용할 것을 권장합니다.
이 문서는 AI 모델(qwen-3-235b-a22b-instruct-2507)에 의해 생성된 콘텐츠입니다.
주의사항: AI가 생성한 내용은 부정확하거나 편향된 정보를 포함할 수 있습니다. 중요한 결정을 내리기 전에 반드시 신뢰할 수 있는 출처를 통해 정보를 확인하시기 바랍니다.