고양이와 코딩
[웹 풀사이클 데브코스 TIL] 9주차 Day 5 - JWT 예외처리, 에러 본문
지금까지는 예외처리를 if/else.. if/else...ifelseifelse를 사용해서 처리해 왔는데요 ㅎㅎ
try/catch vs if/else
const generateToken = (user) => {
const token = jwt.sign({ userId: user.id }, secretKey, { expiresIn: '1h' });
if (!token) {
// 토큰 발급 실패 처리
return res.status(500).json({ error: 'Failed to generate token' });
}
// 토큰 발급 성공 처리
return res.status(200).json({ token });
};
if/else 문을 사용해서 토큰 발급 처리를 한다면,
- 토큰 발급이 성공했을 때와 실패했을 때의 처리를 나누는 것이 번거로움
- 예외 처리 로직이 더 복잡한 상황에서 가독성 저하
위 내용을 try/catch로 작성한다면
const generateToken = (user) => {
try {
const token = jwt.sign({ userId: user.id }, secretKey, { expiresIn: '1h' });
return res.status(200).json({ token });
} catch (error) {
// 토큰 발급 실패 처리
return res.status(500).json({ error: 'Failed to generate token' });
}
};
- 토큰 발급 성공/실패 모두 간편하게 처리할 수 있음
- 코드 가독성 향상
🍀 try 구문의 코드를 실행하는 도중에 에러가 발생하면, try 코드를 멈추고, catch로 err와 함께 빠져나갑니다! 🍀
🍀 try 구문에서 어떤 에러가 발생해도, 우리가 오류1..오류2... 이렇게 분기 처리 해주던 것들이 알아서 catch에 잡힙니다!
( SyntaxError, TypeError)🍀
TokenExpiredError 및 JsonWebTokenError
TokenExpriedError
- 토큰의 유호 기간(ExpiresIn)이 만료되었을 때 발생
- 사용자의 인증이 만료되었음을 나타냄
try {
const decoded = jwt.verify(token, secretKey);
// 토큰이 유효한 경우의 로직
} catch (error) {
if (error.name === 'TokenExpiredError') {
// 토큰이 만료된 경우의 처리
return res.status(401).json({ error: 'Token has expired' });
}
// 기타 에러 처리
return res.status(500).json({ error: 'Internal Server Error' });
}
JsonWebTokenError
- 잘못된 토큰 형식, 서명 오류 등의 이유로 토큰이 유효하지 않을 때 발생.
- 사용자의 조작된 토큰을 나타냄
try {
const decoded = jwt.verify(token, secretKey);
// 토큰이 유효한 경우의 로직
} catch (error) {
if (error.name === 'JsonWebTokenError') {
// 토큰이 유효하지 않은 경우의 처리
return res.status(401).json({ error: 'Invalid token' });
}
// 기타 에러 처리
return res.status(500).json({ error: 'Internal Server Error' });
}
throw 연산자
throw 연산자는 예외 처리를 할때 아주 유용하게 사용됩니다!
일부러 예외를 생성해서 예외 상황을 명시할 수 있도록 도와줍니다 (*˙˘˙*)!
1. throw 연산자의 기본 구문
throw expression;
- expression은 throw할 값 또는 객체입니다.
- throw 문은 예외를 발생시키고 현재 함수의 실행을 중단합니다.
2. throw의 활용
`try/catch` 문과 함께 throw를 사용한 예시를 들어보겠습니다
const checkPositiveNumber = (num) => {
try {
if(num <= 0){
throw new Error("입력된 숫자는 양수여야 합니다.");
}
console.log("양수 확인 완료!)";
} catch (err) {
console.log("에러 발생 : " + err.message);
}
}
위 코드의 try 블록 내에서 if문의 조건이 만족되면 throw new Error(...) 구문을 사용하여 새로운 에러를 발생시킵니다
그리고 'catch' 블록에서 해당 에러를 잡아서 처리합니다 !
또 `throw`문을 사용하여 에러를 생성할 때, Javascript에서는 `Error` 객체를 생성하게 됩니다.
이 Error 객체는 `name` 과 `message` 프로퍼티를 가지고 있기 때문에,
`err.name, err.message`를 자동으로 출력 해 줄 수 있습니다! (에러 객체를 따로 지정하지 않는다면 기본 이름은 'Error' 입니다)
따라서 위 코드에서 err.name은 Error 이며, err.message는 "입력된 숫자는 양수여야 합니다." 입니다!
지금까지 node로 백엔드를 해 본 결과 ,, 반복해서 작업하면 잘 이해가 안될지언정 머리속에 내용이 쏙쏙 들어오고
한번 API 구성하고 말면 금세 잊게 되더라구요 (당연함)
그와중에 API 명세, workbench, postman을 왔다 갔다 하면서 작성하니까 혼란스럽긴 하지만!!!
복습방학을 활용해서 다시 잘 복습하고 ㅎㅎ 스프린트2도 잘 마무리 해야겠다는 생각이 들었습니다!
시험을 잘 못봐도 좌절하지 않기 ~~ 꾸준히 지금처럼 하는것이 중요 !
'데브코스 TIL' 카테고리의 다른 글
[웹 풀사이클 데브코스 TIL] 15주차 Day 3 - 리액트 폴더구조와 TSC, global style (0) | 2024.02.21 |
---|---|
[웹 풀사이클 데브코스 TIL] 12주차 Day 2 - 타입스크립트의 다양한 타입(유니온타입, 타입 별칭, 타입 가드 ...) (0) | 2024.01.30 |
[웹 풀사이클 데브코스 TIL] 9주차 Day 4 - conn.query, MySQL 데이터 삭제 (0) | 2024.01.12 |
[웹 풀사이클 데브코스 TIL] 9주차 Day 3 - 비동기 처리 방법 (1) | 2024.01.10 |
[웹 풀사이클 데브코스 TIL] 9주차 Day 2 - 주문하기 flow 정리 (1) | 2024.01.09 |