본문 바로가기
백엔드 공부

[Java Spring] Exception 발생 시 로그 및 HTTP 응답 에러 메시지 안뜨는 문제 해결

by CSEGR 2025. 1. 22.
728x90

[오류 1]

Exception 클래스에서 RuntimeException의 생성자에 적절한 에러 메시지를 전달하지 않아, 발생한 예외의 메시지가 null로 출력되었다. 로그에서 모두 에러 메시지가 제대로 나타나지 않았다.

2025-01-22T16:16:16.664+09:00 ERROR 84514 --- [io-8080-exec-10] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: com.------.source.domain.dispatch.exception.DispatchException] with root cause

com.------.source.domain.dispatch.exception.DispatchException: null
	at com.-------.source.domain.dispatch.service.DispatchRequestService.createDirectoryTransmissionRequest(DispatchRequestService.java:68) ~[main/:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
	at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]

 

[원인]

아래는 수정 전 Execption 클래스이다. 초기 코드에서는 Exception 생성 시 ErrorCode만 전달하고 있었으나, RuntimeException의 메시지 필드에 DispatchErrorCode의 에러 메시지(getErrorMessage())를 설정하지 않았기 때문이였다.

 

[해결 방법]

 

  • Exception의 생성자에서 super(errorCode.getErrorMessage())를 호출하여 RuntimeException의 메시지 필드에 에러 메시지를 전달. 
  • Exception 클래스에 getHttpStatus() 메서드를 추가하여 ErrorCode의 HTTP 상태를 쉽게 가져올 수 있도록 수정. 

 

Exception 클래스
ErrorCode 클래스

 

[해결 완료]

2025-01-22T16:40:06.141+09:00 ERROR 3345 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: com.------.source.domain.dispatch.exception.DispatchException: 이미 해당 디렉토리 전송 요청을 전송하였습니다.] with root cause

com.------.source.domain.dispatch.exception.DispatchException: 이미 해당 디렉토리 전송 요청을 전송하였습니다.
	at com.-------.source.domain.dispatch.service.DispatchRequestService.createDirectoryTransmissionRequest(DispatchRequestService.java:72) ~[main/:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na]

 

이제 로그에서 에러메세지가 잘 뜨는 것을 확인할 수 있다 !!!

 

 

[오류 2]

API 호출 시 서버에서 예외가 발생했을 때, 클라이언트에 반환되는 응답이 500 Internal Server Error로만 표시되고, 구체적인 에러 메시지가 포함되지 않았다. 즉, log에만 에러 메세지가 뜨고 HTTP 응답에는 그냥 500에러로 떴다..

 

[원인]

전역 예외 처리 클래스에 @RestController를 사용했기 때문이였다. @RestController는 컨트롤러로 동작하지만 예외를 전역적으로 처리하기 위한 어노테이션이 아니라고 한다.... 이로 인해 전역 예외 처리기로 동작하지 않았다.

 

[해결]

@RestControllerAdvice는 Spring 애플리케이션의 모든 컨트롤러에서 발생하는 예외를 처리할 수 있다.

예외가 발생하면, 해당 예외와 매핑된 @ExceptionHandler 메서드가 호출되어 클라이언트에 적절한 응답을 반환한다.

 

 

 

[해결 완료]

이제 HTTP 요청에도 어떤 이유로 에러가 났는지 알 수 있게 되었다.. 성공 ~!!!

728x90