저번에 express-async-errors 관련해서 포스팅을 했었습니다.
전에 포스팅에서는
https://johnny-developer-story.tistory.com/11
Express 4.x에서 express-async-errors로 Rejected Promise 처리하기
Bun, Express, TypeScript 환경에서 API를 개발할 때, 요청 헤더의 범위 설정이 잘못되어 오류가 발생할 수 있습니다. 이 경우 416 상태 코드 응답이 반환됩니다. 에러 핸들링 미들웨어를 사용해도 에러를
johnny-developer-story.tistory.com
개발 환경에서 express-async-errors를 적용하여 unhandledRejection, 즉 비동기 에러를 잡을 수 있었습니다. 그러나 bun으로 JavaScript 파일을 빌드하고 리눅스 환경에서 백그라운드에 실행했을 때 에러가 발생했습니다. 왜 이런 문제가 발생했을까요?
1. 에러의 원인
해당 에러는 파일 경로가 존재하지 않아 발생한 Promise Rejection Error였습니다. 빌드 과정에서 무엇인가 잘못되었는지 Bun 공식 문서를 찾아보았지만, 정확한 원인을 파악할 수 없었습니다. Bun이 출시된 지 얼마 되지 않아 레퍼런스 자료가 많지 않은 점도 어려움을 더했습니다.
![](https://t1.daumcdn.net/keditor/emoticon/friends1/large/016.gif)
왜지..?
2. 해결 방안
해결 방안을 고민한 결과, 두 가지 접근 방법을 시도해 보았습니다.
2.1. Express-async-errors 모듈을 해당 라우터 파일에 import
먼저, express-async-errors 모듈을 해당 라우터 파일에 직접 import했습니다. 이를 통해 비동기 에러를 적절히 처리할 수 있었습니다. 보통은 express를 초기화 하는 부분과 라우터 부분을 나눠서 작업하기 때문에 저는 express를 초기화 하는 부분에 import를 했었고 개발환경에서는 정상적으로 작동 되었었는데, 배포 환경에서 작동이 안되었습니다.
그래서 라우터 부분에 추가를 했었고, 정상적으로 작동하는것을 확인했습니다.
아래는 express-async-errors 공식문서에서 사용하는 방법입니다.
2.2. unhandledRejection 전역 처리기(Global Handler) 설정
UnhandledRejection 에러란?
`unhandledRejection` 에러는 JavaScript의 비동기 처리 메커니즘인 Promise가 거부(reject)되었을 때 이를 처리하지 않았을 때 발생하는 에러입니다. 보통 다음과 같은 상황에서 발생합니다:
const promise = new Promise((resolve, reject) => {
reject(new Error('Something went wrong!'));
});
promise.then(result => {
console.log(result);
});
// 여기서 catch나 then의 두 번째 인자를 사용하여 에러를 처리하지 않았기 때문에 unhandledRejection 발생
따라서 두 번째 방법은 process.on('unhandledRejection', ...) 전역 처리기(Global Handler) 설정 코드를 사용하여 모든 비동기 에러를 전역에서 처리하는 것입니다.
process.on('unhandledRejection', (reason: string, p: Promise<any>) => {
console.error(`Unhandled Rejection at: ${p}, reason: ${reason}`)
})
이 코드는 모든 unhandledRejection 에러를 로그로 기록하고, 추가적인 알림 시스템과 연동하여 관리자에게 즉시 알릴 수 있도록 합니다.
하지만 여기서 response 객체를 사용할 수 없으므로 클라이언트에게 응답을 보내는 대신 로그로 남기고 에러를 처리합니다. 따라서 요청을 보낸 주체는 응답을 못 받기 때문에 적절한 처리가 필요합니다.
3. 해결
다행히도 첫 번째 방법으로 문제를 해결할 수 있었고, 빠르게 트러블 슈팅을 마칠 수 있었습니다. 개발 환경에서는 Express를 초기화할 때 express-async-errors를 import하면 충분했지만, 실제 배포 환경에서는 다르게 동작하는 이유가 의문이었습니다.
4. 결론
이 포스팅을 통해 Express-async-errors와 Promise Rejection Error를 처리하는 방법에 대해 알아보았습니다. 실제 배포 환경에서 발생할 수 있는 예기치 못한 에러를 처리하는 방법은 매우 중요한것 같습니다.
오류처리가 정상적으로 되서 status 404 메세지를 받은것을 볼 수 있습니다.