본문 바로가기

오픈소스/스프링

[Spring] ExceptionHandler 적용 및 사용법

 프로그래밍 관점에서 예외처리는 아주 중요하다고 생각합니다. 예외 처리가 안된 부분은 서버의 무리가 생기게 되고 공격의 취약점이 될 수 있습니다. 자바에서 대표적으로 예외 처리를 하는 방법에는 try-catch 문을 이용하여 적용하는 방법이 있습니다. 하지만 오늘 해볼 내용은 스프링 관점에서 예외처리를 할 예정입니다.

 

 스프링 관점에서 예외처리를 한다고 생각해봅시다. 스프링 프로젝트 중 MVC 패턴 등 쿼리를 이용하여 데이터를 처리하고 여러가지 트렌젝션도 처리된다고 생각해봅시다. 트렌젝션을 처리하는 도중 에러가 발생한다면 Exception 구문으로 들어가게 되는데, 해당 Exception이 롤백을 지원하게 되는지, 안하는지에 따라서 데이터의 손실과 저장 유무가 달라지게 되는 것 입니다. 

 

 대략적으로 일단 ExceptionHandler 부터 적용하고 트렌잭션에 대해 차차 알아가보도록 할 예정입니다.

 

 

# Contents


  • Exception 클래스 생성
  • ControllerAdvice 정의 및 구성
  • 사용법

 

 

# Exception 클래스 생성


 RuntimeException은 UnChecked 이기 때문에 강제성 을 부여하지 않습니다. 또한 예외 발생 시 롤백이 가능하기 때문 에 개발자 입장에서는 쿼리를 이용하여 데이터를 처리하는 구간에서 에러 처리를 하고싶은 구문에는 RuntimeException으로 안전하게 처리할 수 있으니 많이 적용하고 사용하는 편입니다. 

 

 그러면 먼저 Exception 클래스를 생성하고자 합니다.

 Exception 클래스에서는 RuntimeException을 상속받아서 처리하도록 하겠습니다.

 

public class TestException extends RuntimeException {
	private static final long serialVersionUID = 8212234575113606197L;
}

 

 

# ControllerAdvice 정의 및 구현


 ControllerAdvice @Controller나 @RestController 에서 발생한 예외를 한 곳에서 관리하고 처리할 수 있게 도와주는 어노테이션입니다. 

해당 코드를 GlobalExceptionErrorHandler.class 로 생성하였습니다.

 

@ControllerAdvice
public class GlobalExceptionErrorHandler {
	private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionErrorHandler.class);
   
    
    @ExceptionHandler(TestException.class)
    public void MaxUploadSizeException(HttpServletRequest request, HttpServletResponse response, TestException err) throws Exception {
    	logger.info("ErrorExceptionURI : " + request.getRequestURI());
    	err.printStackTrace();
    	response.getWriter().write("It`s Error Message");
    }
}

 

 

# 사용법


 컨트롤러에서 간단하게 사용해보도록 하겠습니다.

 예시를 든 아주 간단한 사용법 이기 때문에 responsebody 부분이 없으시면 아마 동작하지 않을 것입니다. 참고해서 테스트해주시기 바랍니다.

 아래 내용을 컨트롤러에다가 작성해주세요.

 

	@RequestMapping(value = "/test3", method = RequestMethod.GET)
	public ModelAndView home3() {
		if (responsebody == null) throw new TestException();
		return null;
	}