Express 오류 처리 및 예외 처리 가이드 (1부)
Express.js는 Node.js 환경에서 널리 사용되는 웹 애플리케이션 프레임워크입니다. 이 글에서는 Express 애플리케이션에서 발생할 수 있는 오류와 예외를 효율적으로 처리하는 방법을 알아보겠습니다.
1. 오류 처리의 중요성
애플리케이션이 성장함에 따라 다양한 오류 상황이 발생할 수 있습니다. 이러한 오류를 적절히 처리하지 않으면 사용자 경험이 저하되고, 보안 문제가 발생할 수 있습니다. 오류 처리는 애플리케이션의 안정성과 신뢰성을 보장하는 중요한 요소입니다.
2. 기본 오류 처리
Express에서는 기본적으로 다음과 같은 방법으로 오류를 처리할 수 있습니다.
const express = require('express');
const app = express();
app.get('/', (req, res) => {
throw new Error('Something went wrong!');
});
// 기본 오류 처리 미들웨어
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('Something broke!');
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
위 코드에서 app.use로 정의된 미들웨어는 모든 오류를 잡아 로그를 기록하고 사용자에게 500 상태 코드를 반환합니다.
Express 오류 처리 방법: 비동기 오류 처리 및 사용자 정의 오류 클래스 (2부)
이 글에서는 Express.js에서 발생하는 비동기 오류를 처리하는 방법과 사용자 정의 오류 클래스를 사용하는 방법을 자세히 설명합니다.
1. 비동기 오류 처리
비동기 코드를 사용할 때 발생하는 오류를 처리하는 것은 일반적인 동기 코드에서의 오류 처리보다 복잡할 수 있습니다. 하지만, Express는 next
함수를 사용하여 비동기 오류를 처리할 수 있도록 지원합니다.
비동기 오류 처리 예제
다음은 비동기 함수 내에서 발생하는 오류를 처리하는 예제입니다.
const express = require('express');
const app = express();
// 비동기 함수 예제
const someAsyncFunction = async () => {
// 일부 비동기 작업 수행
throw new Error('Async error!');
};
app.get('/async', async (req, res, next) => {
try {
const data = await someAsyncFunction();
res.send(data);
} catch (err) {
next(err);
}
});
// 오류 처리 미들웨어
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).send('Something broke!');
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
위 예제에서 someAsyncFunction 내에서 발생한 오류는 catch 블록을 통해 next 함수로 전달되어 미들웨어에서 처리됩니다. 이는 비동기 코드에서도 동기 코드와 일관된 방식으로 오류를 처리할 수 있게 해줍니다.
더 자세한 비동기 오류 처리의 정보는 아래 글에 포스팅했습니다. 더 쉽게 비동기 오류를 처리 할 수 있으니 해당 오류를 처음 접해본다면 읽고 오기를 추천드립니다.
https://johnny-developer-story.tistory.com/11
2. 사용자 정의 오류 클래스
특정 오류 상황을 보다 명확하게 처리하기 위해 사용자 정의 오류 클래스를 사용하는 것이 좋습니다. 이렇게 하면 오류의 유형과 상태 코드를 명확히 구분할 수 있습니다.
다음은 'NotFoundError'라는 사용자 정의 오류 클래스를 정의하고 사용하는 예제입니다.
class NotFoundError extends Error {
constructor(message) {
super(message);
this.name = 'NotFoundError';
this.statusCode = 404;
}
}
const express = require('express');
const app = express();
app.use((req, res, next) => {
next(new NotFoundError('Resource not found'));
});
app.use((err, req, res, next) => {
res.status(err.statusCode || 500).send(err.message);
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
위 코드에서는 NotFoundError 클래스를 정의하고, 특정 경로에서 이 오류를 발생시킵니다. 오류 처리 미들웨어에서는 오류 객체의 statusCode 속성을 사용하여 적절한 상태 코드를 반환합니다.
3. 여러 종류의 사용자 정의 오류 클래스
애플리케이션의 다양한 오류 상황을 처리하기 위해 여러 종류의 사용자 정의 오류 클래스를 정의할 수 있습니다.
예제: 여러 종류의 사용자 정의 오류 클래스
다음은 BadRequestError, UnauthorizedError, ForbiddenError 등의 사용자 정의 오류 클래스를 정의하고 사용하는 예제입니다.
class BadRequestError extends Error {
constructor(message) {
super(message);
this.name = 'BadRequestError';
this.statusCode = 400;
}
}
class UnauthorizedError extends Error {
constructor(message) {
super(message);
this.name = 'UnauthorizedError';
this.statusCode = 401;
}
}
class ForbiddenError extends Error {
constructor(message) {
super(message);
this.name = 'ForbiddenError';
this.statusCode = 403;
}
}
const express = require('express');
const app = express();
app.get('/bad-request', (req, res, next) => {
next(new BadRequestError('Bad request!'));
});
app.get('/unauthorized', (req, res, next) => {
next(new UnauthorizedError('Unauthorized!'));
});
app.get('/forbidden', (req, res, next) => {
next(new ForbiddenError('Forbidden!'));
});
app.use((err, req, res, next) => {
res.status(err.statusCode || 500).send(err.message);
});
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
위 예제에서는 다양한 상황에 맞는 사용자 정의 오류 클래스를 정의하고, 각 경로에서 적절한 오류를 발생시킵니다. 이를 통해 오류의 유형을 명확히 하고, 일관된 방식으로 오류를 처리할 수 있습니다.
참고:
https://teamdable.github.io/techblog/express-error-handling
https://teamdable.github.io/techblog/express-error-handling)
https://velog.io/@ryudg_/Node.js-Express-Error-Handling
https://inpa.tistory.com/entry/JS-%F0%9F%93%9A-%EC%98%88%EC%99%B8-%EC%B2%98%EB%A6%AC
'서버 > Express' 카테고리의 다른 글
Express 오류 처리 방법: 완벽 가이드 (2) (0) | 2024.07.02 |
---|