개인 공부 (23.07~

필터, 인터셉터, AOP 개념, 사용법

Song쏭 2023. 9. 24. 01:16

스프링 시큐리티를 공부하면서 

필터와 인터셉터에 대해 정확히 알고 가야할 것 같다..

 

필터(Filter)

서블릿에서 요청과 응답을 조작할 수 있는 객체.

서블릿 필터는 서블릿 컨테이너(ex)Tomcat)수준에서 동작한다.

주로 인코딩, 로깅, 보안 등의 작업을 처리한다.

 

javax.servlet.Filter 인터페이스를 구현하여 사용한다.

@WebFilter(urlPatterns = "/api/*")
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        System.out.println("Filter: Request received");
        chain.doFilter(request, response);
        System.out.println("Filter: Response sent");
    }
}

* 서블릿(servlet) : Java를 사용하여 웹 페이지의 동적인 처리를 가능하게 하는 서버측 프로그램 또는 그런 프로그램을 구동하는 API.

 

인터셉터(Interceptor)

스프링의 핵심 컴포넌트 중 하나로,

특정 URL 패턴에 대해 요청 전/후로 추가로 실행되어야 할 로직을 구현하는데 사용된다.

Spring의 DispatcherServlet 수준에서 동작한다.

로그인 체크, 권한 확인, 로깅, 트랜잭션 처리 등의 작업을 처리한다.

 

HandlerInterceptor 인터페이스를 구현하거나, 

HandlerInterceptorAdapter 클래스를 상속받아 사용한다.

 

요청이 서버로 들어왔을 때,

Filter가 먼저 실행되고, 이후에 Interceptor가 실행된다.

public class MyInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("Interceptor: Before handling the request");
        return true; 
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
                           ModelAndView modelAndView) throws Exception {
        System.out.println("Interceptor: After handling the request, before sending the response");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("Interceptor: After completing the request and response");
    }
}

 

AOP (Aspect-Oriented Programming)

관점 지향 프로그래밍. 모듈화하는 프로그래밍 관점.

로깅, 트랜잭션 관리, 보안 등 여러 곳에 흩어진 코드를 한 곳에서 관리하도록 도와준다.

 

필수적이지만 어쩔 수 없이 반복적으로 사용되는 코드들을 리팩토링할 수 있도록 해준다.
이로인해 여러 곳에서 사용될만한 코드들이 한 곳에서 유지하고 관리할 수 있는 이점을 갖게 된다.

 

스프링 AOP를 사용하면

@Aspect와 @Pointcut, @Before, @After, @Around 등의 어노테이션을 활용하여

AOP를 구현할 수 있다.

@Aspect
@Component
public class MyAspect {

    @Pointcut("execution(* com.example.service.*.*(..))")
    public void serviceMethods() { }

    @Before("serviceMethods()")
    public void beforeAdvice(JoinPoint joinPoint) {
        System.out.println("Before method:" + joinPoint.getSignature());
    }

    @After("serviceMethods()")
    public void afterAdvice(JoinPoint joinPoint) {
        System.out.println("After method:" + joinPoint.getSignature());
    }
}

 

필터 : 서블릿 기반의 요청과 응답을 조작한다.

인터셉터 : 스프링의 DispatcherServlet이 컨트롤러를 호출하기 전후로 작동한다.

AOP : 특정 메서드나 객체의 조인포인트에 관심사를 주입한다.

 

아래 정리를 잘해주신 것 같아서

몇번 더 읽어봐야겠다.

 

[Spring] AOP(Aspect Oriented Programming)란?

관점지향 프로그래밍(Aspect - Oriented Programming)이란 무엇인가? AOP는 OOP(Object Oriented Programming, 객체지향 프로그래밍)를 돕는 보조적인 기술로, 관심사의 분리(기능의 분리)의 문제를 해결하기 위해

dev-coco.tistory.com