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()
}