inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

@ControllerAdvice

안녕하세요! 질문이 있습니다.

796

ygh

작성한 질문수 19

0

안녕하세요! 항상 좋은 강의 감사드립니다.

@ControllerAdvice 공부하다가 궁금증이 생겨 질문 드립니다.

혹시, Controller에서 발생한 예외 말고, interceptor의 preHandle(), postHandle(), afterCompletion() 메서드 내에서 발생하는 예외도 @ControllerAdvice나 @ExceptionHandler로 잡을 수 있나요??

interceptor ControllerAdvice MVC spring

답변 3

1

김영한

답변을 수정해두었습니다. 참고해주세요.

1

김영한

안녕하세요. ygh님

인터셉터도 @ControllerAdvice로 예외 처리를 할 수 있습니다. 아마 설정을 잘못하신 것 같아요.

감사합니다.

0

김영한

안녕하세요 ygh ^^

제가 직접 정답을 알려드릴 수 도 있지만, 그러면 더 많은 것을 얻어가지 못합니다.

개발자는 궁금한 부분을 직접 코드로 테스트 해볼 때 가장 많이 배울 수 있습니다.

해당 부분을 코드로 직접 테스트해보시고, 그 결과를 공유해주세요. 그러면 함께 공부하는 분들께도 큰 도움이 될거에요.

그럼 테스트 해보시고 결과도 정리해서 공유 부탁드립니다.

감사합니다.

0

ygh

맞습니다. 영한님 :)

일단, 제가 이런 고민을 하게 된 배경부터 말씀드리겠습니다.

강의시간을 통해 스프링에서는 컨트롤러 밖으로 던져진 예외를 해결하는 방법으로, HandlerExceptionResolver라는 방법을 제공한다고 배웠습니다.

또한, 스프링에서는 기본적으로 HandlerExceptionResolver을 구현하는 3개의 ExceptionResolver가 있다고 배웠습니다. (ExceptionHandlerExceptionResolver, ResponseStatusExceptionResolver, DefaultHandlerExceptionResolver)

DispatcherServlet을 직접 까서 코드를 확인해 본 결과, 3개의 Resolver의 우선순위대로 루프를 돌려 각 Resolver 구현체를 얻어가며, 에러를 어떻게 처리할지 정하는 메커니즘으로 동작하고 있다고 이해했습니다. (우선순위가 높은 resolver에서 예외 처리가 가능하면 이후 resolver 스킵하고 루프 break)

그렇다면, Interceptor도 어쨌든 DispatcherServlet를 통해 동작하기 때문에, 컨트롤러뿐만 아니라 Interceptor의 preHandle(), postHandle(), afterCompletion() 내에서 발생하는 예외도 ExceptionHandlerExceptionResolver의 @ExceptionHandler와 @ControllerAdvice로 처리 수 있을 것이라고 생각했습니다.

그래서 저희 수업시간에 작성했던 LogInterceptor에서 다음과 같이 예외 처리를 시도해 보았습니다.

@Slf4j
public class LogInterceptor implements HandlerInterceptor {

    public static final String LOG_ID = "logId";

    @ResponseStatus(HttpStatus.BAD_REQUEST)
    @ExceptionHandler(IllegalArgumentException.class)
    public ErrorResult illegalExHandle(IllegalArgumentException e) {
        log.error("[exceptionHandle] ex", e);
        return new ErrorResult("BAD", e.getMessage());
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse
            response, Object handler) throws Exception {
        String requestURI = request.getRequestURI();
        String uuid = UUID.randomUUID().toString();
        request.setAttribute(LOG_ID, uuid);
        log.info("REQUEST  [{}][{}][{}][{}]", uuid,
                request.getDispatcherType(), requestURI, handler);

        throw new IllegalArgumentException("preHandle에서 예외 발생!");

//        return true;
    }

    ...

그런데, 디버깅 결과 예외를 처리할 수 있을것이라는 예상과는 달리, 제가 작성한 @ExceptionHandler 메서드에서는 preHandle(), postHandle(), afterCompletion()에서 발생한 예외를 처리하지 못했습니다.

혹시 제가 아예 잘못 생각하고 있는 걸까요...?ㅠ 아니면, 코딩 방식이 잘못된걸까요??

이미지 업로드와 db 트랜잭션 묶는법

0

46

1

Could not resolve org.springframework.boot:spring-boot-starter-validation:2.4.4

0

55

2

MessageSourceTest 코드

0

49

1

인터셉터 에러 설정

0

48

1

resolveArgument()메서드 질문

0

58

1

43강 검증1 에서 실패 로직 관련 질문있습니다.

0

60

2

타임리프 3.X 버전 rendering, serializer 에러 해결 방법

2

133

3

스프링 빈에 등록이 안되는거 같은데 어떻게 하면 좋을까요?ㅠㅠ

0

93

3

pdf 오타 문의

0

57

1

ItemUpdateForm 검증 관련 질문입니다.

0

50

1

22page 링크 주소 변경

0

59

2

특정 데이터와 파일을 함께 저장 시, 테이블 구조 질문

0

53

1

섹션3번 수업에 대한 질문입니다.

0

80

2

@Autowired 보다 더 좋은 방법이 어떤 걸까요?

0

87

2

타입컨버터 가 람다랑 비슷해 보이는데 저의 생각이 맞는지?.

0

66

1

자바스크립트 인라인에서 객체 직렬화 시 오류가 납니다

0

143

3

스프링부트 - 오류페이지2 에서 500.html 에서 쓰인 객체 질문

0

65

1

톰캣 에러 페이지가 안보입니다.

0

104

2

apiEceptionController에서 센드 에러 호출하면 안되는지?

0

81

1

세션 타임아웃시 쿠키 삭제 방법이 없나요?

0

118

2

ApiExceptionController 질문드립니다.

0

64

1

셀렉박스 챕터에서 option value에 ==배송 방식 선택== 이것을 넣은 이유가 궁금함, 이렇게 구상해도 되는지?

0

66

1

MemberRepository 필드의 fianl 선언 유무

0

85

2

혹시 index.html 에서는 fragment 사용이 안되는건가요

0

59

1