[Day97] NodeJS - 에러 핸들링 - 1 (Error Handling)

Validator·2023년 11월 6일

Express와 에러 핸들링

Express는 Node.js를 위한 가장 인기 있는 웹 프레임워크 중 하나로, 웹 애플리케이션의 라우팅, 요청 처리, 에러 핸들링 등을 단순화한다.

1. 에러 핸들링이란?

에러 핸들링은 소프트웨어 개발의 필수적인 부분이며, 프로그램이 예기치 못한 상황에 대처하는 방법을 정의한다. 이는 프로그램의 안정성과 신뢰성을 향상시키는 데 중요하다. 에러 핸들링을 통해 개발자는 다음과 같은 목표를 달성할 수 있다.

  • 안정성: 예외 상황에서도 시스템이 중단되지 않고 계속 작동한다.
  • 사용자 경험: 사용자에게 의미 있는 에러 메시지를 제공하여 혼란을 최소화한다.
  • 디버깅 용이성: 에러의 원인을 쉽게 추적하여 빠른 문제 해결이 가능하다.
  • 보안: 예기치 않은 에러가 시스템의 취약점을 드러내지 않도록 한다.

2. Express에서의 에러 핸들링

Express에서 에러 핸들링은 미들웨어를 통해 수행된다. 미들웨어는 요청-응답 주기의 중간에서 특정 작업을 수행하는 함수이다. Express는 기본적으로 다음과 같은 에러 핸들링 메커니즘을 제공한다:

  • 내장 에러 핸들러: Express에는 기본적인 에러 핸들링 기능이 포함되어 있다. 이는 개발 중 발생할 수 있는 일반적인 문제들을 처리한다.
  • 사용자 정의 에러 핸들러: 개발자는 자신의 애플리케이션에 특화된 에러 핸들링 로직을 구현할 수 있다.

3. 에러 핸들링 미들웨어 구현

Express에서 사용자 정의 에러 핸들링 미들웨어를 구현하는 것은 간단하다. 기본적으로 이러한 미들웨어는 네 개의 인자를 받는다: err, req, res, next. 여기서 err는 발생한 에러 객체, req는 HTTP 요청 객체, res는 HTTP 응답 객체, next는 미들웨어 체인에서 다음 미들웨어 함수를 호출하는 함수이다.

에러 핸들링 미들웨어 예시:

app.use((err, req, res, next) => {
  console.error(err.stack); // 에러 로깅
  res.status(500).send('Something broke!'); // 사용자에게 에러 메시지 전송
});

4. 특정 HTML 페이지로의 에러 응답

일반적으로 웹사이트에서 오류 발생 시 특정한 HTML 페이지를 띄우는 것은 좋은 관행이다. 이는 사용자에게 더 친숙하고 이해하기 쉬운 인터페이스를 제공한다. 이를 위해 에러 핸들링 미들웨어에서 HTML 파일을 응답으로 보낼 수 있다. ( 실제 프로젝트에서 구현하였더니 매우 좋았었다)

app.use((err, req, res, next) => {
  console.error(err.stack); // 에러 로깅
  res.status(500).sendFile('/path/to/error.html'); // 특정 에러 페이지 전송
});

이렇게 하면, 서버 측에서 발생하는 모든 에러에 대해 사용자에게 특정 HTML 페이지를 보여줄 수 있다.

5. 실제 현업에서의 에러 처리 방법

실제 서비스에서는 일반적으로 사용자 경험을 최대한 존중하면서도, 시스템의 안정성과 보안을 유지하기 위해 복잡한 에러 핸들링 시스템을 구축한다. 이러한 회사들은 사용자에게 친숙하고 안내가 잘되어 있는 에러 페이지를 제공하는 동시에, 백엔드에서 에러 로깅, 모니터링, 알림 시스템을 통해 신속하게 문제를 감지하고 대응한다.

6. 실제 프로젝트에서의 적용

실제 프로젝트에서 에러 핸들링을 구현할 때는 다음과 같은 사항을 고려해야 한다:

  1. 에러 유형별 처리: 서버 오류(500대 에러), 클라이언트 오류(400대 에러) 등 에러 유형에 따라 다른 응답을 구성한다.
  2. 사용자 친화적인 메시지: 기술적인 에러 메시지 대신, 사용자가 이해할 수 있는 메시지를 제공한다.
  3. 보안 고려: 에러 상세 정보를 사용자에게 공개하지 않는다. 예를 들어, 데이터베이스 오류의 세부 정보는 로그에만 남기고 사용자에게는 일반적인 메시지를 보낸다.
  4. 로깅과 모니터링: 에러 로깅을 통해 개발자가 문제를 신속하게 해결할 수 있도록 한다.

0개의 댓글