Spring - Filter vs Interceptor


Filter 와 Interceptor 는 언제 사용하는가?

  • 애플리케이션에서 로직을 작성할 때 중복적으로 일어나는 로직을 공통 관심사 라고 한다.

  • Filter 와 Interceptor 둘 다 그러한 공통 관심사 를 처리할 때 사용한다.



Filter 란?

  • Servelt 에서 제공한다.

  • 리소스에 대한 요청이나, 리소스의 응답 또는 둘 다에 대한 필터링 작업을 수행하는 객체이다.

  • 즉, Request 나 Response 객체를 직접적으로 조작 할 수 있다.

  • Web Context 안에 있으며, 클라이언트가 Spring Context의 Dispatcher Servelt 에 도달하기 전에 동작한다.

  • 필터링 되듯, 처리된다.



Interceptor 란?

  • Spring 에서 제공한다.

  • 디스패쳐 서블릿이 컨트롤러를 호출하기 전, 후에 Request 나 Response 를 참조하거나 가공할 수 있는 기술이다. ( 그것이 공톰 관심사를 처리하는 것이다. )

  • 가로채는 느낌으로 가져가서 공통 관심사를 처리한다.



정리

  • Filter 와 Interceptor 둘 다 그러한 공통 관심사 를 처리할 때 사용한다.

  • Filter

    • 웹 컨테이너에서 동작한다.

    • 필터를 실행하기 위해서는 직접 코드를 구현해 주고 호출 하여야 한다.

        chain.doFilter(request, response);
      
    • request, response 객체를 직접 변경할 수 있음.

    • doFilter() 하나만 제공

    • 공통된 보안 및 인증/인가 관련 작업이나, 모든 요청에 대한 로깅, 이미지/데이터 압축 및 문자열 인코딩, 스프링과 분리되어야 하는 전역적인 기능 에 사용한다.

      • 필터는 인터셉터보다 앞단에서 동작하기 때문에 보안 검사(XSS 방어 등)를 하여 올바른 요청이 아닐 경우 차단할 수 있다.

      • 그러면 스프링 컨테이너까지 요청이 전달되지 못하고 차단되므로 안전성을 더욱 높일 수 있다.


  • Interceptor

    • 스프링 컨테이너에서 동작한다.

    • 인터셉터를 실행하기 위해 직접 코드를 구현할 필요는 없다.

    • request, response 객체를 직접 변경할 수 없음.

    • 단계적으로 세분화 하여 기능을 제공한다

      • preHandle ( 컨트롤러 호출 전 )

      • postHandle ( 컨트롤러 호출 후 )

      • afterCompletion ( 요청 완료 후 )

    • 세부적인 보안 및 인증/인가 공통 작업, API 호출에 대한 로깅 및 감사, 그리고 Controller 로 넘겨주는 데이터 가공에 주로 사용한다.

      • 인터셉터는 필터와 다르게 HttpServletRequest나 HttpServletResponse 등과 같은 객체를 제공받으므로 객체 자체를 조작할 수는 없다.

      • 대신 해당 객체가 내부적으로 갖는 값은 조작할 수 있으므로 컨트롤러로 넘겨주기 위한 정보를 가공하기에 용이하다.

    • 우리는 스프링을 이용해서 개발을 하기 때문에, 정말 전역적으로 사용해야 하는 로직이 있지 않는이상, 스프링에 의존적인 인터셉터를 사용하는 것이 좋다.



그럼 스프링에서의 AOP 는?

  • 인터셉터 대신에 컨트롤러들에 적용할 부가기능을 어드바이스로 만들어 AOP를 적용할 수도 있다.

  • 하지만 다음과 같은 이유들로 컨트롤러의 호출 과정에 적용되는 부가기능들은 인터셉터를 사용하는 편이 낫다.

    • 컨트롤러는 타입과 실행 메소드가 모두 제각각이라 포인트컷(적용할 메소드 선별)의 작성이 어렵다.

    • 컨트롤러는 파라미터나 리턴 값이 일정하지 않다.

  • 즉, 타입이 일정하지 않고 호출 패턴도 정해져 있지 않기 때문에 컨트롤러에 AOP를 적용하려면 번거로운 부가 작업들이 생기게 된다.

  • AOP는 애플리케이션 전체에 걸쳐 일관된 관심사를 분리할 때 사용하는 것이 좋다.

    • 예를들면 예외처리, 트랜잭션 등이 있을 수 있다.






results matching ""

    No results matching ""