
이미지 출처

이미지 출처
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)으로 정의된 지점에서 실행 |
출처