본문 바로가기

Spring

Interceptor

훈수/저작권 관련 지적 환영합니다 - 댓글 또는 audgnssweet@naver.com

Interceptor란?


스프링에서도 Interceptor는 중간에 요청을 가로채서 처리를 해주는 기능을 합니다.
클라이언트로부터 들어오는 요청과 Controller을 거쳐 나가는 응답을 가로채서 특정 처리를 해주는 녀석입니다.



그림으로 보는 Interceptor


spring request lifecycle

클라이언트의 요청은 DispatcherServlet을 거친 이후에 Controller로 가기 전에 Interceptor을 거치게 됩니다.

그렇다고 해서 모든 요청이 interceptor을 거쳐야만 하는 것은 아닙니다. 개발자가 설정하기에 따라 특정 URL을 요청할 때만 Interceptor을 거치게 할 수 있습니다.



Interceptor 사용 이유


인터셉터는 주로 로그인 처리에 이용됩니다. 이유는 Interceptor의 호출 위치와 관련이 깊습니다.

 

만약 로그인된 사용자만 사용할 수 있는 Controller가 있다고 생각해보겠습니다.

모든 Controller에 Session을 확인하여 로그인된 사용자인지 체크하는 로직이 들어가야 할 것이고

이는 반복되는 코드가 많아져 개발도 힘들뿐더러 유지보수도 힘들어질 것입니다.

이럴 때 로그인 한 사용자만 호출할 수 있는 Controller(의 주소)을 Interceptor에 등록합니다.

Interceptor에서는 로그인이 되어있는지를 체크하는 로직을 한 번만 구현하게 된다면

등록된 모든 Controller 대해서 일관적으로 로그인을 체크할 수 있습니다.

이는 개발비용과 유지보수에 매우 유리하다고 상식적으로 생각할 수 있습니다.



Interceptor? Filter? AOP?


이미지 출처 : https://goddaehee.tistory.com/154

어떤 차이가 있는지 알아보겠습니다.

요청은 Filter -> Interceptor -> AOP 순으로 거치게 됩니다.

  • Filter
    요청을 받는 최 앞단으로 web.xml에 등록됩니다.
    주로 인코딩(한글 등), xss공격 등을 방어하는 용도로 사용됩니다.
  • Interceptor
    설명은 위에서 했으니 생략하겠습니다.
    <필터와의 차이>
    1. 호출 시점
    2. Interceptor는 스프링 내 영역이므로 스프링의 모든 빈에 접근이 가능합니다.
  • AOP
    가장 Controller와 가까운 시점에서 호출됩니다.
    서비스의 핵심기능과 공통 기능을 분리시켜, 핵심 기능들에서 공통 기능을 사용할 수 있도록 하는 것입니다.
    트랜잭션/로그/인증/보안 등에 주로 사용합니다.

Interceptor 사용 방법


Interceptor을 사용하기 위해서는
1. HandlerInterceptorAdaptor를 구현한다.
2. WebMvcConfigurer를 구현한 클래스(혹은 web.xml)에 Interceptor을 등록해줍니다.

자세한 과정은 사용 예시에서 확인해보겠습니다.



사용 예


1. HandlerInterceptorAdaptor를 구현한 클래스를 만든다.

public class LogInterceptor extends HandlerInterceptorAdapter {

    private final Logger logger = LoggerFactory.getLogger(this.getClass());

    //컨트롤러 메서드가 실행되기 이전
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
        Object handler) throws Exception {
        logger.debug("{} 가 호출되었습니다.", handler.toString());
        return true;
    }

    //컨트롤러 메서드가 실행된 이후
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
        ModelAndView modelAndView) throws Exception {
        logger
            .debug("{}가 종료되었습니다. {}를 view로 사용합니다.", handler.toString(), modelAndView.getViewName());
    }

}

컨트롤러가 실행되기 이전, 이후 등에 어떤 동작을 실행할지 개발자가 직접 구현할 수 있습니다.

2. WebMvcConfigurer를 구현한 클래스(혹은 web.xml)에 Interceptor을 등록해줍니다.

@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new LogInterceptor()).addPathPatterns("/members/**");
}

addPathPatterns 메서드를 붙여주지 않으면, 모든 요청이 Interceptor을 거쳐가게 됩니다.


 

'Spring' 카테고리의 다른 글

Argument Resolver  (0) 2021.03.02
Controller  (0) 2021.03.02