티스토리 뷰

반응형

 

reference: jeong-pro.tistory.com/195

 

@ControllerAdvice, @ExceptionHandler를 이용한 예외처리 분리, 통합하기(Spring에서 예외 관리하는 방법, 실

예외 처리 과정 프로그래밍에서 예외 처리는 아주 중요하면서도 아주 어렵다. 과하다할 만큼 상세하고 다양하게 예외를 잡아 처리해준다면, 클라이언트도 그렇고 서버도 그렇고 더 안정적인 프

jeong-pro.tistory.com

 

서버 개발하면서 익셉션 컨트롤을 해야 하는 경우가 종종 생깁니다.

예를 들어 회원의 세션이 만료된 경우 세션 익셉션을 던져주는 경우가 있죠.

    public String getUsernameInCache(HttpSession session) {
        User user = findUserBySession(session);
        if(user == null) {
            throw new UnauthorizedUserException("세션이 만료되었습니다.");
        }
        String redisKey = "USERNAME:" + user.getUsername();
        String redisValue = valueOperations.get(redisKey);
        return (StringUtils.isBlank(redisValue)) ? null : redisValue;
    }

위의 사례는 캐시메모리(Redis)에 저장된 세션에 접속한 사용자의 명을 가져오는 메소드입니다.

하지만 위의 경우 user == null 의 조건에서 걸리는 경우가 있습니다. 바로 서버가 재배포되어 세션이 초기화되는 경우인데요, 이러한 경우 익셉션 핸들링을 하려고 하여도 클라이언트에서는 500에러가 나면서 문제가 발생했다고 밖에 출력이 되지 않습니다.

이를 해결하기 위해서 다른 에러 핸들링 방법을 찾아보다가 @ControllerAdvice 라는 어노테이션이 있음을 확인하였습니다. 

 

사용 방법은 정말 간단하고, 모든 컨트롤러의 적용 범위 내에서 이 어노테이션이 동작한다는 것을 알았습니다. 

아래는 위의 익셉션을 핸들링해주는 소스의 샘플입니다.

@ControllerAdvice
public class ExceptionsAdvice {

    @ResponseBody
    @ExceptionHandler(UnauthorizedUserException.class)
    public ResponseEntity unauthorizedUserExceptionHandler(UnauthorizedUserException exception) {
        Map body = Map.of("status", HttpStatus.UNAUTHORIZED.value(), 
                "error", HttpStatus.UNAUTHORIZED.getReasonPhrase(),
                "message", "세션이 만료되었습니다.");
        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(body);
    }
}

이렇게 적용하면 모든 범위내에서 UnauthorizedUserException 이 발동하였을 경우 해당 메소드를 호출하게 됩니다. 

반응형
댓글
공지사항