📝Day 82 (56)일차 WE_MOTIVATION_DIARY

김민재·2021년 10월 12일
1

빡코딩 다이어리

목록 보기
79/87
post-thumbnail

- 프로젝트 진행현황

  • 벡엔드 코드리뷰 후 리팩토링 진행

HOW TO FIX MY PROBLEM 🦠

  1. 문제 내용 : Express 라우트는 Async 메소드의 에러를 감지하지 못한다는 점
  • async 메소드가 아닌 경우 Error가 발생하면 express의 에러 핸들러에서 처리된다.
  • 하지만 async 메소드의 경우 UnhandledPromiseRejectionWarning과 오류와 함께 나중에는 이 경우엔 앱이 종료될 수 있다는 경고를 출력하게 된다.

HOW TO FIX MY PROBLEM 💊

  1. 문제 해결 과정 :
  • async 메소드에서 에러가 발생하면 try-catch 안에서 next 메소드에 에러 객체를 전달해 express에선 처리할 수는 있었습니다.
  • 그러나 이 경우 async-awiat를 라우트 내부에서 사용할 때 마다 사용해야하는 중복 문제가 생겼습니다.
  1. 문제를 해결 한 방식
  • 따라서 불필요하면서 반복적인 에러 핸들링 코드를 줄이기 위해서 async-await를 대신 수행해주는 래퍼 함수를 생성했습니다.
  • try-catch를 이용해 상위 래퍼 함수에서 에러 핸들링을 해주기 때문에 모든 메소드에 반복하여 사용됐던 try-catch 역시 줄일 수 있었습니다.
  • 이후 next로 전달된 모든 에러는 전역에서 잡을 수 있도록 전역 에러 핸들러를 app.use에 미들웨어로서 전달하여 불필요한 에러 핸들링을 위한 코드들을 줄이고 보다 깔끔하게 코드를 수정할 수 있게 되었습니다.

3_1. utils 폴더 내 catchAsync 폴더 생성 후 catchAsync 함수 정의

3_2. Router에 래퍼함수로 가장 상위에 있는 controller를 감싸서 전달한다.

3_3. app.js에서 던져진 에러를 전역에서 핸들링할 수 있는 미들웨어, erroerHandle를 app.use에 전달하여 에러를 전역에서 잡는다.

- TODAY I LEARN ERROR 🦠

  • 공통적으로 다뤄지는 에러들을 항상 일일이 처리해야하는 번거로움을 해결하는 방식에 대해서
<script>
// node.js 에러 미들웨어에  공통적으로 들어가는 코드들
app.use((err, req, res, next) => {
  const { statusCode, message } = err;
  console.error(err);
  res.status(statusCode || 500).send(message);
});
</script>

- HOW TO FIX MY ERROR 💊

  • 에러를 다루는 클래스를 생성하여 에러를 처리하는 모듈, 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 등을 만는 방식에 대해서

- 잘한 점과 개선할 점

    1. 저녁에 회고록을 작성한 점 2. 집에 도착하자마자 앉아서 코드친 것
  • 프로젝트 기간에 너무 마음을 편하게 가진 점에 대해서 반성, 사실 힘들고 어려운 게 당연한 거고 그래봤자 1달이니 좀만 고생하자. 파이팅.

- 목표와 마감기한: 2021-10-13

  1. 벡엔드 리팩토링 마치기 => 지적받은 내용은 다 반영하고 자기
  2. 인가 과정 공부하고 로그인 후 인가 미들웨어 붙여서 구현해보기
  3. 재준님께 질문할 내용(인가-세션, 토큰, 쿠기) 정리하기
profile
자기 신뢰의 힘을 믿고 실천하는 개발자가 되고자합니다.

0개의 댓글