Springboot

[SpringBoot] 7. Exception Handler 처리

Song hyun 2024. 8. 5. 16:02
728x90
반응형

1. @ControllerAdvice와 @RestcontrollerAdvice

(1) 개념

 

(2) 차이점

 

2. 코드

(1) RedirectException

package com.tenco.bank.handler.Exception;

import org.springframework.http.HttpStatus;

import lombok.Getter;

@Getter
// 에러 발생 시에 여러 페이지로 이동시킬 때 사용 예정
public class RedirectException extends RuntimeException{

	private HttpStatus status;
	
	// throw new RedirectException(???,???);
	public RedirectException(String message,HttpStatus status) {
		super(message);
		this.status=status;
	}
}

 

(2) UnAuthorizedException

package com.tenco.bank.handler.Exception;

import org.springframework.http.HttpStatus;

import lombok.Getter;

@Getter
public class UnAuthorizedException extends RuntimeException{
	
	private HttpStatus status;
	
	// throw new UnAuthorized Exception( , )
	public UnAuthorizedException(String message,HttpStatus status) {
		super(message);
		this.status=status;
	}
}

 

(3) GlobalControllerException

package com.tenco.bank.handler;

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.tenco.bank.handler.Exception.DataDeliveryException;
import com.tenco.bank.handler.Exception.RedirectException;
import com.tenco.bank.handler.Exception.UnAuthorizedException;

@ControllerAdvice // 해당 어노테이션을 통해 IoC의 대상이 된다. (=싱글톤 패턴으로 관리된다.) 
// -> HTML 렌더링 예외에 많이 사용
public class GlobalControllException {
	
	/**
	 * (개발 시에 많이 활용)
	 * 모든 예외 클래스를 알 수 없기 때문에 
	 * 로깅으로 확인 할 수 있도록 설정!
	 * 
	 * 로깅 처리에는 동기적 방식이 있다.
	 * 동기적 방식(System.out.println)
	 * 비동기적 방식(@slf4j)
	 */

	// @ExceptionHandler => 설정해둔 예외 발생시 해당 메서드 동작하게끔 함
	@ExceptionHandler(Exception.class )
	public void exception(Exception e) {
		System.out.println("------------------");
		System.out.println(e.getClass().getName());
		System.out.println(e.getMessage());
		System.out.println("------------------");
	}
	
	
	/**
	 * Data로 예외를 내려주는 방법
	 * @ResponseBody 활용
	 * 브라우저에서 자바스크립트 코드로 동작하게 된다!
	 * 
	 * @param e
	 * @return
	 */
	// 예외를 내릴 때 데이터를 내리고 싶다면 1. @RestControllerAdvice를 사용하면 된다.
	// 단, @ControllerAdvice를 사용하고 있다면, @ResponseBody를 붙여 사용하면 된다.
	@ResponseBody
	@ExceptionHandler(DataDeliveryException.class)
	public String dataDeliveryException(DataDeliveryException e) {
		StringBuffer sb=new StringBuffer();
		sb.append("<script>");
		sb.append("alert('"+e.getMessage()+"')");
		sb.append("window.history.back()");
		sb.append("</script>");
		return sb.toString();
	}
	
	@ResponseBody
	@ExceptionHandler(UnAuthorizedException.class)
	public String unAuthorizedException(UnAuthorizedException e) {
		StringBuffer sb=new StringBuffer();
		sb.append("<script>");
		sb.append("alert('"+e.getMessage()+"')");
		sb.append("window.history.back()");
		sb.append("</script>");
		return sb.toString();
	}
	
	/**
	 * 에러 페이지로 이동 처리
	 * JSP로 이동시 데이터를 담아서 보내는 방법
	 * ModelAndView,Model 사용 가능
	 * throw new RedirectException('페이지 없음',404);
	 */
	@ExceptionHandler(RedirectException.class)
	public ModelAndView redirectException(RedirectException e) {
		ModelAndView modelAndView=new ModelAndView("errorPage"); // 전위, 후위 연산자 사용
		modelAndView.addObject("statusCode",e.getStatus().value());
		modelAndView.addObject("message", e.getMessage());
		return modelAndView; // 페이지 반환+데이터 내려줌
	}
	
}

 

 

(4) DataDeliveryException

package com.tenco.bank.handler.Exception;

import org.springframework.http.HttpStatus;

public class DataDeliveryException extends RuntimeException  {
	
	private HttpStatus status;
	
	public DataDeliveryException(String message, HttpStatus status) {
		super(message);
		this.status=status;
	}
}
728x90
반응형