백엔드

[백엔드]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 인 "해당 유저가 없습니다."를 띄운다!

 

이렇게 에러처리를 해주면 프론트 측에서도 테스트를 할때 뭐가 문제인지 한번에 알 수 있어서 서로 좋다.