카테고리 없음

Filter, Interceptor, AOP 개념과 용도 비교

suesoo 2023. 9. 24. 03:11
Filter, Interceptor, AOP 개념과 용도 비교

스프링 시큐리티를 공부하면서 filter, Interceptor, AOP에 대해 공부하면서
웹 개발을 하다 보면 공통적으로 처리해야 하는 부분이 있는데 (로그, 페이지, 로그인 관련 등)

중복된 코드를 줄이고 공통업무에 관련된 코드를 따로 빼서 처리 해주는게 아래의 3가지였다.

 

1. Filter

2. Interceptor

3. AOP

 

스프링에서 해당 세 가지 기능은 로직 수행 전 먼저 실행하거나 , 로직 후에 실행하거나 할 때 사용되며
호출되는 시기가 다르다.

 

Filter, Interceptor, AOP 흐름


1. Filter

▶ Filter의 역할

- Filter는 Dispatcher Servlet이 실행되기 전에 수행된다.(Dispatcher Servlet은 적합한 컨트롤러를 위임하는 역할)

- 요청과 응답을 가로채 처리하기 위한 컴포넌트, 웹 애플리케이션의 요청과 응답에 적용

- 스프링과 무관하게 전역적으로 처리해야 하는 작업을 수행한다.

 

▶ Filter의 특징

  • Filter는 Servlet 스펙의 일부로, 스프링 프레임워크와 독립적으로 사용 가능 (스프링과 분리되어야 하는 기능 적용가능)
  • Dipatchr Servlet 전/후 ServletRequest/ServletResponse 객체 변경과 조작 수행이 가능 ( 다른 객체로 변경하여 전달가능)
  • 주로 요청/응답의 필터링, 문자열 인코딩, 보안 검사, 로깅, 이미지/데이터 압축등과 같은 작업 수행
  • Filter는 서블릿컨테이너에서 관리하므로 Spring의 ApplicationContext와 별개의 라이프사이클을 가짐
  • 스프링에서 제공하는 DelegatingFiterProxy로 프락시 필터 형태로 빈 등록 가능

▶ Filter의 메서드

- init() - 필터 인스턴스 초기화

- doFilter() - 요청, 응답이 서블릿에 전달되기 전 후로 수행된다.

- destroy() - 필터 인스턴스 종료

 

▶ Filter 코드 예시

public interface Filter {
 
    public default void init(FilterConfig filterConfig) throws ServletException {}
 
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException;

2. Interceptor

▶ Interceptor의 역할

- Spring Interceptor는 Spring MVC에서 요청을 가로채고 컨트롤러의 요청 전/후에 추가적인 로직을 수행하는 데 사용

 

 Interceptor의 특징

  • Spring Context 내부에서 컨트롤러의 요청과 응답에 관여
  • Dispatcher Servlet 이후 컨트롤러 호출 전/후에 끼어들어 기능 수행
  • 예외 발생 시 @ControllerAdvice에서 @ExeptionHandler를 사용해 예외 처리
  • 로그인 체크, 로그 확인, 권한 체크, 프로그램 실행 시간 계산 작업 같은 작업 수행
  • 스프링 모든 빈 객체에 접근 가능
  • 스프링과 연관이 많은 작업을 하기 쉬움

▶ Interceptor의 메서드

- preHandler() - 컨트롤러 메서드 실행 전 ( 컨트롤러 이전 전처리 작업 또는 요청 정보를 가공하거나 추가하는 경우 사용)

- postHandler() - 컨트롤러 메서드 실행 직후 (컨트롤러 호출 후 실행돼서 후처리 작업에 사용)

- afterCompletion() - 뷰 페이지 렌더링 되고 난 후( 모든 작업이 완료된 후에 실행)

 

▶ Interceptor 코드 예시

public interface HandlerInterceptor {
 
	default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
 
		return true;
	}
 
	default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			@Nullable ModelAndView modelAndView) throws Exception {
	}
 
	default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
			@Nullable Exception ex) throws Exception {
	}

3. AOP

▶ AOP의 역할

- OOP를 보완하기 위해 나온 개념이고 AOP는 관점 지향 프로그래밍으로
애플리케이션 전체에 걸쳐서 중복되는 기능을 모듈화 하고 재사용 가능하게 함.

 

 

▶ AOP의 특징

  • 로깅, 트랜잭션, 에러처리 등 비즈니스 로직에서 세밀하게 조정할 때 사용
  • 메서드 실행, 예외 처리, 메소드 호출/전후 등과 같은 관심사를 분리하여 모듈화
  • 메소드 전후 지점에서 자유롭게 설정 가능
  • 프락시를 사용하여 관점을 적용하며, 메서드 수준의 측면을 정의
  • 주소, 파라미터, 애노테이션 등 다양한 방법으로 대상을 지정
  • Advice의 경우 JoinPoint, ProceedingJoinPoint를 활용하여 호출

 

▶ AOP의 메서드

- @Before - 대상 메서드의 수행 전

- @After - 대상 메서드의 수행 후

- @After-returning - 대상 메서드의 정상적인 수행 후

- @After-throwing - 예외발생 후

- @Around - 대상 메서드의 수행 전, 후

 

▶ AOP 코드 예시

@Aspect
@Component
class LogAspect {
     val log: Logger = LoggerFactory.getLogger(LogAspect::class.java)
    
      @Before("bean(*Controller)")
      fun beforeLog(joinPoint: JoinPoint) {
      	log.info("전체 Controller @Bean 호출 전 실행되는 로그")
      }
      
      @After("execution(* com.test.service.*.*(..))
      fun beforeLog(joinPoint: JoinPoint) {
      	log.info("service 패키지의 모든 메소드 호출 후 실행되는 로그")
      }
}

4. Filter vs Interceptor vs AOP 정리

1. 적용 시점

Filter -> Interceptor -> AOP

 

2. 실행 위치

- Filter : WAS 웹 콘텍스트에서 실행

- Interceptor : 스프링 컨텍스트 실행

- AOP : 메서드 앞에 프락시 패턴의 형태로 실행

 

3. 관리 컨테이너

- Filter : 웹 컨테이너

- Interceptor : 스프링 컨테이너

- AOP : 컨테이너에 종속 X

 

3. 결론

- Filter

서블릿 스펙에서 제공하는 요청/응답 필터링을 위한 기능으로 전체적인 요청에서 처리가 필요할 때 사용

(공통된 보안 인증/인가 작업, 스프링과 분리되어야 하는 기능)

 

- Interceptor

스프링 MVC에서 컨트롤러의 전/후에 추가 작업을 수행하고 http 프로토콜 단위로 처리해야 하는 업무에 사용

(API 호출에 대한 로깅, 컨트롤러로 넘겨주는 정보 가공)

 

- AOP

애플리케이션 전반에 걸쳐서 관심사를 모듈화 하기 위한 프로그래밍 패러다임으로 비즈니스 단에서 세밀한 조정 필요시 사용

(로깅, 트랜잭션, 보안, 캐싱)

 

참고

https://carnival.tistory.com/77

https://goddaehee.tistory.com/154

https://dev-coco.tistory.com/173