- 벡엔드 코드리뷰 후 리팩토링 진행
- 문제 내용 : Express 라우트는 Async 메소드의 에러를 감지하지 못한다는 점
- async 메소드가 아닌 경우 Error가 발생하면 express의 에러 핸들러에서 처리된다.
- 하지만 async 메소드의 경우 UnhandledPromiseRejectionWarning과 오류와 함께 나중에는 이 경우엔 앱이 종료될 수 있다는 경고를 출력하게 된다.
- 문제 해결 과정 :
- async 메소드에서 에러가 발생하면 try-catch 안에서 next 메소드에 에러 객체를 전달해 express에선 처리할 수는 있었습니다.
- 그러나 이 경우 async-awiat를 라우트 내부에서 사용할 때 마다 사용해야하는 중복 문제가 생겼습니다.
- 문제를 해결 한 방식
- 따라서 불필요하면서 반복적인 에러 핸들링 코드를 줄이기 위해서 async-await를 대신 수행해주는 래퍼 함수를 생성했습니다.
- try-catch를 이용해 상위 래퍼 함수에서 에러 핸들링을 해주기 때문에 모든 메소드에 반복하여 사용됐던 try-catch 역시 줄일 수 있었습니다.
- 이후 next로 전달된 모든 에러는 전역에서 잡을 수 있도록 전역 에러 핸들러를 app.use에 미들웨어로서 전달하여 불필요한 에러 핸들링을 위한 코드들을 줄이고 보다 깔끔하게 코드를 수정할 수 있게 되었습니다.
- 공통적으로 다뤄지는 에러들을 항상 일일이 처리해야하는 번거로움을 해결하는 방식에 대해서
<script> // node.js 에러 미들웨어에 공통적으로 들어가는 코드들 app.use((err, req, res, next) => { const { statusCode, message } = err; console.error(err); res.status(statusCode || 500).send(message); }); </script>
- 에러를 다루는 클래스를 생성하여 에러를 처리하는 모듈, api와 handler🔑 만들어서 활용하기
- 수정된 코드
<script> // 다양한 에러 코드와 메세지를 담은 에러 메서드 class apiError { constructor(code, msg) { (this.code = code), (this.msg = msg); } static badRequest(msg) { return new apiError(400, msg); } static keyError(msg) { return new apiError(400, msg); } static notFoundError(msg) { return new apiError(404, msg); } static internalError(msg) { return new apiError(500, msg); } } module.exports = apiError; // obj instanceof Class - 객체가 특정 클래스에 속하는지 아닌지를 확인 import apiError from './apiError'; function apiErrorHandler(err, req, res, next) { // apiError 클래스에 객체가 존재하다면 해당되는 코드와 에러 메세지 json 형태로 응답 if (err instanceof apiError) { res.status(err.code).json(err.msg); return; } res.status(500).json('something went wrong'); } module.exports = apiErrorHandler; </script>
- 에러를 효과적으로 처리할 수 있는 방식에 대해서
- 에러를 처리하기 위해 wrapper함수나 error 객체를 상속받은 apiError 등을 만는 방식에 대해서
- 저녁에 회고록을 작성한 점 2. 집에 도착하자마자 앉아서 코드친 것
- 프로젝트 기간에 너무 마음을 편하게 가진 점에 대해서 반성, 사실 힘들고 어려운 게 당연한 거고 그래봤자 1달이니 좀만 고생하자. 파이팅.
- 벡엔드 리팩토링 마치기 => 지적받은 내용은 다 반영하고 자기
- 인가 과정 공부하고 로그인 후 인가 미들웨어 붙여서 구현해보기
- 재준님께 질문할 내용(인가-세션, 토큰, 쿠기) 정리하기