Filter, Interceptor, AOP 차이

GEONNY·2024년 10월 14일
0

Building-API

목록 보기
28/28
post-thumbnail

Spring framework에서 특정 시점에 공통된 기능을 실행하는 횡단 관심사(Cross-Cutting Concerns)를 처리하는 데 사용되는 Filter, Interceptor, AOP (Aspect Oriented Programming)에 대해서 알아보겠습니다.

📌Filter

📍실행시점

Filter는 Servlet에 Request가 도달하기 전 혹은 Response가 클라이언트에게 도착하기 전에 동작합니다. 개발자가 어플리케이션 내에 Filter를 구현하지만, 톰캣과 같은 서블릿 컨테이너에 등록되고 관리되게 됩니다. 이는 dispatcher-servlet 외부에서 동작하기 때문에 Spring bean에 접근할 수 없습니다.

📍활용

요청이나 응답에 대한 전/후처리 역할을 하며 주로 보안, 로깅, 인코딩 설정에 활용됩니다.
여러 필터가 등록된 경우 등록된 순서에 따라 순차처리 됩니다.

📍GenericFilterBean

GenericFilterbean은 스프링에서 제공하는 유틸리티 클래스이며, 일반적인 Servlet Filter와 달리 필터 초기화와 같은 작업을 자동으로 처리해주고 스프링 빈에도 접근 할 수 있는 차이가 있습니다.
기본적인 Servlet Filter를 구현하는 경우보다 스프링과의 통합성을 높이고 코드 작성의 복잡성을 줄일 수 있고 스프링 환경에서 더 간결하고 쉽게 필터를 구현할 수 있습니다.

📍Sample Code

public class CustomFilter implements Filter {
	//init, doFilter 등 Override
}
public class CustomFilter extends GenericFilterBean {
	//doFilter 등 Override
}

📌Interceptor

📍실행시점

Interceptor는 스프링의 HandlerInterceptor 인터페이스를 구현하여 특정 컨트롤러 핸들러 메소드 호출 전/후 또는 완료된 후에 요청을 가로채 처리하는 기능입니다.
필터와 달리, 스프링 컨텍스트 내에서 동작하며, 스프링의 빈에 접근할 수 있습니다.

📍활용

Controller 도달 전 인증/인가, 세션 관리, 로깅, 특정 메소드 처리 전후 작업에 활용됩니다.

📍Sample Code

public class CustomInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, 
    						 HttpServletResponse response, 
                             Object handler) throws Exception {
        //Controller 실행 전 처리
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, 
    					   HttpServletResponse response, 
                           Object handler, 
                           ModelAndView modelAndView) throws Exception {
    	//Controller 실행 후 처리
    }

    @Override
    public void afterCompletion(HttpServletRequest request, 
    							HttpServletResponse response, 
                                Object handler, Exception ex) throws Exception {
        //응답 완료 후 처리
    }

📌AOP

AOP는 관점 지향 프로그래밍으로, 프로그램의 핵심 비즈니스 로직과 부가적인 기능(횡단 관심사)을 분리하여 코드의 유지보수성과 재사용성을 높이기 위한 프로그래밍 패러다임입니다.

📍실행시점

AOP는 주로 다음과 같은 실행 시점에서 동작합니다. 이를 어드바이스(advice)라고 부르며, 특정 시점에 실행될 수 있습니다

Before 메서드 실행 전에 동작합니다.
After 메서드 실행 후에 동작합니다.
After Returning 메서드가 정상적으로 반환된 후에 동작합니다.
After Throwing 메서드에서 예외가 발생한 후에 동작합니다.
Around 메서드 실행 전후에 모두 동작하며, 메서드의 실행을 제어할 수 있습니다.

📍활용

AOP는 주로 로그 처리, 트랜잭션 관리, 보안 등의 공통된 부가 기능을 핵심 비즈니스 로직과 분리하여 코드 중복을 최소화합니다.

