티스토리 뷰

이전 프로젝트에서 과부하 제어에 관한 작업을 했었다.

 

WAS에서 Request가 들어올 때마다 interceptor에서 과부하 수치를 카운팅하고, Response가 나갈 때마다 차감되는 형태로 구현했었다. 서버에 정상적으로 반영됐고, 트래픽이 몰려도 평균 과부하 수치가 10 이내 유지되면서 문제 없이 가동되고 있었다.

 

문제는, 외부 API에서 우리 서버에서 한 요청을 제대로 응답해 주지 못해 익셉션이 발생했을 때 생겼다.

익셉션이 발생했을 때 Response가 정상적으로 종료되지 않아 interceptor를 타지 않고 종료되면서 과부하 수치가 차감되지 않는 문제였다.

 

다행히 문제를 조기 발견해 조치를 했지만, 익셉션 처리를 제대로 할 필요를 느껴서 공부해봤다.

 

 

 

Spring에서는 익셉션을 한곳에서 관리하는 기능을 제공한다. ControllerAdvice 어노테이션을 이용하면되는데, ExceptionHanlder와 함께 사용해 다양한 익셉션을 제어할 수 있도록 했다.

 

우선 디폴트 익셉션을 처리하는 방법을 기준으로 작성해보고자한다.

1. ControllerAdvice

앞서 언급한 것 처럼 익셉션을 한데 모아 처리할 수 있도록 도와주는 어노테이션이다. 모든 컨트롤러에서 익셉션이 발생하면, 해당 익셉션들을 ControllerAdvice 어노테이션을 갖고 있는 클래스가 가로챈다.

 

이를 전역적으로 익셉션을 처리한다라고도 한다. 문제가 생겼을 때 컨트롤러한테 조언을 해준다는 의미로 이름이 ControllerAdivce 이름의 유래라고 생각된다.

1.1 구현

  • 디폴트 익셉션의 처리
@ControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(value = Exception.class)
    public ModelAndView defaultErrorHandler(HttpServletRequest request, Exception e) throws Exception {
        // Do something with the exception and return a ModelAndView
    }
}

1.2 ExceptionHandler

ExceptionHandler로 Java에서 구현되어 있는 익셉션을 포함해 임의로 작성한 익셉션들을 핸들링 할 수 있다. 1.1의 디폴트 익셉션 처리에도 ExceptionHandler가 붙어있다.

다음은 임의로 작성한 익셉션 핸들링 과정이다.

 

1. Exeption을 상속 받는 클래스를 생성(별다른 내용을 작성하진 않음)

public class OverloadException extends Exception {
}

2. ControllerAdvice에 매서드를 생성하고 @ExceptionHandler 어노테이션을 붙인다.

@ExceptionHandler(OverloadException.class)
public @ResponseBody ModelAndView responseOverloadException(HttpServletRequest httpServletRequest, OverloadException ex) {
	...
	String message = "과부하 임계치 초과 상태입니다.";
    ...
}	

위와 같이 매우 간단하게 처리할 수 있다.

 

주의할 점은 파라미터로 핸들링하고자 하는 익셉션을 넣어주어야 한다는 것 정도다. Response를 생성하는 과정에서 가로채기 때문에, 해당 매서드 내에서 만든 Response가 최종 응답이 된다.

2. 마치며

스프링 프레임워크에서 제공하는 기능을 이용하면 생각보다 간단하게 익셉션 처리가 가능하지만, 막상 개발하는 입장에서는 귀찮은 과정이다.

모든 익셉션에 대해 동일한 에러처리를 하면 안될 뿐더러, 각각의 익셉션을 모두 따로 구현하는 것은 말도 안되기 때문이다.

 

때문에 일반적으로는 try catch로 처리한다. 이번처럼 특수한 케이스 외에도 쓸일이 있을지 모르겠다.


공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함