[JavaScript/node.js] Express.js Error Handling - 1

박상원·2022년 4월 24일
0

node

목록 보기
1/3
post-thumbnail

많은 백엔드플랫폼이 빠르게 개발하기 편한이유로 Node.JS가 채택되어 빠른 개발이 이루어지지만 코드레벨 아키텍처가 유지보수가 어렵게 개발되는 코드들이 다수일 거라 생각합니다. Router, Service 레벨의 개발은 누구나 하지만 쉽게 잊는 부분이 Error Handling 입니다. 단순히 조건에서 throw new Error 를 던지긴 하는데, 그 뒤엔 뭘 할지 모르겠고.. 그냥 로그수준의 에러핸들링은 커져가는 서비스에서 적합하지 않습니다.

작은 수준의 토이프로젝트 서버같은경우에서 사용하면 좋겠지만 용도로서 급한 문제는 아닙니다. 하지만 기능을 추가할 수록 어느곳에서 어떤 에러가 발생하느냐, 클라이언트에서 고객메세지를 어떻게 보여줄 것이냐는 정의된 에러없이는 하드코딩수준에서 보여주어야 할 것입니다.

그런 하드코딩들로 구현이 된다면, 분명 한번쯤은 뒤 엎을 시간이 오곤합니다. 분명 에러핸들러를 만들어둔다면, 중복메세지도 없고, 어떤 에러코드들을 사용하고 있고 클라이언트와의 커뮤니케이션은 더 쉬워질 것이고, API를 정리하는 과정에서도 편리한 이점을 줄 것입니다.

node에서 에러 핸들링을 알아가기 전, JavaScript Error 에 대해 알아보겠습니다.

우선 Error() 라는 객체가 있습니다.

이 생성자로부터 new Error() 를 생성할 수 있습니다.

이 객체는 아래와 같은 프로토타입 프로퍼티를 가지고 있습니다.

Error.prototype.${property} 
* message : 에러메세지
* name : 에러 이름
* fileName : 오류를 발생시킨 파일 경로
* lineNumber : 오류를 발생시킨 라인
* stack : 스택 정보

static method
* Error.captureStackTrace() : 인스턴스 스택을 만드는 함수
에러를 발생시키는 방법은 try-catch와 throw 를 같이 사용합니다. 가장 기본적으로 Error 객체를 발생시키는 방법입니다. 
function throwErrorFunc () {
   try {
      ... 
      throw new Error('what???');
   } catch (error) {
      console.log(error.message);
   }
}

특정 함수 내에서 try-catch로 잡아내게 됩니다. 이렇게 생성된 인스턴스 에러에서는 위에서 나열했던 속성과 함수를 사용하여 재생성 할 수 있습니다. message, name, stack들을 조합하여 원하는 메세지 포멧을 구현할 수 있게 됩니다.

Error를 생성할 때, 매개변수로 message를 할당할 수 있습니다. 기본적으로

Error(message[, options]);
생성자로 Error에 메세지를 할당하면, error.message 를 통해 message를 호출할 수 있습니다.

Error 외에도 EvalError, ReferenceError, SyntaxError 등 여러 오류생성자가 있으며, 이들은 instanceOf로 부터 구분을 할 수 있어 에러를 핸들링하기에 좋습니다.

try {
  ... 
} catch (e) {
  if (e instanceof EvalError) {
    console.error(e.message);
  } else if (e instanceof SyntaxError) {
    console.error(e.message);
  }
}

하지만 한정적인 문제로 커져가는 우리의 서비스를 커버하기엔 부족하고 유연하지 못할 것입니다. Express.JS에서 ORM을 사용하기위해 Sequelize를 사용하는데 SQL Error 가 발생했을때도, SequelizeDatabaseError 라는 Javascript의 Error에서 제공하지 않는 에러가 발생하니 말이죠. 이렇기 때문에 우리는 클라이언트와 일종의 컨벤션을 유지하여 에러메세지를 컨트롤하기 위한 Error를 커스텀화 하여 우리만의 핸들링을 구한하는게 목표입니다.

다음 글에서는 Custom Error를 구현하겠습니다.

profile
BE Dev

0개의 댓글