Spring에서 예외 처리는 애플리케이션의 안정성과 사용자 경험을 향상시키기 위해 중요합니다. 간단하게 요약하면:
- 안정성 보장: 예외를 적절하게 처리하여 애플리케이션이 예기치 않은 상황에서도 중단되지 않고 계속 실행될 수 있도록 합니다.
- 문제 디버깅: 예외 발생 시 로그를 기록하여 개발자가 문제의 원인을 파악하고 수정할 수 있게 돕습니다.
- 사용자 경험 향상: 사용자에게 친화적인 오류 메시지를 제공하고, 예외 발생 시 적절한 대응을 통해 사용자 만족도를 높입니다.
- 코드의 일관성 및 유지보수성: 예외 처리를 중앙화하여 코드의 일관성을 유지하고, 유지보수성을 향상시킵니다.
이와 같은 이유로 Spring에서는 예외 처리가 중요한 역할을 합니다.
1. RuntimeException 예외 처리하기
@ControllerAdvice
public class MyControllerAdvice {
@ResponseBody
@ExceptionHandler(RuntimeException.class)
public String err(RuntimeException e) {
String body = """
<script>
alert('${msg}');
history.back();
</script>
""".replace("${msg}",e.getMessage());
return body;
}
}
RuntimeException
이 발생했을 때 사용자에게 알림 메시지를 표시하고 이전 페이지로 되돌아가도록 하는 전역 예외 처리기입니다. 각 부분을 자세히 설명드리겠습니다.@ControllerAdvice
- 이 어노테이션은 애플리케이션 전체에서 발생하는 예외를 한 곳에서 처리할 수 있도록 해줍니다. 모든 컨트롤러에 적용되며, 전역 예외 처리를 정의할 수 있습니다.
MyControllerAdvice
클래스
- 이 클래스는 전역 예외 처리를 담당하며,
RuntimeException
이 발생했을 때 특정 동작을 수행하도록 합니다.
@ExceptionHandler(RuntimeException.class)
- 이 어노테이션은
RuntimeException
이 발생했을 때 호출될 메서드를 정의합니다. 예외가 발생하면 이 메서드가 실행됩니다.
@ResponseBody
- 이 어노테이션은 메서드의 반환 값이 HTTP 응답 본문에 포함되도록 지정합니다. 여기서는 문자열을 반환하여 클라이언트에게 직접 전달합니다.
err
메서드
@ResponseBody
@ExceptionHandler(RuntimeException.class)
public String err(RuntimeException e) {
String body = """
<script>
alert('${msg}');
history.back();
</script>
""".replace("${msg}", e.getMessage());
return body;
}
- 설명:
- 예외 객체 수신:
RuntimeException e
는 발생한 예외 객체를 전달받습니다. - 스크립트 생성: 다중 라인 문자열을 사용하여 JavaScript 코드를 작성합니다. 여기서
${msg}
는 예외 메시지로 대체됩니다. - 메시지 대체:
replace("${msg}", e.getMessage())
를 사용하여${msg}
를 예외 메시지로 대체합니다. 이 예외 메시지는 발생한 예외의 메시지를 포함합니다. - 응답 반환: 생성된 HTML/JavaScript 코드가 문자열로 반환되어 클라이언트에게 전송됩니다.
- Detail :
- 예외가 발생하면 JavaScript 경고창에 예외 메시지가 표시되고, 사용자가 확인을 누르면 이전 페이지로 돌아갑니다. 이는 사용자가 예외가 발생했음을 알 수 있게 하고, 빠르게 이전 페이지로 돌아갈 수 있게 해줍니다.
전체 동작 과정
- 예외 발생:
- 애플리케이션 내에서
RuntimeException
이 발생하면, 이 예외는 전역 예외 처리기로 전달됩니다.
- 메서드 호출:
@ExceptionHandler(RuntimeException.class)
어노테이션에 의해err
메서드가 호출됩니다. 예외 객체e
가 메서드에 전달됩니다.
- 스크립트 생성 및 반환:
err
메서드는 예외 메시지를 포함하는 JavaScript 코드를 생성하고 반환합니다.- 클라이언트 브라우저는 이 코드를 실행하여 경고 메시지를 표시하고, 사용자가 확인 버튼을 누르면 이전 페이지로 되돌아갑니다.
위 예제의 문제점
발생하는 런타임 예외는 여러 종류가 있을 수 있습니다. 그러나 발생하는 모든 예외를 ‘alert + 메세지 내용 의 스크립트 문을 전달하는 방법’ 으로 통일되어있고,
예외 종류에 맞게 각각 다른 예외 처리를 구현하기 어렵기 때문에 CustomException 클래스를 만들어 해결하는 것이 바람직합니다.
해당 글에서는 1개만 만들어 적용시켜보겠습니다.
2. CustomException 을 이용한 예외 처리하기
CustomException 생성
public class Exception404 extends RuntimeException {
public Exception404(String msg) {
super(msg);
}
}
이 클래스는
RuntimeException
을 상속하여, 특정 조건에서 발생할 수 있는 예외를 정의합니다. 다음은 각 부분의 설명입니다.클래스 선언
public class Exception404 extends RuntimeException {
Exception404
클래스:RuntimeException
클래스를 상속받은 사용자 정의 예외 클래스입니다.
- 상속:
RuntimeException
을 상속함으로써, 예외 처리를 위한 기본 기능을 모두 사용하면서, 필요에 따라 추가적인 기능을 확장할 수 있습니다.
생성자
public Exception404(String msg) {
super(msg);
}
- 생성자는 예외가 발생할 때 예외 메시지를 전달받기 위해 문자열
msg
를 매개변수로 받습니다.
super(msg)
:RuntimeException
클래스의 생성자를 호출하여, 전달받은 메시지를 부모 클래스에 넘깁니다. 이를 통해 예외 메시지가 상위 클래스에 의해 처리됩니다.
CustomException 활용
변경된 Advice 작성 내용 :
@ControllerAdvice
public class MyControllerAdvice {
@ResponseBody
@ExceptionHandler(Exception404.class)
public String err404(Exception404 e) {
String body = """
<script>
alert('${msg}');
history.back();
</script>
""".replace("${msg}",e.getMessage());
return body;
}
}
- 핵심 요소 :
RuntimeException 클래스 대신 직접 작성한 Exception404 클래스로 대체가 되었고,
이와 같이 ‘커스텀 클래스’를 예외 종류들에 맞게 다양하게 구성하여 각기 다른 예외 처리 방식을 구현할 수 있습니다.
(400, 401 등등 다른 객체도 직접 만들어 구현할 수 있으나, 예제에서는 404에 대한 클래스만 작성하였습니다.)
Test

기존 Service 객체의 메서드 내용을 수정한 이미지 입니다.
- 게시글상세보기() 메서드는 RuntimeException(구현 내용 작성 X) 예외를 던지고 있습니다.
- 게시글수정화면보기() 메서드는 새로 만든 Exception404(구현 완료) 예외를 던지고 있습니다.
RuntimeException 예외가 던져졌을 때

구현 내용이 없기 때문에 위의 이미지와 같이 출력되는 것을 확인할 수 있습니다.
Exception404 예외가 던져졌을 때

구현한 alert 메세지가 출력되는 것을 확인할 수 있습니다.
Share article