본문 바로가기

프로그래밍/Spring

Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (10) - 예외처리

이번 글은 이 연재의 마지막으로 해당 템플릿에서의 예외처리에 대해 설명하도록 하겠다. 우리가 만든 Spring Application에서는 이런저런 이유로 예외가 발생할 수 있다. 비즈니스적인 로직으로 인해 발생하는 예외도 있고 Runtime 예외도 있다. 예외가 발생할 경우 try-catch를 이용해서 발생시점에서 해당 예외에 대한 처리를 할 수 있지만 비즈니스적으로 이러한 예외처리를 해야 하는게 아니라면 발생된 예외는 호출한 곳으로 계속 던져지게 된다. 단계별로 예외가 계속 던져지게 되면 최종적으로는 Controller 까지 도달하게 되며 Controller에서도 예외 처리를 안하게 되면 Controller 에서는 다시 예외를 던져서 Spring에서 정해져있는 ExceptionResolver 객체에서 이를 처리하게 된다. ExceptionResolver 객체에는 처리해야 할 예외 클래스와 이 예외를 보여줘야 할 View를 정해주기 때문에 해당 예외에 대한 출력이 가능해진다. 그러나 여기서는 ExceptionResolver 객체를 별도로 만들어 등록하지 않고 @ControllerAdvice 와 @ExceptionHandler 를 이용해서 예외를 처리하게 된다. 다음은 이러한 예외를 처리하는 GlobalExceptionHandler 클래스이다.

 

@ControllerAdvice
public class GlobalExceptionHandler {

	@ExceptionHandler(value={DataAccessException.class})
	public XplatformView processDataAccessException(DataAccessException ex){
		XplatformView xplatformView = new XplatformView("30", ex.getMessage());
		return xplatformView;
	}

	@ExceptionHandler(value={Exception.class})
	public ModelAndView processException(Exception ex){
		ModelAndView modelAndView = new ModelAndView();
		modelAndView.addObject("ErrorCode", "156");
		modelAndView.addObject("ErrorMsg", ex.getMessage());
		modelAndView.setViewName("errorView");
		return modelAndView;
	}
}

 

코드를 보면 클래스 레벨에 @ControllerAdvice 어노테이션을 붙이고 메소드 레벨에 @ExceptionHandler 어노테이션을 붙이고 있다. @ExceptionHandler 어노테이션에 처리해야 할 예외를 정의하게 되는데 예외를 하나의 메소드에서 여러개를 처리해야 할 경우 배열 형태로 정의해서 설정할 수 있다(코드에서도 보면 예외 클래스를 1개만 설정하고 있어도 표현하는 방법은 배열 형태의 {}를 사용해서 설정하고 있다) 세부 코드를 보면 예외를 설정해서 View로 표현하는 방법이 2가지의 방법으로 구현되고 있다. 하나는 이전 글에서 설명했던 글인 XplatformView 클래스 객체를 생성해서 이를 return 하는 방법이 있고, 다른 하나는 우리가 늘 익숙했던 코드인 ModelAndView 클래스 객체를 생성해서 여기에 ErrorCode와 ErrorMsg 란 이름으로 값을 설정한 뒤 이 객체를 return 하고 있다. 결과만 얘기하면 둘다 동일한 형태의 결과를 보여준다. 예전 글에서 XplatformView 클래스 코드에 대해 설명할 때 다음의 내용을 설명한 것이 있다.

 

if(!model.containsKey("ErrorCode")) {
	variableList.add("ErrorCode", ERROR_CODE_VALUE);
}

if(!model.containsKey("ErrorMsg")) {
	variableList.add("ErrorMsg", ERROR_MSG_VALUE);
}

 

 

XplatformView 코드를 보면 ERROR_CODE_VALUE와 ERROR_MSG_VALUE 멤버변수가 있고 이를 설정하는 생성자도 있다. GlobalExceptionHandler 클래스의 processDataAccessException 메소드는 XplatformView 생성자를 통해 이 멤버변수를 설정했고 위의 코드를 실행하는 시점에 model에 ErrorCode와 ErrorMsg 가 없을 경우 model에 ErrorCode와 ErrorMsg를 각각 key로 주어서 이 멤버변수 값이 들어가게 된다. 이러한 방법으로 processDataAccessException 메소드가 해당 예외에 대한 코드와 메시지를 설정하게 된다. 그러나 processDataAccessException 메소드는 model에 ErrorCode와 ErrorMsg를 설정한 상태에서 XplatformView에 전달되기 때문에 위의 코드가 실행이 되지 않는다. 만약 XPlatformView 생성자에서 에러코드와 에러메시지를 설정하고 model에도 ErrorCode와 ErrorMsg가 설정된 상태로 XplatformView에 전달되면 model에 있는 것으로 전달이 된다. 여기서는 예시로 DB 관련 예외인 DataAccessException 과 Exception 2개만 예로 들었지만 예외와 그 처리 방법에 따라 메소드를 늘려가며 작업하면 된다.

 

지금까지 Spring과 Xplatform을 연동한 템플릿에 대한 설명을 진행했다. 궁금한 내용이 있으면 댓글로 달아주길 바란다. 그리고 이것은 모든 상황에 대응할 수 있는 템플릿은 아니다. 이 템플릿은 Xplatform에서 제공하는 샘플 예제로 만들어놓은 템플릿이기 때문에 아주 기본적인 상황에서는 대응할 수 있지만 그거보다 확장된 상황에서는 대응할 수가 없다(내가 받은 Xplatform 예제엔 파일 업로드 기능이 없어서 이에 대한 내용을 템플릿에 구현하지를 못했다. 지인에세 물어본바로는 Xplatform도 Java단에서 MultipartRequest 로 받는다고 하기 때문에 XplatformArgumentResolver에서 MultipartRequest로 받아서 진행하면 될 것으로 생각한다) 그러니 적용시엔 커스터마이징 할 것을 생각하고 진행하길 바란다.

 

 1. Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (1) - 개요

 2. Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (2) - 사전지식

 3. Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (3) - HttpServletRequestWrapper

 4. Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (4) - Spring Controller에서 하려는 것

 5. Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (5) - HandlerMethodArgumentResolver 분석(1)

 6. Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (6) - HandlerMethodArgumentResolver 분석(2)

 7. Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (7) - HandlerMethodArgumentResolver 분석(3)

 8. Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (8) - HandlerMethodArgumentResolver 분석(4)

 9. Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (9) - XplatformView 분석

 10. Xplatform과 Spring Framework 연동 템플릿으로 보는 HandlerMethodArgumentResolver와 ViewResolver (10) - 예외처리