[9주차 05] 에러처리

개발냥이·2025년 3월 21일

데브코스

목록 보기
30/75
post-thumbnail

장바구니 API에 로그인한 사용자 정보를 토큰을 이용해 가져와
사용하는 과정에서 오류가 발생했다.

[전체 코드]

const getCart = (req, res) => {
  const {seleted} = req.body;

  let loginUserID = ensureAuthrizaion(req, res);

  let sql = `
      SELECT cartItems.id, cart_book_id, title, summary, quantity, price 
      FROM cartItems LEFT JOIN books 
      ON cartItems.cart_book_id = books.id
      WHERE cart_user_id = ? 
      AND  cartItems.id IN(?)`;

  conn.query(
    sql,
    [loginUserID.id, seleted],

    (err, result) => {
      if (err) {
        return res.status(StatusCodes.BAD_REQUEST).end();
      }

      return res.status(StatusCodes.OK).json(result);
    },
  );
};


function ensureAuthrozaion(req, res) {
 
    let receivedJWT = req.headers['authorization'];
    let decodedJWT = jwt.verify(receivedJWT, `${process.env.PRIVATE_KEY}`);

    return decodedJWT;
}

전체 코드는 이러하다.


1. 토큰이 만료되었을 때

가장 먼저 토큰이 완료된 TokenExpiredError 오류이다.

토큰이 완료되면 개발자인 우리는 무슨 오류인지 알 수 있지만
웹을 사용하는 사용자나 프론트 엔드 개발자는 무슨 오류인지도
모르고 서버가 죽어버리게 된다.

그렇기 때문에 사용되는 게 try~catch 문이다.
성공적으로 작업이 실행되면 try , 실패시 catch를 사용하면 된다.

function ensureAuthrozaion(req, res) {
  try {
    let receivedJWT = req.headers['authorization'];
    let decodedJWT = jwt.verify(receivedJWT, `${process.env.PRIVATE_KEY}`);

    return decodedJWT;
  } catch (e) {
    console.log(e);

    return res.status(StatusCodes.UNAUTHORIZED).json({
      message: '로그인 세센이 완료. 다시 로그인 필요',
    });
  }
}

이처럼 try~catch문을 사용해서 서버도 죽이지 않고
효율적으로 오류 메시지를 전달할 수 있게 되었다.


요청을 2번 보냈을 때

위의 오류는 해결되었지만 또다른 오류가 발생했다.
바로 JsonWebTokenError 오류인 요청을 2번 보냈을 때이다.

위의 전체 코드를 살펴보면 알겠지만
API를 실행하는 query문에서 한번, Authrozaion를 검증하는 함수에서 한번
총 2번 요청을 보내고 있어서 오류가 발생했다

이 오류는 당연하겠지만 요청을 한번만 보내서 해결하면 된다

function ensureAuthrizaion(req, res) {
  try {
    let receivedJWT = req.headers['authorization'];
    let decodedJWT = jwt.verify(receivedJWT, `${process.env.PRIVATE_KEY}`);

    return decodedJWT;
  } catch (e) {
    console.log(e);

    return e;
  }
}

Authrozaion 검증하는 함수에 요청을 없앤 후

const addCart = (req, res) => {
  const {cart_book_id, quantity} = req.body;

  let loginUserID = ensureAuthrizaion(req, res);

  if (ensureAuthrizaion instanceof jwt.TokenExpiredError) {
    return res.status(StatusCodes.UNAUTHORIZED).json({
      message: '로그인 세센이 완료. 다시 로그인 필요',
    });
  }  else {
   // 성공적 실행 쿼리문
  }
};

API 실행 코드를 if~else문으로 감싸서 오류가 나면
오류 메시지 요청 , 오류가 나지 않으면 정상적인 쿼리 실행이 되도록 했다.


🤔후기

정말 개발을 하다보면 예상치 못한 오류가 많이 발생하는 거 같다.
그동안 try~catch문을 사용하긴 했으나 그냥 예외 처리를 해주는 문법이라고만 알고 있었지
정확하게는 몰랐는데 이번 강의로 정확하게 알 수 있었다.

profile
웹 개발자가 되고픈

0개의 댓글