[spring boot 6일차] 예외

이경영·2022년 10월 31일
0

스프링부트

목록 보기
6/12

application.yaml에 지원되는 error 프로퍼티

error 프로퍼티 지원되는 항목
원하는 스타일로 수정해서 사용 가능하다.

@ControllerAdvice @ExceptionHandler 사용

@ControllerAdvice : 컨트롤러에 발생하는 예외를 핸들링 가능하게 지원해준다
@ExceptionHandler : 특정 예외 클래스를 핸들링 가능하게 지원해준다

컨트롤러에서 따로 ExceptionHandler를 구현했을때는
기본 스프링에 있는 basicErrorControllerException이 구현됨.

@ControllerAdivice 선언된 컨트롤러에 있는

@ExceptionHandler vs 기본 컨트롤러 내에서 선언된 @ExceptionHandler
가 있으면 기본컨트롤러가 우선순위로 실행

익셉션 여러종류로 클래스를 선언해서 핸들링 할 수 있다.

--
실습

com.example.advice
ExampleControllerAdvice.java 생성

package com.example.advice;


import javax.servlet.http.HttpServletRequest;

import org.springframework.http.HttpStatus;
import org.springframework.validation.BindException;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.view.json.MappingJackson2JsonView;

import groovyjarjarantlr4.v4.parse.ANTLRParser.finallyClause_return;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;

//롬복 로거 자동생성
@ControllerAdvice
@Slf4j
public class ExampleControllerAdvice {
	
	/**
	 * Exception 발생에 예외처리
	 * @param e
	 * @return
	 */
	@ExceptionHandler(Exception.class)
	public ModelAndView handleException(Exception e) {
		log.error("handleException",e);
		ModelAndView view=new ModelAndView("/error/error");
		view.addObject("exception", e);
		return view;
	}

일반 BoardController.java에 선언

	@PostMapping("/test")
	@ResponseBody
	//responseBody : 비동기로 넘길때 사용하는 방법
	// 객체가 json화 되면서 responsebody에 띄워짐
	//비동기 api에서 많이 쓰는 요청.
	@ExceptionHandler(Exception.class)
	public ModelAndView handleException(Exception e) {
		logger.error("BoardController handleException",e);
		ModelAndView view=new ModelAndView("/error/error");
		view.addObject("exception", e);
		return view;
	}
	
	//boardController에 정의된 이 부분이 먼저 찍히고 
	//BaseErrorController를 타면서 
	//default로 정의한 500.html에서 에러가 찍힘.
	@ExceptionHandler(Exception.class)
	public Exception handleException(Exception e) {
		logger.error("BoardController handleException",e);
		return e;
	}
  • 코드설명 :
    ModelAndView는 Model에도 데이터를 담고싶고, View페이지도 따로 지정하고 싶을때 사용함
    ModelAndView는 Model에 담은 객체를 주소창의 파라미터에 받아 넘기지만 여기는 Exception e 를 담아서 html의 templates의 /error/error 로 넘긴다. (전달하려는 객체가 많다면 Map을 사용한다)

Model과 @ModelAttribute ModelAndView redirectAttribute의 차이를 알고싶은경우
출처 : https://u-it.tistory.com/entry/Controller%EC%97%90%EC%84%9C-view%EB%A1%9C-%EB%8D%B0%EC%9D%B4%ED%84%B0-%EC%A0%84%EC%86%A1%EC%9A%94%EC%B2%AD-Model-ModelAttribute-ModelAndView-redirecAttribute

profile
꾸준히

0개의 댓글