[Spring] AOP, Filter, Interceptor

봉성은·2025년 4월 1일

스프링(Spring)

목록 보기
3/4
post-thumbnail

애플리케이션의 기능은 크게 두가지로 나눌 수 있다.
첫번째는 핵심기능으로 해당 객체가 제공하는 고유의 기능을 말한다.
두번째는 핵심기능을 보조하는 로그 추척 기능과 같은 부가기능이다.
기존의 프로젝트에 부가기능을 추가하는 경우 각 클래스마다 추가해줘야하는 복잡함과 번거로움이 있다.
이런 경우, AOP(Aspect Oriented Programming), 즉 관점 지향 프로그래밍을 적용할 수 있다.

💡 AOP란?
부가 기능을 핵심 기능에서 분리해 한 곳으로 관리하도록 하고, 이 부가 기능을 어디에 적용할지 선택하는 기능을 제공하는 모듈

💡 AOP 용어

  • AOP 프록시﹡ - AOP 기능을 구현하기 위해 만든 프록시 객체
    ﹡클라이언트의 요청을 대신 받는 대리자
  • 어드바이스(Advice) - 실제로 수행될 코드로 Around, Before, After과 같은 종류가 있음
  • 포인트컷(Pointcut) - 조인 포인트 중에서 어드바이스를 어디에 적용할 지, 적용하지 않을 지 위치를 판단하는 기능으로 스프링 AOP는 메소드 실행 지점을 포인트컷으로 필터링
  • 타겟(Target) - 어드바이스를 받는 객체
  • 조인 포인트(Join Point) - 어드바이스가 적용될 수 있는 위치로, AOP를 적용할 수 있는 지점
  • 관점(Aspect) - 어드바이스와 포인트컷을 모듈화한 것으로 여러 어드바이스와 포인트컷이 함께 존재 가능
  • 어드바이저(Advisor) - 스프링 AOP에서 사용되는 개념으로 하나의 어드바이스와 하나의 포인트컷으로 구성

💡 AOP 적용 방식
1. AspectJ

  • 컴파일 시점
  • 클래스 로딩 시점

2. 스프링 AOP

  • 런타임 시점 - 컴파일 후에 클래스 로더에 클래스가 다 올라가고 자바가 실행된 후 시점

💡 스프링에 AOP 적용
포인트컷과 어드바이스로 구성되어 있는 어드바이저를 만들어 스프링 빈으로 등록하면 프록시 생성기가 처리해줌

@Aspect
public class LogTraceAspect{
	@Around // 포인트컷
    public Object execute(ProceedingJoinPoint joinPoint){
    // 어드바이스
    }
}

포인트컷의 종류

  • @before - 대상 메소드의 수행 전
  • @After - 대상 메소드의 수행 후
  • @After-returning - 대상 메소드의 정상적인 수행 후
  • @After-throwing - 예외발생 후
  • @Around - 대상 메소드의 수행 전/후

💡 필터란?
자바 서블릿의 기능 중 하나로, 디스패쳐 서블릿에 요청이 전달되기 전과 후에 URL 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능이다.
즉, 클라이언트의 요청과 서버의 응답을 거른 뒤 정제하는 역할이다.

💡 필터의 메소드

  • init() - 필터 객체를 초기화하고 서비스에 추가하기 위한 메소드로, 웹 컨테이너가 init 메소드를 1회 호출해 초기화하면 이후의 요청들은 doFilter를 통해 처리됨
  • doFilter() - URL 패턴에 맞는 모든 http 요청이 디스패쳐 서블릿으로 전달되기 전에 웹 컨테이너에 의해 실행됨
  • destroy() - 필터 객체를 서비스에서 제거하고 사용하는 자원을 반환하기 위한 메소드로, 웹 컨테이너에 의해 1회 호출되며 그 이후에는 doFilter에 의해 처리되지 않는다.
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() {}
}

💡 인터셉터란?
필터와는 달리, 스프링이 제공하는 기술로써 디스패쳐 서블릿이 컨트롤러를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 기능이다.

💡 인터셉터의 메소드

  • preHandle() - 컨트롤러가 호출되기 전에 실행되기에, 컨트롤러의 실행 이전에 처리해야 할 작업이 있는 경우나 요청정보는 가공 또는 추가하는 경우 사용
  • postHandle() - 핸들러가 실행은 완료했지만 아직 View가 생성되기 이전에 호출되며 ModelAndView 타입의 정보를 인자값으로 받음
  • afterCompletion() - 모든 View에서 최종 결과를 생성하는 일을 포함한 모든 작업이 완료된 후에 실행되어 요청 처리중에 사용한 리소스를 반환해주기 적당한 메소드

정리

AOPFilterInterceptor
동작 위치스프링 컨테이너스프링 밖 웹 컨테이너스프링 컨테이너
대상 지정주소, 어노테이션 등주소주소
역할컨트롤러 처리 이후 실행애플리케이션 전반에 영향컨트롤러에 대한 요청과 응답에 영향
profile
안녕하세요

0개의 댓글