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

박상원·2022년 4월 24일
0

node

목록 보기
2/3
post-thumbnail

커스텀 에러는 커져가는 서비스에서 중요한 관리방법으로 볼 수 있습니다. JavaScript 에서 제공해주는 에러만으로 우리의 서비스를 커버하기엔 너무 부족하고, 여러 노드 모듈에도 한정적입니다. 이런 에러를 포괄적이고 다양하게 핸들링하기 위해선 노드 어플리케이션만의 에러를 사용하여 클라이언트와 규칙을 만들고 핸들링하여 오류에 대응하는게 가장 좋습니다.

커스텀 에러는 말 그대로, 제작된 오류입니다. 이전 글에서 JavaScript Node.js 에서 Error 객체를 사용할 수 있었습니다. 이 에러를 상속하여 커스텀 에러로 만드는 것이 이번 글의 목표입니다.

자바스크립트에서는 extends 로 클래스를 상속할 수 있습니다. 객체지향의 특징이기도 하니, 자바스크립트도 같은 특징을 가집니다.


class my_error extends Error {
    ...
}

왜 커스텀 에러가 필요할까요? 커스텀 에러가없을 때는 Error 객체만의 오류를 컨트롤해야합니다.

자바스크립트 Error 객체 생성자 표준을 보겠습니다.

new Error()
new Error(message)
new Error(message, fileName)
new Error(message, fileName, lineNumber)

자바스크립트에서 Error는 위처럼 생성자를 이용해서 생성합니다. 아래 두가지 fileName, lineNumber는 비표준 문법입니다. 가장 기본적인 Error(message)를 사용할텐데 이렇게된다면 메세지만으로 컨트롤해야하는 경우가 발생하고, Error() 외에 EvalError 같은 정의된 오류만 사용할 수 있습니다. 그렇게 된다면 Node Express를 사용할 때, 클라이언트와 통신으로 에러핸들링을 하기에 매우 제한적이고 불편함이 존재할 것입니다. 뿐만아니라 커스텀 에러를 통해 매우 직관적인 오류를 생성하여 Network, Database, Validation... 등 여러 오류객체를 분류할 수 있고 Status Code 의 분류도 굉장히 편리해집니다. 어느 노드모듈을 추가할때 그 모듈의 오류를 컨트롤하기위해 커스텀에러를 추가할 수도 있기 때문에 Error만 사용하는 것보다, 커스텀에러로 지정하는 편이 서비스를 유지보수하는데 매우 효율적입니다.

커스텀 에러를 생성하느 방식은 위에서 보여드렸습니다. 간단하게 Error객체를 상속받아 범용적으로 만들것입니다. 상속하게 된다면 instanceof Error 등 오류를 쉽게 식별할 수 있게됩니다.

이제 간단한 상속된 커스텀오류를 생성해보겠습니다.

class BaseError extends Error {
    constructor(message) {
        super(message);
        this.name = 'BaseError';
    }
}

Error 는 이제 BaseError 라는 이름의 자식클래스가 생성됐습니다. 이 클래스는 생성될때 메세지를 받게됩니다.

super()로 부모클래스인 Error에 message를 생성합니다. 하지만 차이가 있다면 이 클래스의 이름은 Error이 아닌 BaseError가 됩니다.

이 BaseError 에러에서 여러 파생될 커스텀 에러를 생성할 수 있습니다. 기본적인 Error 에서 모두 파생시킬 수 있지만 굳이 BaseError 로 매핑을 하는 이유는 instanceof 를 사용하여 다른 기본 Error, EvalError등으로부터 구분하여 파생된 에러를 한꺼번에 컨트롤하기 위함입니다.

if (instanceof BaseError) {
    // 커스텀 에러 핸들링
} else if (instanceof SyntaxError) {
   ...
} else if (instanceof TypeError) {
   ...
}
Error -> BaseError -> ServiceCustomError

이런 구조로 에러를 생성하여 보다 자세한 서비스커스텀에러를 구현하여 가독성과 유지보수에 도움을 줄 수 있습니다. 서비스 커스텀에러를 더 자세하게 구현해보겠습니다.

class ServiceError extends BaseError {
  constructor(error, message) {
    super(message);

    this.name = 'ServiceError';
    this.code = error;
  }
}

이 서비스에러에는 몇가지가 변합니다. 해당 클래스에 code라는 프로퍼티가 추가 됐습니다. 이 코드로부터 우리는 서비스 에러 코드 목록을 가져갈 것입니다. 오류코드는 정말 클라이언트와 서비스간에 사용되는 코드로 기존 HTTP StatusCode와 별개로 생각하시면 됩니다. 100, 1001, 10001 등 규칙성을 지키며 프론트엔드 개발자와 공유를 할 수 있으면 됩니다.

또다른 에러를 구현해보겠습니다.

class AuthenticationError extends BaseError {
  constructor(error, message) {
    super(message);

    this.name = 'AuthenticationError';
    this.code = error;
    this.status = 301;
  }
}

이번엔 특정 status만 관리해야하는 경우 위같은 에러를 구현할 수 있습니다. 이 인증에러는 오류 실패시 무조건 301이라는 상태 코드를 리턴하기위함입니다. 정의할때부터 301을 넣어서 어떤 상황에서도 301이 반환되는 구조가 됩니다.

이런 방식으로 개발자와 팀에 맞는 에러를 핸들링할수 있게 됩니다. 커스텀에러 내부에서는 어떤 객체나 프로퍼티가 와도 규칙만 정확하다면 가능한것이 커스텀에러의 최고 장점이라고 생각합니다. 또한 모듈내에서 발생되는 에러도 커스텀에러로 잡아 재생성하여 우리가 알아볼 수 있는 오류로 컨트롤 할 수 있습니다.

다음은 Node Express.js의 에러핸들링에 대해 알아보겠습니다.

profile
BE Dev

0개의 댓글