Filter, Interceptor, AOP
Filter, Interceptor, AOP를 사용하는 이유
웹 개발을 하면은 로그인 처리, 권한 체크, XSS 방어, 모바일과 PC 웹의 분기 처리,
로그 기록, 페이지 인코딩 변환 등과 같이 공통적으로 처리해야 할 업무들이 많이 있다.
이러한 공통 업무는 모든 페이지마다 중복된 코드를 작성해야 한다면 코드 중복이 많아지게 되고,
프로젝트가 커질수록 서버 부하가 커질 수 있으며 소스 관리도 어려워진다.
- 코드의 재사용성과 모듈화를 가능하게 함으로써 중복 코드를 줄이고 개발 효율성을 향상시킨다.
- 공통 부분과 핵심 로직을 분리하여 코드의 모듈화와 관심사 분리를 지원하며, 유연한 확장성을 제공한다.
- 관심사 처리를 가능하게 하여 보안, 로깅, 트랜잭션 관리와 같은 공통된 업무를 효과적으로 처리할 수 있다.
Filter, Interceptor, AOP의 흐름
- Filter
- 서블릿 컨테이너에서 동작하며, 웹 애플리케이션의 요청과 응답을 가로채고 필터링 작업을 수행한다.
- 웹 애플리케이션의 일부로 동작하며, 요청 전후에 실행되는 공통 작업을 처리
- 웹 애플리케이션의 디스패처 서블릿 앞단에서 실행되므로, 요청을 처리하기 전과 후에 작업을 수행할 수 있다.
- Interceptor
- 스프링 MVC에서 컨트롤러 호출 전후에 추가 작업을 수행
- HandlerInterceptor 인터페이스를 구현하고, preHandle(), postHandle(), afterCompletion() 메서드를 포함
- 컨트롤러 호출 전후에 실행되며, 컨트롤러의 처리 결과에 대한 후처리 작업을 수행할 수 있습니다.
- AOP (Aspect-Oriented Programming)
- 애플리케이션 전반에 걸쳐 반복적으로 발생하는 공통 부분을 추상화하여 캡슐화하고, 이를 필요한 시점에 적용하여 중복을 제거하고 가독성을 개선합니다.
- 핵심 로직에서 분리된 관점(Aspect)을 정의하고, 이를 핵심 로직에 적용하는 방식으로 동작한다.
- 메서드 실행 전후, 예외 발생 시, 트랜잭션 처리 등과 같은 횡단 관심사를 처리하는 데 사용됩니다.
Filter
Filter는 웹 애플리케이션에서 HTTP 요청 및 응답 데이터를 가로채고 조작하는 기능을 제공하는 서블릿 컴포넌트이다.
요청과 응답을 거른뒤 정제하는 역할을 하며 스프링과 무관하게 전역적으로 처리해야 하는 작업들을 처리할때 사용합니다.
주로 요청의 인코딩 변환, 인증 및 권한 체크, 로깅, 캐싱 등과 같은 공통된 작업을 처리하는 데 사용됩니다.
스프링의 Filter는 서블릿 컨테이너에서 동작하므로 스프링 MVC와 독립적으로 동작한다.
Filter의 주요 메서드
- init(): 필터의 초기화 작업을 수행합니다. 필터가 처음으로 생성될 때 호출
- doFilter(): 실제 필터링 작업을 수행합니다. 요청과 응답을 가로채고 필터링 작업을 수행한 후, 체인의 다음 필터로 전달
- destroy(): 필터의 종료 작업을 수행합니다. 필터가 소멸될 때 호출
@Component
public class CustomFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 필터의 초기화 작업을 수행
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 필터의 로직을 구현하는 메서드입니다.
// 요청을 가로채고 필터링 작업을 수행한 후, 체인의 다음 필터로 전달합니다.
// chain.doFilter() 메서드를 호출하지 않으면 다음 필터나 서블릿으로의 전달이 이루어지지 않습니다.
// 예시: 요청의 인코딩을 설정하는 필터
request.setCharacterEncoding("UTF-8");
// 다음 필터 또는 서블릿으로 요청과 응답을 전달합니다.
chain.doFilter(request, response);
}
@Override
public void destroy() {
// 필터의 종료 작업을 수행하는 메서드입니다.
}
}
Interceptor
Interceptor는 Filter와 비슷하게 요청을 가로채고 처리하는 기능을 제공하는 개념입니다. HTTP 요청과 응답을 가로채서 필요한 로직을 수행하는 역할을 합니다.
Interceptor를 사용를 사용하면 로그인 체크, 권한 검사, 인증 처리 등과 같이 컨트롤러와 관련된 공통된 작업을 처리할 수 있습니다. 또한, 컨트롤러의 실행 전후에 필요한 추가 작업을 수행하여 효율적인 코드 관리와 유지 보수성을 높일 수 있다.
Interceptor의 주요 메서드
- preHandle(): 컨트롤러 호출 전에 실행되는 메서드입니다. 요청을 가로채고 추가 작업을 수행할 수 있습니다. 이 메서드는 boolean 값을 반환하며, true를 반환하면 다음 Interceptor 또는 컨트롤러로 요청이 전달되고, false를 반환하면 요청이 중단되고 처리 과정이 중단됩니다.
- postHandle(): 컨트롤러 호출 후, 뷰 렌더링 전에 실행되는 메서드입니다. 컨트롤러의 처리 결과에 대한 후처리 작업을 수행할 수 있습니다. 이 메서드에서는 ModelAndView 객체에 대한 조작이 가능합니다.
- afterCompletion(): 뷰 렌더링 후에 실행되는 메서드입니다. 모든 작업이 완료된 후에 추가 작업을 처리할 수 있습니다. 예를 들어, 리소스의 해제 또는 로그 기록과 같은 작업을 수행할 수 있습니다.
public class CustomInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 컨트롤러 호출 전에 실행되는 메서드입니다.
// 요청을 가로채고 추가 작업을 수행할 수 있습니다.
// true를 반환하면 다음 Interceptor 또는 컨트롤러로 요청이 전달되고, false를 반환하면 요청이 중단됩니다.
// 예시: 로그인 체크
if (!request.isUserInRole("ROLE_USER")) {
response.sendRedirect("/login");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// 컨트롤러 호출 후, 뷰 렌더링 전에 실행되는 메서드입니다.
// 컨트롤러의 처리 결과에 대한 후처리 작업을 수행할 수 있습니다.
// 예시: 로그 기록
System.out.println("Request processed successfully.");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) throws Exception {
// 뷰 렌더링 후에 실행되는 메서드입니다.
// 모든 작업이 완료된 후에 추가 작업을 처리할 수 있습니다.
}
}
AOP (Aspect-Oriented Programming)
AOP(Aspect-Oriented Programming)는 관점 지향 프로그래밍의 개념을 기반으로 한 기술로, 애플리케이션 전체에 걸쳐 반복적으로 발생하는 공통된 관심사(Cross-cutting Concerns)를 모듈화하여 코드의 재사용성과 유지 보수성을 향상시킵니다.
AOP에서 사용되는 주요 개념
- Join Point
- 애플리케이션 실행 중 특정 시점에서 핵심 로직에 의해 실행되는 지점을 의미합니다.
- Aspect
- 핵심 로직에서 분리되어 적용되는 관심사를 의미합니다.
- 로깅, 보안, 트랜잭션 처리 등이 Aspect의 예시입니다.
- Advice
- 관심사를 언제, 어떻게 적용할지를 정의하는 것입니다.
- Before, After, Around 등의 Advice 유형이 있습니다.
- Before Advice는 핵심 로직 실행 전에 수행되는 작업을 정의합니다.
- After Advice는 핵심 로직 실행 후에 수행되는 작업을 정의합니다.
- Around Advice는 핵심 로직을 가로채서 전/후 처리를 수행하고, 핵심 로직을 직접 실행하는 기능을 갖고 있습니다.
- Pointcut
- Join Point의 일부를 선택하여 Aspect를 적용하는데 사용됩니다.
- 어떤 Join Point가 Aspect에 의해 영향을 받을지를 정의합니다.
- 특정 메서드 호출, 특정 패키지 또는 클래스의 메서드 등을 포함하는 패턴으로 정의됩니다.
- Weaving
- Aspect를 핵심 로직에 적용하는 과정을 의미합니다.
- 컴파일 타임, 로드 타임, 런타임 중 하나의 시점에서 Aspect를 핵심 로직에 연결합니다.
- 스프링에서는 주로 런타임에 Proxy 객체를 생성하여 Aspect를 핵심 로직에 적용합니다.
참고 블로그
https://carnival.tistory.com/77
Spring Filter, Interceptor, AOP 비교
Spring Filter, Interceptor, AOP 1. Filter, Interceptor, AOP의 흐름 실행 순서:Filter → Interceptor → AOP → Interceptor → Filter 2. 개념 1) Filter Dispatcher Servlet 전/후 ServletRequest/ServletResponse 객체 변경 및 조작 수행 가
carnival.tistory.com