본문 바로가기

Dev-/Spring

Filter, Interceptor, AOP

개발을 하다보면, 공통적으로 처리해야 할 업무들이 많습니다.

예를들어 로그인 관련 체크, 로깅, 문자 인코딩, 필터링 등이 있죠. 


이러한 처리들을 필요한 부분마다 실행시킬 수 있지만 

프로젝트 단위가 커질수록 코드의 중복이 늘어나서 서버에 많은 부하를 주게 됩니다.



따라서 적절한 사용 위치와 범위에 맞게 일괄처리를 해 주어야 하는데요.

그와 관련된 방식이 Filter, Interceptor, AOP 세가지 있습니다.


세 가지 개념이 모호해 한번 정리해보았습니다.



1. Filter(필터)



위 그림과 같이 필터는 스프링 프레임워크Context(영역) 밖에 있습니다. (스프링과 무관하게 J2EE 표준 스펙)

따라서 스프링에서 빈으로 등록된 컨트롤러나 서비스 객체의 사용이 어렵고,

웹 애플리케이션 전반에 걸친 모든 요청과 응답을 처리합니다.


주로 '문자 인코딩', 'XSS 방어' 등의 처리를 할 때 사용합니다. 

(사용법: web.xml에 등록)



참고로 Filter의 메서드는 아래와 같습니다.

  • init(): 필터 인스턴스 초기화
  • doFilter(): 전/후 처리
  • destroy(): 필터 인스턴스 종료


2. Interceptor(인터셉터)




반면, 인터셉터는 스프링 Context(영역) 안에서 Controller에 관한 요청과 응답에 대해 처리합니다.

스프링 프레임워크에서 차용한? 만든? 개념이죠.

따라서 스프링의 모든 빈 객체에 접근할 수 있습니다.


주로 세션, 쿠키를 사용한 '권한 체크', '로그인 체크' 등 Http 단위의 업무를 처리할때 사용합니다.

과거에는 Multipart 처리를 직접 해야해서 '파일 업로드'를 처리할 때도 유용했지만, 

Servlet 3.0 이후부터는 HttpServletRequest에 Multipart 처리 기능이 포함되어 잘 활용되지 않는 듯 하네요.

(사용법: xml + Java)



Interceptor의 메서드는 아래와 같습니다.


  • preHandler(): 컨트롤러 도달 전
  • postHandler(): 컨트롤러 메서드 처리 후 view 호출 전
  • afterCompletion(): view 페이지 응답 후


3. AOP(관점 지향 프로그래밍)


AOP에 대해서는 따로 포스팅을 해야 할 것 같습니다.

개념이 어렵고 복잡하네요.


간단하게,, OOP를 보완하기 위해 나온 개념으로, 

객체 지향의 프로그래밍을 했을 때 중복을 줄일 수 없는 부분을 줄이기 위해 종단면(관점)에서 바라보고 처리하는 것입니다.


주로 '로깅', '트랜잭션', '에러 처리', '계좌이체' 등 비즈니스단메서드에서 조금 더 세밀하게 조정하고 싶을 때 사용합니다.

(사용법: xml + Java)



AOP의 포인트컷은 다음과 같습니다.


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



헷갈리던 분들에게 조금이나마 도움이 되었으면 좋겠습니다.