개발을 하다 보면 사용자 인증/권한, 로깅, 예외처리 등 공통적으로 처리해야 할 작업들이 생긴다. 이러한 공통 기능들은 Spring에서 Filter, Interceptor, AOP를 활용해 처리할 수 있다. 이들은 특정 행동이 실행되기 전에 수행하거나, 실행 후 추가적인 작업이 필요할 때 사용된다.

Filter는 Java Servlet 스펙에서 나온 개념으로, 주로 HTTP 요청과 응답을 가로채고 처리하는 역할을 한다. Spring에서는 주로 javax.servlet.Filter 인터페이스를 구현하거나 Spring의 OncePerRequestFilter 같은 클래스를 확장하여 필터를 생성한다.
주된 용도는 보안, 인증, 로깅, 데이터 변환, 캐싱 등을 위해 요청이나 응답을 수정하거나 분석하는 것이다.
예를 들어, 사용자 인증을 확인하거나 요청에 대한 로깅 정보를 추가하거나, CORS 설정을 적용할 때 사용된다.
Filter는 주로 웹 애플리케이션의 가장 바깥쪽 레이어에서 동작하며, 전체 요청과 응답을 처리한다.
Filter의 실행 메서드
init(): 필터 인스턴스 초기화
doFilter(): 전/후 처리
destroy(): 필터 인스턴스 종료
Interceptor는 Spring의 HandlerIntreceptor 인터페이스를 구현하여 컨트롤러 전후에 추가 작업을 수행할 수 있다. 이는 Spring MVC 아키텍처의 일부분으로, 주로 컨트롤러 로직에 접근하기 전에 요청을 처리하거나, 응답 후에 작업을 수행할 때 사용된다.
Interceptor는 preHandler, postHandler, afterCompletion 같은 메서드를 제공한다. 이를 통해 요청 전 처리, 응답 후 처리, 완료 후 처리 등의 작업을 수행할 수 있다.
주로 사용 사례로는 요청에 대한 인증/인가 확인, 컨틀롤러 메서드 실행 전 로깅, 응답 내용 변경 등이 있다.
Interceptor의 실행 메서드
preHandler(): 컨트롤러 메서드가 실행되기 전
postHanler(): 컨트롤러 메서드 실행직 후 view페이지 렌더링 되기 전
afterCompletion(): view페이지가 렌더링 되고 난 후
AOP는 OPP를 보완하기 위해 나온 개념으로 중복을 줄일 수 없는 부분을 줄이기 위해 종단면(관점)에서 바라보고 처리한다.
핵심 비즈니스 로직과 이를 둘러싼 공통 로직(로깅, 트랜잭션, 보안, 모니터링 등)을 분리하여 코드의 가독성과 유지보수성을 높이기 위한 패러다임이다.
Interceptor나 Filter와는 달리 메소드 전후의 지점에 자유롭게 설정이 가능하다. Interceptor와 Filter는 주소로 대상을 구분해서 걸러내야하는 반면, AOP는 주소, 파라미터, 애노테이션 등 다양한 방법으로 대상을 지정할 수 있다.
AOP의 Advice와 HandlerInterceptor의 가장 큰 차이는 파라미터의 차이다. Advice의 경우 JoinPoin나 ProceedingJoinPoint 등을 활용해서 호출한다. 반면 HandlerInterceptor는 Filter와 유사하게 HttpServletRequest, HttpServletResponse를 파라미터로 사용한다.
Spring에서는 @Aspect 어노테이션과 Advice 메서드를 사용하여 AOP를 구현한다.
JoinPoint : 특정 지점(메서드 호출, 객체 생성 등)을 나타낸다.Advice : JoinPoint에서 실행되는 코드 블록을 의미하며, 다양한 시점(Before, After, AfterReturning, AfterThrowing, Around)에 적용할 수 있다.Pointcut : 특정 조건에 따라 JoinPoint를 필터링하여 Advice가 적용될 지점을 정의한다.AOP는 주로 로깅, 트랜잭션 관리, 예외 처리, 보안 등을 위해 사용된다. 예를 들어, 트랜잭션을 자동으로 관리하거나 메서드 실행 전후에 로깅을 추가하는 경우에 사용된다.
AOP의 포인트컷
@Before: 대상 메서드의 수행 전
@After: 대상 메서드의 수행 후
@After-returning: 대상 메서드의 정상적인 수행 후
@After-throwing: 예외발생 후
@Around: 대상 메서드의 수행 전/후