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
반응형
'Springboot' 카테고리의 다른 글
[SpringBoot] 9. 어노테이션 정리 (0) | 2024.08.06 |
---|---|
[SpringBoot] 8. 에러 페이지 생성 (0) | 2024.08.06 |
[SpringBoot] 6. 메인컨트롤러와 메인페이지 구현하기 (0) | 2024.08.05 |
[SpringBoot] 5. 화면 구현 (0) | 2024.08.05 |
[SpringBoot] 4. 모델링(2) - DTO 모델링 (0) | 2024.08.05 |