백엔드
[백엔드]error 처리
ehddkDEV
2025. 1. 10. 15:39
기본적인 crud를 다 구현하고 Postman으로 테스트할때 만약 에러가 발생했을 시 어떠한 이유때문에 발생한건지
예외처리는 필수다. 안그러면 하나하나 로그를 다 찍으면서 계속 서치해야하기 때문이다.
나는 서비스 레이어에서 HttpException라는 커스텀 에러 클래스를 사용해 에러를 던져줬다.
async getUser(id: string): Promise<GetUserResponseDTO | null> {
const user = await this._userRepository.findById(id);
if (!user)
throw new HttpException(404, "해당 유저가 없습니다.");
const dtoUser = await new GetUserResponseDTO(user);
return dtoUser;
}
예를 들어, 유저 조회부분에서 해당 유저가 없으면 '해당 유저가 없습니다'라고 에러를 던져주는 것!
이때 HttpException을 보면
class HttpException extends Error {
cause: unknown;
constructor(
public statusCode: number = 500,
data:
| string
| {
message: string;
[key: string]: unknown;
}
) {
super(typeof data === "string" ? data : data.message);
this.statusCode = statusCode;
}
}
export default HttpException;
이렇게 되어있는데, super(data.message)는 Error 클래스의 생성자에 message 전달하는 것이다.
super은 부모 클래스의 생성자를 호출하는 키워드이므로, Error 클래스의 생성자를 호출하여 message 속성을 설정한다.
즉 서비스 레이어에서 에러를 throw를 해줌 -> HttpException 객체가 생성 -> Error 클래스의 message 속성에 "해당 유저가 없습니다." 저장되는 것!
catch (error) {
res.status(500).json({
message: "회원 삭제 실패",
error: error instanceof Error ? error.message : "Unknown error",
});
}
컨트롤러 측에서 catch(error)로 에러를 받았을 때, 해당 처리를 해주면 된다.
HttpException이 Error를 상속받았으므로 error도 자연스레 Error 클래스의 인스턴스가 되는 것이다.
그럼 error instanceof Error = true -> error.message 인 "해당 유저가 없습니다."를 띄운다!
이렇게 에러처리를 해주면 프론트 측에서도 테스트를 할때 뭐가 문제인지 한번에 알 수 있어서 서로 좋다.