스프링. Filter와 Interceptor

송은혜·2022년 6월 5일
0

spring

목록 보기
1/5

스프링 mvc 패턴에서 Filter 와 Interecptor의 차이점과 활용을 알아보자.

Http Request → WAS → 필터 → 디스패처 서블릿 → 인터셉터(HandlerInterceptor) → AOP → 컨트롤러 → 비지니스 로직(service → Repository → 데이터베이스)

Filter

Filter는 스프링 내부에 존재하는 것이 아닌, 톰캣 안에 있는 녀석이다. 자바 서블릿이 제공하는 기능이다.
말 그대로 필터링을 해준다. 최전방에서 정제해주는 기능을 한다.

주로 Filter 에서는 다음과 관련된 사항들을 체크한다

  • 보안 관련 공통 작업
  • 모든 요청에 대한 로깅 또는 감사
  • 이미지/데이터 압축 및 문자열 인코딩

스프링을 사용하면서 내가 원하는 기능을 필터에 적용시키려면, 필터를 구현하고 FilterRegistraionBean 을 사용해서 등록하면 된다.
(@ServlertComponentScan , @WebFilter(filterName = “” , urlPatterns = “”) 이 두가지로도 필터 등록이 가능하지만, 순서 조절이 되지 않아서 FilterRegistraionBean 을 사용하는 것이 좋다.)

필터를 구현 할 때는, 다음 세가지를 오버라이드하여 사용하면 된다.

1. init()
필터 초기화.

2. dofilter()
구현하고자 하는 로직 .로직이 성공하면 다음 과정으로 넘어갈 수 있도록 chain을 꼭 걸어주어야한다. chain.dofilter(request, response) 이렇게 입력해주면 , 다음에 또 실행할 필터가 있다면 그게 실행이 되고 없다면 서블릿으로 넘어간다.

3. destroy()
필터 종료.

주의 할 점은, 필터는 체인으로 구성이 되어서 (체인하면 떠오르는 그 이미지와 같은 맥락이라고 생각하면 될 것 같다.) 새로운 필터를 추가해서 원하는 로직을 구현할 수 있다.
dofilter에서 꼭 chain.dofilter를 해주어야한다.
그렇지 않으면 그 필터가 실행이 되고 난 후 다음 로직들로 이동하지 않아서 동작이 멈춰버린다.



Interceptor

스프링에서 제공하는 웹과 관련된 공통 관심사를 처리해주는 녀석.
*인터셉터는 스프링MVC 구조에 특화된 필터기능을 제공한다. 때문에 꼭 필터를 사용해야하는 상황이 아니라면, 인터셉터를 사용하는 것이 더 편리하다.

주로 Interceptor에서는 다음과 관련된 사항들을 체크한다.

  • 인증/인가 등과 같은 공통 작업
  • 컨트롤러로 넘겨주는 정보의 가공
  • API호출에 대한 로깅 또는 감사

스프링 인터셉터를 구현하려면, HandlerIntercetor 인터페이스를 구현해야한다.

HandlerIntercetor 인터페이스를 구현할 땐 3가지를 메서드를 사용하여 구현한다.

1. preHandle (boolean)
컨트롤러 호출 전 (핸들러 어댑터 호출 전.)
주로 로그인 정보를 확인하거나, 컨트롤러로 들어가기 전 ,필요한 정보를 생성할 때 사용된다. 그리고 반환값에 의해 postHandle 호출 여부를 결정한다.

2. postHandle
컨트롤러 호출 후 (핸들러 어댑터 호출 후.)
preHandel에서 false를 반환하거나, 컨트롤러 수행중 익셉션이 발생한다면 호출되지 않는다.

3. afterHandle
요청완료 후, 뷰가 렌더링 된 이후 호출.




공통관심사항이 되는 로직들에 대해서는 필터 또는 인터셉터에서 처리해주는 것이 좋다

→ 공통 관심 사항이라면, 모든 부분에서 공통적으로 확인 , 사용 되어지는 것을 말하는데 예를 들어 로그인의 유무를 생각해보자, 필터나 인터셉터에서 처리하는게 아니라 컨트롤러에서 로그인 유무를 체크하는 코드를 만들어 줄 수도 있겠지만, 공통 관심사이기 때문에 모든 API로직안에 로그인 유무를 체크하는 코드를 넣어주어야한다.

→ 그러다 혹시라도 로그인 유무를 체크하는 코드가 변경이 된다면 그 모든 API에 적었던 코드를 수정해야하는 상황이 올 수도 있다.

→상당히 비효율적임.

또한, 웹과 관련된 공통 관심사를 처리할 때는 HTTP 헤더 혹은 URL의 정보들이 필요한데, 필터나 인터셉터에서는 HttpServletRequest를 사용할 수 있어서 쉽게 정보를 가져올 수 있다.

⇒ 필터 또는 인터셉터에서 처리를 해주면 내부로 들어오지 못하고 튕겨지기 때문에 공통 관심사에 대한 인증이 필요할 경우에는 필터 또는 인터셉터에서 처리해주는 것이 좋다

차이점

필터는 자바 서블릿에서 제공.
인터셉터는 스프링에서 제공.
적용되는 시점이 다름. Filter가 먼저. Interceptor 가 더 나중.
주로 Filter 에서는 다음과 관련된 사항들을 체크하고

  • 보안 관련 공통 작업
  • 모든 요청에 대한 로깅 또는 감사
  • 이미지/데이터 압축 및 문자열 인코딩

Interceptor에서는 다음과 관련된 사항들을 체크한다.

  • 인증/인가 등과 같은 공통 작업
  • 컨트롤러로 넘겨주는 정보의 가공
  • API호출에 대한 로깅 또는 감사

0개의 댓글