Spring Interceptor 적용하기

최준호·2022년 8월 31일
0

Spring

목록 보기
39/47
post-thumbnail

👏 Interceptor란?

웹에서 Request가 일어났을 때

url request -> filter -> servlet -> interceptor -> controller -> service -> return

순서로 일어날 수 있다. 여기서 servlet부터는 was의 영역이라 생각하면 되고 was 전의 실행에서 무언가를 하고 싶다면 filter에서 작업을 진행하며 이미 servlet으로 http를 파싱한 데이터에 대해 작업을 진행하고자 한다면 interceptor에서 작업을 진행하면 된다.

다시 정리하면 filter와 interceptor는 사용자의 request를 중도에 가로채서 인증을 진행하거나 반환 하기 전 데이터를 다시 점검하는 등의 작업을 진행할 수 있게 도와준다.

언뜻 어려울거 같지만 Spring에서 제공하는 기능을 사용하면 몇개의 class를 구현하는 것으로만 바로 실행해볼 수 있다.

📗 Interceptor

📄 Interceptor 만들기

Spring에서 제공하는 HandlerInterceptor를 상속받아 메서드를 구현하기만 하면 된다.

@Slf4j
public class LogInterceptor implements HandlerInterceptor{

    String id = "";

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        id = UUID.randomUUID().toString().substring(10);
        log.info("[{}] preHandle... interceptor 실행", id);
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("[{}] postHandle... interceptor 실행", id);
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("[{}] afterCompletion... interceptor 실행", id);
    }
}

상속받은 메서드 중 실제 구현한 메서드는 preHandle postHandle afterCompletion 들을 구현했고 preHandle의 경우 return 값이 true일때 나머지 postHandle과 afterCompletion을 계속 실행할 수 있고 false일 경우 preHandle 이후 interceptor가 실행되지 않는다.

실행 순서는

preHandle -> postHandle -> afterCompletion

순서로 실행된다.

📄 Intercetpor 등록

@Configuration
public class InterceptorConfig implements WebMvcConfigurer{

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LogInterceptor())
        .order(1)   // interceptor에서 실행 순서
        .addPathPatterns("/**") // interceptor가 실행될 url 패턴 (배열 형식으로 입력 가능)
        //.excludePathPatterns("")    // interceptor가 실행되지 않을 url 패턴 (배열 형식으로 입력 가능)
        ;
    }
}

이렇게 WebMvcConfigurer를 상속받아 addInterceptors 메서드만 구현해주면 된다. registry에 등록할 인터셉터를 넣어주고 order와 기타 옵션을 설정해줄 수 있다.

📄 실행해보기

실제로 controller에 테스트 url을 만들어서 요청하게 되면 다음과 같이 실행된다.

만약 위에서 preHandle에서 false를 반환하면?

다음과 같이 preHandle 이후 동작이 진행되지 않는다.

interceptor 이후의 controller와 service도 동작하지 않는다. 만약 interceptor에서 인증이 일어난 뒤 실패했다면 실패했다는 return과 return 값을 false로 주면 된다. 하지만 이것보다는 예외처리하는게 더 깔끔하겠지

반환은 이렇게 나오게 하고

이렇게 실행이 끝나도록 하는게 더 깔끔하다.

profile
코딩을 깔끔하게 하고 싶어하는 초보 개발자 (편하게 글을 쓰기위해 반말체를 사용하고 있습니다! 양해 부탁드려요!) 현재 KakaoVX 근무중입니다!

0개의 댓글