exceptionhandler를 이용한 404페오류페이지 처리

ggujunhee·2022년 2월 19일
1

스프링부트

목록 보기
1/2

참고포스팅 | https://hongs-coding.tistory.com/118

@ControllerAdvice

@controller, @restcontroller에서 발생한 예외를 한 클래스에서 모두 관리하고 처리할 수 있게 해주는 어노테이션입니다.

@Exceptionhandler

@ExceptionHandler는 @controller, @restController가 적용된 Bean내에서 발생하는 예외를 하나의 메서드에서 처리해주는 어노테이션입니다.

@controllerAdvice 내에서 exception처리를 해주는 메서드에 부착해서 사용합니다.

Exception (추가설명)

ControllerAdvice에서 기능별 예외들을 만들 땐 runtimeException을 상속하는 CustomException 클래스를 생성해 이 클래스를 상속받는 여러 종류의 Exception클래스를 만들어 사용할 수 있습니다.

customException extends RuntimeException

error message를 담아서 꺼낼 수 있다.(e.getMessage 메소드)

예외 처리과정

생성해놓은 ContollerAdvice에서 exceptionhadler메소드를 만들어 오류 처리를 하면 되는데 @ExceptionHandler(Exception.class)를 메소드에 붙이면 해당 예외를 처리할 수 있다. 이때 .class를 붙여야 값으로 인식하기 때문에 이 점을 유의하자.

404 에러페이지 처리

404는 다른 예외처리와 다르게 application.properties에 별도의 설정이 필요하다.


application.properties 

// 사실 이것만 써도 404에러를 캐치해낸다.
spring.mvc.throw-exception-if-no-handler-found=true

// 이걸 쓰면 include File을 적용한 파일에 css가 오류가 생김
// 하지만 참고 포스팅에선 이것도 설정에 넣어줌.
spring.web.resources.add-mappings=false 

404 이외에 다른 데이터베이스나 서버오류(500)처리 핸들러예시도 넣어놓았다.


@ControllerAdvice
public class ExceptionHandlerControllerAdvice {
	
    // 404예외처리 핸들러
	@ExceptionHandler(NoHandlerFoundException.class)
	@ResponseStatus(HttpStatus.NOT_FOUND)
	public String handle404(NoHandlerFoundException e){
	return "error/notFound";
	}
    // 데이터베이스오류
	@ExceptionHandler(DataAccessException.class)
	public String handleDataAccessException(DataAccessException e) {
		e.printStackTrace();
		return "error/databaseError";
	}
	// 500에러처리
	@ExceptionHandler(Exception.class)
	public String handleException(Exception e) {
		e.printStackTrace();
		return "error/serverError";
	}	

}

아래는 추가적 설명임으로 위의 설명이 어려울 시 참고

  • @ControllerAdvice와 @RestControllerAdvice
    1. @ControllerAdvice는 @Controller클래스와 @RestController클래스 관련된 예외처리가 구현된 클래스를 나타내는 어노테이션이다.
    2. @RestControllerAdvice는 @RestController클래스 관련된 예외처리가 구현된 클래스를 나타내는 어노테이션이다.
    3. @ControllerAdvice 클래스의 예외처리 메소드는 예외가 발생하면 오류 페이지 혹은 JSON 응답을 제공할 수 있다.
    4.@RestControllerAdvice 클래스의 예외처리 메소드는 예외가 발생하면 JSON 응답만 제공할 수 있다.
    5. 웹 애플리케이션이 웹페이지를 응답으로 제공하는 애플리케이션인 경우 @ControllerAdvice만 사용해서 오류페이지를 응답으로 제공하면 된다.
    6.웹 애플리케이션이 웹페이지와 Rest 응답을 제공하는 애플리케이션인 경우 @ControllerAdvice만 사용하거나 @RestControllerAdvice를 같이 사용할 수 있다.
    7. 웹 애플리케이션이 Rest 응답을 제공하는 애플리케이션인 경우 @RestControllerAdvice만 사용해서 응답을 제공할 수 있다.
    8. 예외가 발생하면 여러 예외처리 메소드 중에서 발생한 예외와 가장 일치하는 예외가 정의된 예외처리 메소드가 실행된다.
    9. 일치하는 예외가 없으면 부모타입의 예외가 정의된 예외처리 메소드가 실행된다.

  • 예외처리 핸들러 메소드
    • 예외발생시 오류 페이지로 내부이동시키는 예외처리 메소드
	  		@ExceptionHandler(예외클래스명.class)
	  		public String handle예외클래스명(예외클래스 e) {
	  			return "오류정보를 표시하는 jsp 페이지 경로";
	  		}
  • 예외처리 메소드가 반환하는 JSP로 내부이동해서 JSP를 실행하고, HTML 컨텐츠를 응답으로 보낸다.
  • 예외발생시 오류 메세지(JSON 텍스트 데이터)를 응답으로 제공하는 예외처리 메소드
    @ExceptionHandler(예외클래스명.class)
    		  		public @ResponseBody ResponseDto<?> handle예외클래스명(예외클래스 e) {
    		  			ReponseDto<?> response = new Response<>();
    		  			response.setStatus("FAIL");
    		  			response.setMessage(e.getMessage);
    	  
    		  			return response;
    		  		}
    위의 예외처리 메소드는 {"status":"FAIL", "error":"오류 메세지 내용", "items":null}을 응답으로 보낸다.
profile
꾸준히 배워가는 블로그입니다.

0개의 댓글