예외처리
프로그램 실행 중 오류가 발행하면 프로그램 실행이 중단하게 되는데 Java 에서 이를 방지하기 위해 오류 처리 라는 개념을 두었습니다.
오류 발생 시 보여줄 화면 jsp 를 구성하고 오류 발생 시 이 jsp 로 응답결과를 생성하여 브라우저로 전달하게 됩니다.
@ExceptionHandler(오류Exception.class)
Controller 에서 @ExceptionHandler(오류Exception.class) 를 통해 메서드를 정의해주면 오류 발생 시 이 메서드를 자동 호출해줍니다.
TestController 의 test01() 메서드를 실행 시 오류가 발생하면 TestController 안의 @ExceptionHandler 를 통해 ArrayIndexOutOfBoundsException.class 를 핸들링하는 exception01() 메서드가 호출됩니다.
package com.my.spring.controller;
import java.util.ArrayList;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class TestController {
private String TAG = "===== "+TestController.class.getSimpleName()+" >> ";
@GetMapping("/test01")
public String test01(Model model) {
int[] array1 = {10, 20, 30};
model.addAttribute("array1", array1[0]);
model.addAttribute("array1", array1[10]); //ArrayIndexOutOfBoundsException 오류발생
return "test01";
}
@ExceptionHandler(ArrayIndexOutOfBoundsException.class)
public String exception01() {
System.out.println(TAG+"exception01() ");
return "error01";
}
}
SecondController 의 test02() 메서드를 실행 시 오류가 발생하면 SecondController 안의 @ExceptionHandler 를 통해 NullPointerException.class 를 핸들링하는 exception02() 메서드가 호출됩니다.
package com.my.spring.controller;
import java.util.ArrayList;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class SecondController {
private String TAG = "===== "+SecondController.class.getSimpleName()+" >> ";
@GetMapping("/test02")
public String test02() {
ArrayList<String> list = null;
list.add("문자열"); //NullPointerException 오류발생
return "test02";
}
@ExceptionHandler(NullPointerException.class)
public String exception02() {
System.out.println(TAG+"exception02() ");
return "error02";
}
}
GlobalExceptionHandler.java
@ExceptionHandler(오류Exception.class) 는 Controller 마다 만들어줘야 하기 떄문에 공통으로 발생 가능한 예외들이 있다면 한번만 정의해서 사용하는 것이 효율적입니다.
Global Exception Handler 를 구현해 정의하면 모든 Controller 에서 발생되는 예외처리를 처리할 수 있습니다.
@ControllerAdvice : 모든 @Controller 에서 발생할 수 있는 예외를 처리해주는 어노테이션. 해당 클래스를 Global Exception Handler 로 사용하겠다고 선언
package com.my.spring.exception;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
@ControllerAdvice
public class GlobalExceptionHandler extends RuntimeException {
private String TAG = "===== "+GlobalExceptionHandler.class.getSimpleName()+" >> ";
@ExceptionHandler(NullPointerException.class)
public String handleException() {
System.out.println(TAG+"handleException() ");
return "error02";
}
}
현재 GlobalExceptionHandler 에서 NullPointerException 만 핸들링하고 있어서 NullPointerException 외 다른 Exception 은 GlobalExceptionHandler 에 의해서 처리되지 않습니다.
만약 하나로 더 많은 처리를 원하면 모든 예외의 부모 클래스인 Exception.class 를 핸들링하면 됩니다.
@ExceptionHandler(Exception.class)
각 @Controller 안에 있는 @ExceptionHandler로 정의한 메서드가 우선적으로 호출되고
해당 Controller 에 적합한 ExcpetionHandler 가 없는 경우 GlobalExceptionHandler 가 호출됩니다.
'📗 스프링 Spring' 카테고리의 다른 글
[스프링/Spring] Interceptor (0) | 2021.05.17 |
---|---|
[스프링/Spring] Spring MVC 유효성 검사 (0) | 2021.05.17 |
[스프링/Spring] Message (0) | 2021.05.14 |
[스프링/Spring] Properties (0) | 2021.05.14 |
[스프링/Spring] 요청방식 (@RequestMapping / @GetMapping / @PostMapping) (0) | 2021.05.13 |