[Spring Framework]필터, 인터셉터, AOP의 차이

·2024년 12월 2일
0

Spring Framework

목록 보기
2/3


이미지 출처

이미지 출처


1. 필터(Filter)

  • 디스패처 서블릿에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공한다
  • 필터는 스프링 범위 밖에서 처리된다
  • 즉, 스프링 컨테이너가 아닌 톰캣과 같은 웹 컨테이너에 의해 관리된다
  • 서블릿과 독립적으로 작동하며, 모든 요청에 대해 공통적으로 적용될 수 있다
  • 여러 개의 필터를 체인으로 연결하여 순차적으로 처리할 수 있다
  • 로깅, 인증, 인코딩, CORS 처리 등을 수행하는데 사용된다

✔️ 인터페이스

public interface Filter {

    public default void init(FilterConfig filterConfig) throws ServletException {}

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException;


    public default void destroy() {}
}

✔️ 메서드

▶️ init

  • 필터가 웹 컨테이너에 생성될 때 실행된다
  • 필터 객체를 초기화하고 서비스에 추가하기 위한 메소드이다
  • 필터가 생성될 때 필요한 리소스를 초기화하는데 사용된다
  • 웹 컨테이너가 1회 init 메소드를 호출하여 필터 객체를 초기화하면 이후의 요청들은 doFilter를 통해 처리된다.
  • 설정 파일을 읽거나 데이터베이스 연결을 초기화할 수 있다

▶️ doFilter

  • request, response가 필터를 거칠 때 수행되는 메소드로 체인을 따라 다음에 존재하는 필터로 이동한다
  • chain.doFilter(request, response)를 호출함으로써 다음 필터나 서블릿으로 요청을 전달 할 수 있다

▶️ destroy

  • 필터 객체를 서비스에서 제거하고 사용하는 자원을 반환하기 위한 메소드이다
  • 필터가 소멸될 때 호출된다
  • 데이터베이스 연결을 종료하거나 열린 파일을 닫을 때 유용하다

2. 인터셉터(Interceptor)

  • 스프링이 제공하는 기술
  • 디스패처 서블릿이 컨트롤러 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 기능을 제공한다
  • 스프링 컨텍스트에서 동작한다
  • Spring MVC의 요청 처리 흐름에 통합되어 Spring의 구성 요소와 함께 작동한다
  • 특정 컨트롤러 메서드에 대해 적용할 수 있으며, 요청 URL 패턴에 따라 선택적으로 적용할 수 있다
  • 인증, 권한 확인, 요청 및 응답 변환, 성능 모니터링 등과 같이 비즈니스 로직과 관련된 작업을 수행하는데 사용된다

✔️ 인터페이스

  • org.springframework.web.servlet.HandlerInterceptor
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 {
	}
}

✔️ 메서드

▶️ preHandle

  • 컨트롤러가 호출되기 전에 실행된다. 따라서 컨트롤러 이전에 처리해야 하는 전처리 작업이나 요청 정보를 가공하거나 추가하는 경우에 사용할 수 있다
  • 또한 preHandle 메서드의 3번째 파라미터인 handler 파라미터는 @RequestMapping이 붙은 메소드의 정보를 추상화한 객체이다
  • 반환값이 true인 경우 컨트롤러 호출, false인 경우 작업 중단

▶️ postHandle

  • 컨트롤러가 호출된 후에 실행된다. 그렇기 때문에 컨트롤러 이후에 처리해야 하는 후처리 작업이 있을 때 사용할 수 있다
  • Controller가 호출된 후 View가 Rendering 되기 전에 실행되는 메소드
  • ModelAndView 파라미터를 통해 Controller 결과 데이터 조작이 가능

▶️ afterCompletion

  • 모든 뷰에서 최종 결과를 생성하는 일을 포함해 모든작업이 완료된 후에 실행된다
  • Controller가 호출된 후 view가 정상적으로 렌더링 된 후 실행되는 메소드
  • 리소스를 정리하거나 로깅 작업을 수행하는데 유용하다

3. AOP

  • 관점 지향 프로그래밍으로, 공통 관심사를 모듈화하여 소프트웨어 개발의 복잡성을 줄이고 코드의 재사용성을 높이는 기법이다
  • 애플리케이션의 여러 컴포넌트에 걸쳐 공통적인 관심사를 모듈화하는데 초점을 둔다
  • 특정 메서드 호출 시점을 정의하는 포인트컷과 그 시점에 실행될 어드바이스를 설정한다
  • 비즈니스 로직과는 별개로 공통적으로 적용되는 기능(예: 로깅, 트랜잭션 관리, 보안 등)을 처리하는 데 유용하다
  • 트랜잭션 관리, 로깅 등을 위한 기능을 제공한다

1) 관점(Aspect)

  • AOP의 핵심 구성 요소
  • 공통 관심사를 모듈화한 것

2) 포인트컷(Pointcut)

  • 특정 메서드나 클래스에 AOP 로직을 적용할 대상을 정의한다
  • 포인트컷은 어떤 지점에서 어드바이스가 실행될지를 결정한다

3) 어드바이스(Advice)

  • 포인트컷에서 정의한 지점에서 실행되는 실제 코드
  • 메서드 호출 전후, 예외 발생 시 등 다양한 시점에서 실행될 수 있다
  • Before: 타겟 메서드가 호출되기 전에 실행
  • After: 타겟 메서드가 호출된 후 실행
  • Around: 타겟 메서드를 감싸고, 호출 전후 모두 실행
  • After returning: 타겟 메서드가 정상적으로 반환된 후 실행
  • After throwing: 타겟 메서드에서 예외가 발생했을 때 실행

4) 타겟(Target)

  • AOP 로직이 적용되는 실제 비즈니스 로직을 포함한 객체

5) 프록시(Proxy)

  • AOP는 주로 프록시패턴을 사용하여 구현된다
  • 타겟 객체를 감싸는 프록시 객체를 생성하고, 이 프록시를 통해 메서드 호출을 가로챈다

4. 차이점

항목필터인터셉터AOP
위치java.servlet 패키지Spring MVC 프레임워크AspectJ, Spring AOP 등
적용 범위모든 요청에 대해 적용 가능특정 컨트롤러 메서드에 적용 가능다양한 애플리케이션 컴포넌트에 적용 가능
처리 순서요청 전/후에 처리요청 전/후에 처리메서드 호출 전/후, 예외 발생 시 등 다양한 시점에서 처리
주요 용도로깅, 인증, 인코딩 등인증, 권한 확인, 요청 변환 등트랜잭션 관리, 로깅, 성능 모니터링 등
체인 구조여러 필터를 체인으로 연결 가능인터셉터 체인으로 연결 가능포인트컷(pointcut)으로 정의된 지점에서 실행

출처

profile
백엔드 개발자가 되고 싶어요(22.8.15~)

0개의 댓글