하나의 라이브러리로 Express.js 에러 처리 표준화
Source: Dev.to

만약 Express.js를 오래 사용해 왔다면, 그 고충을 잘 알 것입니다. 프로젝트를 시작하면 곧 컨트롤러가 다음과 같이 보이게 됩니다:
// The "Bad" Way
app.post('/users', async (req, res) => {
try {
// ... logic
} catch (error) {
console.error(error);
if (error.code === 'P2002') { // Prisma unique constraint
return res.status(400).json({ message: 'User already exists' });
}
// ... 10 more if/else checks
res.status(500).json({ message: 'Something went wrong' });
}
});
코드가 반복되고 유지보수가 힘들며 버그가 생기기 쉽습니다. 프로젝트마다 오류 처리 로직을 복사‑붙여넣는 데 지쳐서, 한 번에 해결할 수 있는 도구를 만들었습니다.
ds-express-errors 를 만나보세요.
What is it?
ds-express-errors는 Node.js와 Express용 중앙 집중식, 타입‑안전 오류 처리 라이브러리입니다. 수동 try‑catch 블록과 상태 코드 관리를 깔끔하고 선언적인 API로 대체합니다.
Ready‑to‑use Presets 🛠️
“Forbidden”이 401인지 403인지 기억할 필요가 없습니다. 프리셋만 사용하면 됩니다.
import { Errors } from 'ds-express-errors';
if (!user) {
throw Errors.NotFound('User not found'); // 자동으로 404 반환
}
if (!user.hasAccess) {
throw Errors.Forbidden('Access denied'); // 자동으로 403 반환
}
Auto‑Mapping (The Magic 🪄)
Zod, Prisma, Mongoose 등을 사용한다면, 라이브러리가 해당 네이티브 오류를 자동으로 감지해 읽기 쉬운 HTTP 400 Bad Request로 변환합니다.
Zod 예시
입력 (잘못된 경우)
{ "email": "invalid-email" }
출력 (자동 변환)
{
"status": "fail",
"method": "GET",
"url": "/login",
"message": "Validation error: email: Invalid email",
"stack": "..." // NODE_ENV=development 일 때 표시
}
No More try/catch
포함된 asyncHandler를 사용하면 컨트롤러가 다시 깔끔해집니다.
import { asyncHandler, Errors } from 'ds-express-errors';
const createUser = asyncHandler(async (req, res) => {
const user = await db.create(req.body); // 이곳에서 발생하는 예외는 자동으로 처리됩니다!
res.json(user);
});
Graceful Shutdown 🛑
프로세스 수준 오류(uncaughtException, unhandledRejection)도 처리하고, 크래시 전에 데이터베이스 연결을 정상적으로 종료할 수 있게 도와줍니다.
import { initGlobalHandlers } from 'ds-express-errors';
initGlobalHandlers({
onCrash: () => {
db.disconnect();
server.close();
}
});
📦 How to use it?
설치는 일반적인 방법으로 진행합니다:
npm install ds-express-errors
📚 Documentation
고급 사용법, API 레퍼런스, 추가 예시 등을 포함한 전체 문서 사이트가 제공됩니다:
Conclusion
이 라이브러리를 만들면서 백엔드 프로젝트를 표준화할 수 있었고, 여러분에게도 도움이 되길 바랍니다. 완전 타입 지원(TypeScript), 가벼운 무게, 프로덕션 준비가 완료되었습니다.
한 번 사용해 보시고 의견을 알려 주세요! **GitHub 저장소**에 별을 주시거나 피드백을 남겨 주시면 정말 감사하겠습니다. ❤️