Spring boot
Bank App 만들기 - 존재하지 않는 경로에 대한 요청 처리(404)
햄발자
2024. 9. 28. 00:05
GlobalControllerAdvice.java - @ExceptionHandler(Exception.class) 주석 처리
더보기
닫기
GlobalControllerAdvice.java
// @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("------------------");
// }
GlobalControllerAdvice.java 전체코드
더보기
닫기
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 GlobalControllerAdvice {
/**
* (개발시에 많이 활용)
* 모든 예외 클래스를 알 수 없기 때문에 로깅으로 확인할 수 있도록 설정
* 로깅처리 - 동기적 방식 ( System.out.println() )
* 로깅처리 - 비동기적 방식 @slf4j (비동기 처리 됨)
*
* 둘 중 누가 예외를 잡나요? 자세한 것은 DataDeliveryException 그 외의 범위는 exception
*/
// @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 활용
* 브라우저에서 자바스크립트 코드로 동작 하게 됨
*/
// 예외를 내릴 때 데이터를 내리고 싶다면 1. @RestControllerAdvice를 사용하면 된다.
// 단 @ControllerAdvice 사용하고 있다면 @ResponseBody 를 붙여서 사용하면 된다.
@ResponseBody // (데이터를 반환 처리 함)
@ExceptionHandler(DataDeliveryException.class) // DataDeliveryException 오류 잡음
public String dataDeleveryException(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(" location.href='/user/sign-in';"); // 로그인 페이지로 이동
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", HttpStatus.NOT_FOUND.value());
modelAndView.addObject("statusCode", e.getStatus().value());
modelAndView.addObject("message", e.getMessage());
return modelAndView; // 페이지 반환 + 데이터 내려줌
}
}
CustomErrorController.java
더보기
닫기
CustomErrorController.java
package com.tenco.bank.controller;
import org.springframework.boot.web.servlet.error.ErrorController;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import com.tenco.bank.handler.exception.RedirectException;
import jakarta.servlet.RequestDispatcher;
import jakarta.servlet.http.HttpServletRequest;
/**
* 존재하지 않는 경로 요청시 예외처리 (404)
*/
@Controller // IOC (싱글톤 패턴 관리)
public class CustomErrorController implements ErrorController {
@GetMapping("/error")
public void handleError(HttpServletRequest request) {
Object status = request.getAttribute(RequestDispatcher.ERROR_STATUS_CODE);
if(status != null) {
Integer statusCode = Integer.valueOf(status.toString());
if(statusCode == HttpStatus.NOT_FOUND.value()) {
// HttpStatus.NOT_FOUND.value() --> 404 숫자를 반환
// 404 zhemfkaus
throw new RedirectException("잘못된 요청입니다.", HttpStatus.NOT_FOUND);
}
// 상세 설정 가능 함
// else if(statusCode == )
}
} // end of handleError()
}