필터(Filter)와 인터셉터(Interceptor)

이호인·2022년 5월 21일
1

Spring

목록 보기
1/6

📌 공통 관심사를 분리하자.

  • 어플리케이션 전 영역에 걸쳐 사용되는 공통 업무에 관련된 코드를 모든 페이지마다 작성한다면

1) 중복된 코드가 많아진다.
2) 프로젝트 단위가 커질수록 서버에 부하를 줄 수 있다.
3) 유지, 보수가 쉽지 않다.

📌 필터와 인터셉터

  • 이러한 현상들을 해결하기 위해 필터, 인터셉터, AOP를 사용할 수 있다. (이번 정리에는 필터와 인터셉터만!)

📌 필터 (Filter)

  • J2EE 표준 스펙 기능
  • 디스패처 서블릿(Dispatcher Servlet)에 요청이 전달되기 전/후에 url 패턴에 맞는 모든 요청에 대해 부가작업을 처리할 수 있는 기능을 제공
  • 필터는 스프링 범위 밖에서 처리되는 것.
  • 톰캣과 같은 웹 컨테이너에 의해 관리된다.
  • 인코딩 변환 처리, XSS 방어, LOG, 인증 등에 사용된다.

📌 필터의 실행 메서드

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

여기서 init()destroy()는 따로 작성하지 않을 시 default로 ~

📌 인터셉터 (Interceptor)

  • 스프링에서 제공하는 기능이다. (Spring Context에 등록)
  • 디스패처 서블릿과 컨트롤러 사이에서 컨트롤러 호출 직전에 호출된다.
  • HandlerMapping을 지나 Controller 사이에서 interceptor가 있다면 interceptor, 없다면 바로 Controller를 호출한다.

📌 인터셉터의 실행 메서드

  • preHandler() - 컨트롤러 실행 전
  • postHandler() - 컨트롤러 실행 직후 view 페이지 렌더링 전
  • afterCompletion() - view 페이지 렌더링 후

📌 filter와 interceptor 차이점

대상필터(filter)인터셉터(Interceptor)
관리되는 컨테이너 웹 컨테이너 스프링 컨테이너
Request/Response
객체 조작 가능 여부
가능 불가능

📌 내가 고민한 이유 & 선택한 것

  • 게시판에 로그인 체크 기능이 필요해서 필터와 인터셉터를 찾아보던 중 보통 인터셉터를 사용한다는 글들이 많았다.
  • 그 이유는 필터가 스프링 빈으로 등록되지 못하며, 빈을 주입 받을 수 없기 때문이라는 이유가 많았는데, MangKyu님의
    Spring 필터(Filter)가 스프링 빈 등록과 주입이 가능한 이유(DelegatingFilterProxy의 등장) - (2)
    라는 글에서 최근에는 필터도 가능하다는 정보를 얻게 되었다.
  • 원래 인터셉터를 적용했었으나 필터도 빈 등록이 가능하다면 디스패처 서블릿에 도달하기 전에 처리하므로 리턴이 빠르기 때문에 더 나은 것 같다는 의견으로 모아져 필터로 바꾸어 적용했다.
  • 원래는 화이트 리스트를 적용해서 체크했지만, 페이지가 많아지면서 로그인이 필요한 페이지가 더 적어져서 로그인 확인이 필요한 곳만 체크해서 적용하는 방식으로 바꾸었다.

📌 Reference!

필터(Filter) vs 인터셉터(Interceptor) 차이 및 용도 - (1)
로그인 처리 - 필터, 인터셉터
Filter VS Interceptor
7. 로그인 처리2 - 필터, 인터셉터
스프링 부트 - 로그인2: 필터, 인터셉터
(Spring)Filter와 Interceptor의 차이

profile
공부 기록

0개의 댓글