본문 바로가기
FrameWork/Spring

Spring Interceptor

by titlejjk 2023. 6. 23.

어제 수업중에 Spring의 interceptor(인터셉터)에 대해서 배웠다. 배우다보니 기능은 Java를 공부할 때 배웠던 Filter와 비슷한 기능을 가진것 같았다. 여러 작업을 처리하면서 그 전에 처리를 해주는 작업이라는 공통점은 알겠지만 필터와 인터셉터의 차이와 장단점에 대해서 공부해보았다.

 

우선 필터Filter

Filter는 Spring을 배우기전에 JSP와 Servlet을 공부했을 당시 배웠기 때문에 스프링에서 지원하는 기능이 아니라는 점만 인지 하고있었다. 찾아보니 J2EE표준 스펙에 있는 기능으로써 가장 진입지점으로 설정되어 있는 Controller의 Dispatcher Servlet에 요청의 전/후로 부가적인 작업을 처리할 기능을 제공하고 조건에 맞게 작동한다.

주로 사용할 때 @WebFilter 어노테이션으로 사용해 등록하며 간략적인 구조는 아래와 같다.

다음으로 인터셉터 Interceptor

Interceptor(이하 인터셉터)는 Spring Framework에서 제공하는 기능 중 하나로, 웹 애플리케이션의 요청과 응답 처리 사이에 처리를 삽입하고자 할 때 사용된다. Interceptor를 사용하면 요청 전후에 특정한 작업을 수행할 수 있으며, 주로 인증, 로깅, 트랜잭션 처리 등을 구현하는 데활용된다.

인터셉터를 구현하려면 다음 단계를 따를 수 있다.

  1. HandlerInterceptor 인터페이스

    preHandle 메소드 👉 컨트롤러의 실행 전에 호출되며, 요청의 처리 전에 수행할 작업을 구현한다. boolean값을 반환하며, false를 반환하면 요청을 처리하지 않고 중단할 수 있다.

    postHandle 메소드 👉 컨트롤러의 실행 후, 뷰가 렌더링 되기 전에 호출되며, 요청의 처리 이후에 수행할 작업을 구현한다.

    afterCompletion 메소드 👉 뷰의 렌더링까지 완료된 후에 호출되며, 요청의 처리가 완전히 끝난 후에 수행할 작업을 구현한다.

  2. 구현한 Interceptor를 등록

    등록 방법은 XML구성 파일이나 Java설정 클래스를 사용할 수 있다. XML구성파일에서는 mvc:interceptors 요소를 사용하여 등록할 수 있고 Java 설정 클래스에서는 WebMvcConfigurer 인터페이스를 구현하고 addInterceptors 메소드를 오버라이딩 하여 등록할 수 있다.

스프링의 인터셉터와 필터는 모두 웹 애플리케이션에서 요청과 응답을 처리하는데 사용되지만 몇 가지 중요한 차이점이 있다.

인터셉터는 다양한 상황에서 활용될 수 있는데, 로그인 인증을 처리하기 위해 인증 정보를 확인하고 인증되지 않은 요청을 거부하는 작업을 할 수도있고 요청과 응답의 로깅을 수행하여 디버깅 및 모니터링에 활용할 수도 있다.

 

  1. 적용 범위

    인터셉터는 스프링 프레임워크 내부에서 동작하며, 주로 컨트롤러와 관련된 요청 처리 과정에서 작동한다. 따라서 스프링 컨텍스트와 밀접한 관련이 있다.
    필터는 Servlet 스펙에 정의된 기능으로, 웹 애플리케이션의 모든 요청과 응답에 대해 작동한다. 따라서 스프링과는 독립적으로 동작하며, 웹 서버와 서블릿 컨테이너 사이에 동작한다.

  2. 작동 순서

    인터셉터는 스프링 MVC의 핸들러 매핑과 핸들러 어뎁터 사이에서 작동한다. 따라서 컨트롤러에 진입하기 전과 후에 동작한다.
    필터는 서블릿 컨테이너의 요청 체인에서 작동한다. 따라서 서블릿 컨테이너의 필터 체인에 등록된 순서대로 동작한다.

  3. 기능

    인터셉터는 주로 요청 전후에 특정 작업을 수행하며, 이증, 로깅, 트랜잭션 처리등과 같은 컨트롤러 관련 작업에 사용된다.
    필터는 요청과 응답의 내용을 변경하거나, 요청을 필터링하거나 가공하는데 사용된다. 예를 들어, 인코딩 변환, XSS방지 캐시 등과 같은 일반적인 웹 애플리케이션 필터링 작업에 사용된다.
  4. 설정

    인터페이스는 MVC설정에서 HandlerInterceptor를 구현한 클래스를 등록하여 사용한다.
    필터는 javax.servlet.Filter인터페이스를 구현한 클래스를 web.xml파일이나 서블릿 컨테이너의 설정 클래스에서 등록하여 사용한다. 또는 스프링의 FilterRegistrationBean을 사용하여 등록할 수도 있다.

인터페이스와 필터는 각각의 목적과 사용 사례에 따라 선택되어야 한다.

'FrameWork > Spring' 카테고리의 다른 글

관심사 분리  (0) 2023.07.10
AOP란?🧑‍💻  (0) 2023.07.01
Spring DI(Dependency Injection)  (0) 2023.06.19
MyBatis  (0) 2023.06.19
@RequestMapping  (0) 2023.06.16

댓글