로깅(Logging) 메서드 실행 전후 또는 예외 발생 시 로그를 기록합니다.
트랜잭션 관리 메서드 실행 시 트랜잭션을 시작하고 종료하는 로직을 적용합니다.
보안(Security) 특정 메서드가 호출될 때 권한 검사를 수행합니다.
성능 모니터링(Performance Monitoring) 메서드 실행 시간을 측정합니다.

📍Sample Code

springboot 에서 AOP를 사용하기 위해 dependency를 추가합니다.
application.yml

implementation 'org.springframework.boot:spring-boot-starter-aop'

AOP를 사용하려면 스프링 애플리케이션에서 AOP 기능을 활성화해야 합니다. 이를 위해 @EnableAspectJAutoProxy 애노테이션을 사용합니다. springboot main method 에 추가해 줍니다.

@SpringBootApplication
@EnableJpaAuditing
@EnableAspectJAutoProxy // <<<<<<<AOP
public class ApiApplication {
//이하 생략..

이제 Controller method 의 실행시간을 출력하는 class 를 생성합니다.
common.aop.LoggingAOP

@Aspect
@Component
@Slf4j
public class LoggingAop {
    // 1. 메서드 실행 전 로그 출력 (Before Advice)
    @Before("execution(* com.geonlee.api.domin.*.*Controller.*(..))")
    public void logBefore() {
        log.info("Method execution starts...");
    }

    // 2. 메서드 실행 후 로그 출력 (After Advice)
    @After("execution(* com.geonlee.api.domin.*.*Controller.*(..))")
    public void logAfter() {
        log.info("Method execution ends...");
    }

    // 3. 메서드 실행 전후로 로깅 및 시간 측정 (Around Advice)
    @Around("execution(* com.geonlee.api.domin.*.*Controller.*(..))")
    public Object logAround(ProceedingJoinPoint joinPoint) throws Throwable {
        long startTime = System.currentTimeMillis();
        log.info("Method execution starts with arguments: {}"
        	, joinPoint.getTarget().getClass().getSimpleName());

        // 실제 메서드 호출
        Object result = joinPoint.proceed();

        long endTime = System.currentTimeMillis();
        log.info("Method execution ends. Time taken: {} ms", (endTime - startTime));

        return result;
    }
}

log가 정상적으로 호출되는지 domain 경로에 있는 Controller를 호출해봅니다.

Method execution starts with arguments: CryptoController
Method execution starts...
Method execution ends...
Method execution ends. Time taken: 8 ms

📍장/단점

AOP 활용 시 장점

모듈화 공통된 기능을 별도의 모듈로 분리하여 관리할 수 있습니다.
코드 중복 제거 여러 곳에서 반복적으로 사용되는 로직을 AOP로 처리하여 중복 코드를 없앨 수 있습니다.
유지보수성 향상 비즈니스 로직과 부가 기능이 분리되므로 코드 유지보수가 쉬워집니다.

AOP 활용 시 단점

복잡성 증가 AOP는 코드의 실행 흐름을 변경할 수 있어, 코드의 흐름을 이해하기 어렵게 만들 수 있습니다.
디버깅 어려움 코드의 실행 흐름이 변경되므로, 디버깅 시 예상치 못한 동작이 발생할 수 있습니다.

📌Summary

특징 Filter Interceptor AOP
위치 서블릿 컨테이너 스프링 핸들러 스프링 빈/메소드
용도 HTTP 요청/응답 전처리 요청 전/후, 완료 후 메소드 실행 전/후
장점 간단하고 효율적 스프링 빈에 접근 가능 세밀한 제어 및 코드 중복 최소화
단점 스프링과 독립적 메소드 단위로는 불가 학습 곡선이 높고 디버깅 어려움

Filter, Interceptor, AOP는 프로그램의 요청 흐름에서 서로 다른 시점과 레벨에서 동작합니다. 필요한 기능과 제어 수준에 따라 이들을 적절하게 활용하는 것이 중요하며, 이를 통해 코드의 재사용성과 유지보수성을 높일 수 있습니다.

profile
Back-end developer

0개의 댓글