[Spring] Filter, Interceptor, AOP

wujin·2024년 1월 21일
post-thumbnail

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

  1. 서버를 실행시켜 서블릿이 올라오는 동안에 init이 실행되고, doFilter가 실행
  2. 컨트롤러에 들어가기전 Interceptor의 preHandler가 실행
  3. 컨트롤러에서 나와 postHandler, afterCompletion, doFilter 순으로 진행
  4. 서블릿 종료 시 destroy 실행

1. Filter

  • Filter는 Java Servlet 스펙에서 나온 개념으로, 주로 HTTP 요청과 응답을 가로채고 처리하는 역할을 한다. Spring에서는 주로 javax.servlet.Filter 인터페이스를 구현하거나 Spring의 OncePerRequestFilter 같은 클래스를 확장하여 필터를 생성한다.

  • 주된 용도는 보안, 인증, 로깅, 데이터 변환, 캐싱 등을 위해 요청이나 응답을 수정하거나 분석하는 것이다.

  • 예를 들어, 사용자 인증을 확인하거나 요청에 대한 로깅 정보를 추가하거나, CORS 설정을 적용할 때 사용된다.

  • Filter는 주로 웹 애플리케이션의 가장 바깥쪽 레이어에서 동작하며, 전체 요청과 응답을 처리한다.

Filter의 실행 메서드
init() : 필터 인스턴스 초기화
doFilter() : 전/후 처리
destroy() : 필터 인스턴스 종료

2. Interceptor

  • Interceptor는 Spring의 HandlerIntreceptor 인터페이스를 구현하여 컨트롤러 전후에 추가 작업을 수행할 수 있다. 이는 Spring MVC 아키텍처의 일부분으로, 주로 컨트롤러 로직에 접근하기 전에 요청을 처리하거나, 응답 후에 작업을 수행할 때 사용된다.

  • Interceptor는 preHandler, postHandler, afterCompletion 같은 메서드를 제공한다. 이를 통해 요청 전 처리, 응답 후 처리, 완료 후 처리 등의 작업을 수행할 수 있다.

  • 주로 사용 사례로는 요청에 대한 인증/인가 확인, 컨틀롤러 메서드 실행 전 로깅, 응답 내용 변경 등이 있다.

Interceptor의 실행 메서드
preHandler() : 컨트롤러 메서드가 실행되기 전
postHanler() : 컨트롤러 메서드 실행직 후 view페이지 렌더링 되기 전
afterCompletion() : view페이지가 렌더링 되고 난 후

3. AOP (Aspect-Oriented Programming)

  • AOP는 OPP를 보완하기 위해 나온 개념으로 중복을 줄일 수 없는 부분을 줄이기 위해 종단면(관점)에서 바라보고 처리한다.

  • 핵심 비즈니스 로직과 이를 둘러싼 공통 로직(로깅, 트랜잭션, 보안, 모니터링 등)을 분리하여 코드의 가독성과 유지보수성을 높이기 위한 패러다임이다.

  • Interceptor나 Filter와는 달리 메소드 전후의 지점에 자유롭게 설정이 가능하다. Interceptor와 Filter는 주소로 대상을 구분해서 걸러내야하는 반면, AOP는 주소, 파라미터, 애노테이션 등 다양한 방법으로 대상을 지정할 수 있다.

  • AOP의 Advice와 HandlerInterceptor의 가장 큰 차이는 파라미터의 차이다. Advice의 경우 JoinPoinProceedingJoinPoint 등을 활용해서 호출한다. 반면 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: 대상 메서드의 수행 전/후


참고자료
https://goddaehee.tistory.com/154

0개의 댓글