본문 바로가기
Spring

[스프링의 정석] 예외

by 리잼 2023. 4. 17.
반응형

@ExcptionHandler 와 @ControllerAdvice

@ExcptionHandler

  • 예외 처리를 위한 메서드 작성 후 어노테이션을 해준다
package com.springmvcstudy.ch2;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ExceptionController {
	
	@ExceptionHandler(Exception.class)
	public String catcher(Exception ex, Model m) {
		System.out.println("catcher() is in ExceptionController");
		System.out.println("m=" + m);
		m.addAttribute("ex", ex);
		return "error";
	}
	
	@ExceptionHandler(NullPointerException.class)
	public String catcher2(Exception ex, Model m) {
		m.addAttribute("ex", ex);
		return "error";
	}
	
	@RequestMapping("/ex")
	public String main(Model m) throws Exception { //Model은 chatcher() Model과 다
		m.addAttribute("msg", "message from ExcptionController.main()");
		throw new Exception("예외가 발생했습니다.");
	}
	@RequestMapping("/ex2")
	public String main2() throws Exception {
		throw new NullPointerException("NullPoint 예외가 발생했습니다.");
	}
}

@ControllerAdvice

  • ControllerAdivce로 전역 예외처리 클래스 작성이 가능 ( 패키지 지정 가능 )
    예외 처리 메서드가 중복된 경우, 컨트롤러 내의 예외 처리 메서드가 우선임
package com.springmvcstudy.ch2;

import java.io.FileNotFoundException;

import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

@ControllerAdvice("com.springmvcstudy.ch2") // 패키지 지정
//@ControllerAdvice() // 모든 패키지 지정 
public class GlobalCatcher {

	@ExceptionHandler(Exception.class)
	public String catcher(Exception ex, Model m) {
		m.addAttribute("ex", ex);
		return "error";
	}
	
	@ExceptionHandler({NullPointerException.class, FileNotFoundException.class})
	public String catcher2(Exception ex, Model m) {
		m.addAttribute("ex", ex);
		return "error";
	}
	
}

 

@ResponseStatus

  • 응답 메세지의 상태 코드를 변경할 때 사용
package com.springmvcstudy.ch2;

import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;

@Controller
public class ExceptionController {
	
	@ExceptionHandler(Exception.class)
	@ResponseStatus(HttpStatus.INTERNAL_SERVER_ERROR) // 200 >> 500
	public String catcher(Exception ex, Model m) {
		System.out.println("catcher() is in ExceptionController");
		System.out.println("m=" + m);
		m.addAttribute("ex", ex);
		return "error";
	}
	
	@RequestMapping("/ex")
	public String main(Model m) throws Exception { //Model은 chatcher() Model과 다
		m.addAttribute("msg", "message from ExcptionController.main()");
		throw new Exception("예외가 발생했습니다.");
	}
}

<error-page> - web.xml

  • 상태 코드별 뷰 맵핑

web.xml에 추가

 

반응형