📗 스프링 Spring

[스프링/Spring] 예외처리

핑크빛연어 2021. 5. 18. 12:02

 

예외처리


프로그램 실행 중 오류가 발행하면 프로그램 실행이 중단하게 되는데 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 가 호출됩니다.

 

 

 

728x90
반응형