회사를 다니면서 계속 노드 서버를 만들어오신 동료분께서 잘 만들어 놓으신 에러 객체를 응용하면서
계속 분석해서 쓸 필요가 있다고 생각해 분석을 해보려 한다.
노드의 에러 객체를 상속 받아 에러를 만들어서 쓰게 되면
각종 에러에 대해서 개별적 처리가 가능하다.(데이터 베이스인지.. 암복호화, 파라미터 유효성 에러 등..)
이미 각종 오픈 소스들은 이렇게 쓰고 있다!
에러 리포트를 하는 시스템을 구축할 때에도 꼼꼼하게 파악해 놓으면 좋을 듯 싶다.
꾸준히 정리해서 올려 놓으려 한다.
기본적으로 에러 객체를 상속받아 작성하는 건 이런 식으로 작성하면 된다.
class CustomException extends Error{
constructor(errorname){
super(errorname);
}
}
상속 받은 에러에 대해서 super를 이용해 생성자 호출을 하게 되면 인수로 들어간 string은 해당 에러의 message 로 할당되게 된다.
기본적인 에러 객체의 구조는 이러하다.
class Error {
constructor(message) {
this.message = message;
this.name = "Error";
this.stack = <call stack>;
}
}
name, message, stack 이렇게 세 가지의 프로퍼티.
기본적으로 거의 대부분의 라이브러리에서 만들어내는 에러들은 stack은 없을 때도 간혹 있지만 거의 있고...(에러를 콘솔에 출력 했을 때 구구절절 뜨는 부분..) name은 없는 것을 못 본 것 같다.
여기에 추가로 개발자가 커스텀으로 에러 객체에 대해서 여러 속성들을 만들어 줄 수도 있다.
정확하게 이렇다! 하는 건 아닌데 난 이렇게 정의하고 있다.
class Error {
constructor(message, ...params) {
this.message = message;
this.name = "Error";
this.stack = <call stack>;
// ==== 새로운 정의
this.errorCode = 0;
this.params = {
...params
}
}
}
꼭 이렇다는 건 아니고... 에러 코드를 넣거나, 에러를 발생시킨 파라미터가 있다면 에러 객체에 넣고. 공통 에러 핸들러에서 로그로 출력하게 한다.
그래서 커스텀 에러를 만들 때에 이런 기본적인 속성을 오버라이딩 하여 사용하면 좀 더 꼼꼼하게 핸들링이 가능하다.
에러 사용법
1. next(err)로 에러 핸들러로 보내거나
2. try{}catch(err){} 의 에러 처리 단에서
if(err instanceOf customException){
//handle error
}
instanceOf를 이용해서 처리하면 된다.
에러 핸들러 미들웨어를 만드려면..
Node의 미들웨어는 순차적으로 적용된다. (비동기 함수 제외)
또한 미들웨어 정의시 기본적으로 req, res, next의 세 개의 파라미터를 가지지만, 에러를 핸들링하는 미들웨어는 4개의 파라미터를 가진다.
var bodyParser = require('body-parser');
var methodOverride = require('method-override');
app.use(bodyParser());
app.use(methodOverride());
app.use(function(err, req, res, next) {
// logic
});
그래서 네 개의 파라미터를 갖는 핸들링 미들웨어를 마지막에 두도록 처리해두면, next(param)으로 넘어온 에러 객체에 대해서 해당 에러 핸들러에서 처리가 가능하다.
(익스프레스는 next의 파라미터로 넘어오면 에러가 있다고 가정한다. )
에러 핸들러는 미들웨어 스택의 가장 마지막에 두면 된다.
난 바로 next로 넘기는 것 보단, 비즈니스 로직은 최대한 함수내에서 처리 후 커스텀한 익셉션을 발생시키고, 라우트의 try catch의 catch에서 next로 전부를 해결하는 방식으로 역할을 분리하고 있는데.. 더 좋은 방법을 찾고 있다.
기본적인 출처는 Express 홈페이지 (https://expressjs.com/ko/guide/error-handling.html)
회사에선 Sentry란 에러 리포팅 서비스를 이용해 에러를 트래킹 하는데, 에러 객체의 이름 및 스택 메세지 등을 가지고 출력해주는 듯 하다.
이에 대해서도 좀 더 파악 후에 포스팅을 해두어야 겠다.
'Back-end > Node.js' 카테고리의 다른 글
[Node.js] PM2 Clustering(클러스터링) 시 특정 instance 지칭하기 (0) | 2022.05.01 |
---|---|
Mocha 테스트 후, 테스팅 터미널 종료하기+ Mocha default timeout 시간 재설정 (0) | 2022.03.27 |
Sequelize 사용하기 (0) | 2021.10.18 |
multipart/form-data를 처리하는 패키지 비교 (1) | 2021.10.07 |
Node에서의 Module (0) | 2021.08.09 |