예전 뉴스피드 프로젝트중 공통 예외 처리를 이런방식으로 직접 서비스단에서 HttpStatus,메세지를 적어서 넘겨주고,공통 ExceptionResponse를 사용 안해서 컨트롤쪽에서 일일이 trt,catch문으로 해서 코드만 길어지는 문제가 있었다.
그래서 enum으로 하고 공통 ExceptionResponse 사용 하는 방법도 있다.
enum으로 하는 방식
1. 먼저 enum클래스를 생성후 각 상수에 int형 상태코드랑 반환할 메세지 적는다.
2. 예외 클래스를 만든다.(현재 캡처는 비니지스,커스텀 예외 추가중)
예외 클래스 생성자에서 enum클래스를 받는다.
super부분이랑 this.status는 받은 enum클래스의 정보에 해당 상수값 가져온다
3. 글로벌 예외 핸들러 생성한다.
httpStatus변수부분 보면 캡처에 주석에 나온대로 1번에서 생성한 Enum클래스에서 상태코드 int형으로 400,401등 이렇게 설정해서 해당 정수값에 해당하는 상태코드 가져오는거다
4. 이제 클라한테 상태코드랑 메세지등 정보를 넘겨주는용 ExceptionRespone를 생성한다.
5. 이렇게 서비스단에서 사용한다.
6. 만약 서비스단에서 enum상수값도 보기 좀 그럴땐 각 모듈별로 패키지 생성후 그 패키지안에 예외 클래스 생성후 거기서 enum상수 넣어준다.
이렇게 하면 서비스단에 더 깔끔하게 보이긴한다. (하지만 이부분은 전팀장이 해서 유지보수때문에 그런거인지 깔금하게 보이기 위해서 인지 어떤 예외인지 정확히 서비스 단에서 알고 싶어서 인지 정확한 이유는 모르나 또 일일이 클래스 생성해야해서 더 귀찮을듯한 느낌 든다ㅋㅋ.)
추가
전 프로젝트에서 팀장이 담당한 코드인데 이 코드 두번째 생성자부분 보면 Throwable보니 예외의 최상위 클래스로만 알고 있어서 GPT한테 물어보니
"발생한 예외의 원인이 되는 다른 예외(또는 오류)를 나타냅니다. 다시 말해, 현재 발생한 예외가 다른 예외를 발생시킨 경우, 이전 예외를 전달하고자 할 때 사용됩니다.
Throwable cause를 이용하여 현재 예외가 다른 예외를 던질 때, 이전 예외의 정보를 가지고 새로운 예외를 생성할 수 있습니다. 이는 디버깅 및 예외 처리에 유용한 정보를 포함할 수 있도록 도와줍니다"
이렇게 답변 받았는데 문장 자체는 이해는 가나 아직 코드로 정확한 이해는 모르겠다...