본문 바로가기

Spring

Filter, Interceptor, AOP

 

이번 포스트를 보기 앞서 이전 포스트를 보고 오시기 바랍니다.

https://jaystorage.tistory.com/12

 

Spring Framework의 특징과 작동 과정

이번 포스트를 보기 앞서 이전 포스트를 보고 오시기 바랍니다. https://jaystorage.tistory.com/6 POJO (Plain Old Java Object) 처음 POJO(Plain Old Java Object)라는 개념을 접했을 당시에는 ‘평이하고(아무것도 꾸며

jaystorage.tistory.com

 


 

Spring Framework에서 공통 로직 관리

 

스프링으로 웹 개발을 하다 보면 비즈니스 로직이 호출되기 전이나 후에 공통적으로 처리해야 하는 기능들이 생기기 마련이다. 대표적인 예로 Logging, 인증, 인가, 인코딩 변환 등이 있다.

 

이러한 공통 기능을 한 곳에서 처리하지 않으면 프로그램을 유지보수하기가 상당히 어려워진다. 스프링에서는 Filter, Interceptor, AOP를 통해 이러한 문제점을 해결한다.

 

 

3가지 기능 모두 동일한 역할을 하는 것처럼 보이지만 자세히 보면 실행되는 위치나 작동원리가 다르다. 아래에서는 각 기능의 특징과 역할에 대해 알아보고자 한다.

 


 

Servlet Filter

 

서블릿 필터는 Servlet API 2.3 부터 등장했으며 DispatcherServlet에 요청이 전달되기 전,후에 부가작업을 처리하는 객체이다. 간혹 서블릿 필터가 스프링에 종속적인 기술로 착각하는 사람들이 있는데 서블릿 필터는 스프링이 아닌 자바에서 제공하는 기술이다.

 

파라미터에 Servlet Request와 Servlet Response를 제공해주기 때문에 URL 정보나 HTTP 헤더를 직접 조작하는 것이 가능하다. 이러한 이유로 웹과 관련된 관심사항에 필터가 사용된다. 주로 인코딩 변환 처리나 XSS방어 등에 사용된다.

 

 

Servlet Filter의 메소드

  • init() : 필터 인스턴스 초기화
  • doFilter() : 전/후 처리
  • destroy() : 필터 인스턴스 종료

 

일반적으로 Tomcat에서 서블릿 필터를 사용할 때는 web.xml에 필터를 등록하여 사용한다.

 

<!-- 한글 처리를 위한 인코딩 필터 -->
<filter>
    <filter-name>encoding</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>encoding</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

 


 

Spring Interceptor

 

스프링이 제공하는 기술로 DispatcherServlet이 컨트롤러를 호출하기 전,후 요청에 대해 부가적인 작업을 처리하는 객체이다. 스프링 인터셉터도 서블릿 필터와 마찬가지로 파라미터에 Servlet Request와 Servlet Response를 제공해주기 때문에 URL 정보나 HTTP 헤더를 직접 조작하는 것이 가능하다. 이러한 이유로 웹과 관련된 관심사항에 스프링 인터셉터가 사용된다.

 

하지만 서블릿 필터는 스프링 컨텍스트 외부에 존재하여 스프링과 무관한 자원에 대해 동작한다. 반면 스프링 인터셉터는 스프링의 DistpatcherServlet이 컨트롤러를 호출하기 전, 후로 끼어들기 때문에 스프링 컨텍스트(Context, 영역) 내부에서 Controller(Handler)에 관한 요청과 응답에 대해 처리한다.

 

이러한 특징 덕에 스프링 인터셉터는 로그인 체크, 권한체크, 프로그램 실행시간 계산작업 로그확인 과 같은 기능을 구현할 때 사용된다.

(만약 JWT 토큰 정보를 파싱해서 컨트롤러에게 사용자의 정보를 제공하도록 가공해야 한다면 서블릿 필터가 아니라 스프링 인터셉터에서 구현하는 것이 좋다.)

 

 

Spring Interceptor의 메소드

  • preHandle() : 컨트롤러 메서드가 실행되기 전
  • postHandle() : 컨트롤러 메서드 실행직 후 view페이지 렌더링 되기 전
  • afterCompletion() : view페이지가 렌더링 되고 난 후

 

Spring AOP

 

Spring AOP는 스프링에서 제공하는 기능 중 하나로 관점 지향 프로그래밍을 지원하는 기술이다. 객체 지향 프로그래밍을 했을 때 중복을 줄일 수 없는 부분을 줄이기 위해 종단면(관점)에서 바라보고 처리한다.

 

Spring AOP는 주로 '로깅', '트랜잭션', '에러 처리'등 비즈니스단의 메서드에서 조금 더 세밀하게 조정하고 싶을 때 사용된다. Interceptor나 Filter와 달리 메소드 전후의 지점에 자유롭게 설정할 수 있다. (Spring AOP는 Proxy 패턴을 사용하기 때문 – 해당 메소드를 감싸는 Proxy 객체를 생성한다)

 

Interceptor와 Filter는 주소로 대상을 구분해서 걸러내야하는 반면, Spring AOP는 주소, 파라미터, 어노테이션 등 다양한 방법으로 대상을 지정할 수 있다.

 

Spring AOP의 Advice와 HandlerInterceptor의 가장 큰 차이는 파라미터이다. Advice의 경우 JoinPoint나 ProceedingJoinPoint 등을 활용해서 호출한다. 반면 HandlerInterceptor는 Filter와 유사하게 HttpServletRequest, HttpServletResponse를 파라미터로 사용한다.

 

 

Spring AOP의 어노테이션

  • @Before : 대상 메서드의 수행 전
  • @After : 대상 메서드의 수행 후
  • @After-returning : 대상 메서드의 정상적인 수행 후
  • @After-throwing : 예외발생 후
  • @Around : 대상 메서드의 수행 전/후

출처 : 
https://goddaehee.tistory.com/154
https://velog.io/@miot2j/Spring-Filter-Interceptor-AOP-%EC%B0%A8%EC%9D%B4-%EB%B0%8F-AOP%EB%A5%BC-%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC-Logging%EC%9D%84-%EA%B5%AC%ED%98%84%ED%95%9C-%EC%9D%B4%EC%9C%A0
https://www.youtube.com/watch?v=v86B35pwk6s
https://adjh54.tistory.com/133
https://memodayoungee.tistory.com/114

 


 

'Spring' 카테고리의 다른 글

AOP와 Spring AOP  (0) 2024.06.26
SL4J와 Logback을 이용한 Logging  (0) 2024.03.03
Spring Framework의 특징과 작동 과정  (1) 2023.11.18
JSP(Java Server Page)  (0) 2023.11.12
서블릿(Servlet)  (0) 2023.11.06