예외처리 (Spring)

화낼거양's avatar
Nov 21, 2024
예외처리 (Spring)
 
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; }
 
  • 설명:
      1. 예외 객체 수신: RuntimeException e는 발생한 예외 객체를 전달받습니다.
      1. 스크립트 생성: 다중 라인 문자열을 사용하여 JavaScript 코드를 작성합니다. 여기서 ${msg}는 예외 메시지로 대체됩니다.
      1. 메시지 대체: replace("${msg}", e.getMessage())를 사용하여 ${msg}를 예외 메시지로 대체합니다. 이 예외 메시지는 발생한 예외의 메시지를 포함합니다.
      1. 응답 반환: 생성된 HTML/JavaScript 코드가 문자열로 반환되어 클라이언트에게 전송됩니다.
       
  • Detail :
    • 예외가 발생하면 JavaScript 경고창에 예외 메시지가 표시되고, 사용자가 확인을 누르면 이전 페이지로 돌아갑니다. 이는 사용자가 예외가 발생했음을 알 수 있게 하고, 빠르게 이전 페이지로 돌아갈 수 있게 해줍니다.
    •  

전체 동작 과정

 
  1. 예외 발생:
      • 애플리케이션 내에서 RuntimeException이 발생하면, 이 예외는 전역 예외 처리기로 전달됩니다.
  1. 메서드 호출:
      • @ExceptionHandler(RuntimeException.class) 어노테이션에 의해 err 메서드가 호출됩니다. 예외 객체 e가 메서드에 전달됩니다.
  1. 스크립트 생성 및 반환:
      • 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

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

RuntimeException 예외가 던져졌을 때

 
notion image
 
구현 내용이 없기 때문에 위의 이미지와 같이 출력되는 것을 확인할 수 있습니다.
 
 
 
 

Exception404 예외가 던져졌을 때

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

moohyun