어제의 멘토링 이후 interceptor에 대한 의문점이 가득해서 interceptor와 filter에 대해 공부하기로 했다.
생각해보니 타당한 이유없이 그저 강사님께 배웠다고 아무런 생각없이 interceptor를 쓰고 있었구나 싶어 반성하는 계기가 됐다.
일단 개발을 하다 보면 공통적으로 처리해야될 부분들이 많고,
Spring은 중복 코드를 최소화하고 공통적으로 여러 작업을 처리하기 위해 Filter(필터), Interceptor(인터셉터), 그리고 AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)와 같은 기능을 제공한다.
이러한 기능들은 주로 어떤 행동을 하기 전에 먼저 실행하거나, 실행한 후에 추가적인 행동을 할 때 사용된다.
✅ Filter 란?
서블릿 컨테이너에서 제공하는 기능으로, 클라이언트의 요청이 Dispatcher Servlet으로 전달되기 전(pre-processing)과 Dispatcher Servlet이 응답을 클라이언트로 보내기 전(post-processing)에 실행되는 컴포넌트이다.
필터는 주로 요청과 응답을 거르고 정제하는 역할을 수행하며, 이를 통해 특정한 기능을 부여하거나 요청/응답 데이터를 조작할 수 있다.
스프링에서는 웹 컨테이너(예: 톰캣)에서 관리되는 영역으로, 스프링의 빈(Container)이 아닌 외부에서 동작한다. 따라서 스프링의 IoC(Inversion of Control)와는 조금 다른 개념이며, 주로 서블릿 기술에서 사용된다.
- Filter가 처리하는 대표적인 상황
- 인코딩 변환
- 인증 및 권한 확인
- 로깅 및 감사 기록
✅ Interceptor 란?
간단하게 말하면, 컨트롤러로 가기 전에 가로채는 것이다.
인터셉터(Interceptor)는 Dispatcher Servlet이 Controller를 호출하기 전(pre-processing)과 후(post-processing)에 실행되어 요청과 응답을 참조하거나 가공하는 기능을 제공한다.
인터셉터는 스프링 컨텍스트에서 동작하며, 특정 URL 패턴에 등록된 컨트롤러로의 요청 전/후에 추가적인 작업을 수행할 수 있다.
디스패처 서블릿이 핸들러 매핑을 통해 컨트롤러를 찾아 실행 체인(HandlerExecutionChain)을 생성하는데, 이때 1개 이상의 인터셉터가 등록되어 있다면 순차적으로 실행 체인을 거치며 인터셉터들이 작업을 수행하게 된다.
만약 등록된 인터셉터가 없다면 요청은 직접 컨트롤러로 전달되어 실행된다.
- Interceptor가 처리하는 대표적인 상황
- 인증 및 권한 확인
- 로깅 및 감사 기록
- 전역적인 작업 ( 여러 컨트롤러에서 공통으로 수행해야 하는 작업을 중앙에서 관리 )
인터셉터는 스프링에서 제공하는 HandlerInterceptor 인터페이스를 구현하여 사용하며, 이를 통해 preHandle, postHandle, afterCompletion 등의 메서드를 오버라이드하여 필요한 작업을 구현할 수 있다.
public interface HandlerInterceptor {
default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true;
}
default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
}
preHandle()
Controller가 호출되기 전에 실행된다.
postHandle()
Controller가 호출된 후에 실행된다.
afterCompletion()
모든 작업이 완료된 후에 실행된다.
✅ 비교해보자
Filter
✔ 필터는 Request와 Response를 조작할 수 있지만, 인터셉터는 조작할 수 없다.
// Filter
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 다른 request와 response를 넣어줄 수 있음
chain.doFilter(request, response);
}
}
// Interceptor
public class MyInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// Request, Response를 교체할 수 없고 boolean 값만 반환 가능
return true;
}
}
✔ 필터는 스프링과 무관하게 전역적으로 처리해야 하는 작업들을 처리할 수 있다.
✔ 필터는 이미지나 데이터의 압축, 문자열 인코딩과 같이 웹 어플리케이션에 전반적으로 사용되는 기능을 구현하기에 적당하다.
Interceptor
✔인터셉터는 클라이언트의 요청과 관련되어 전역적으로 처리해야 하는 작업들을 처리할 수 있다.
✔ 세부적으로 적용해야 하는 인증이나 인가와 같이 예를 들어 특정 그룹의 사용자는 어떤 기능을 사용하지 못하는 경우가 있는데, 이러한 작업들은 컨트롤러로 넘어가기 전에 검사해야 하므로 인터셉터가 처리하기에 적합하다.
서블릿으로 제공하는 필터 기능을 사용해 로그인을 하지 않은 유저의 접근 권한을 제한시킬 수 있지만 인터셉터가 스프링MVC에 더 적합하고, 수업시간 때 배웠던걸 리마인드하면서 최대한 적용시켜보자고 결론이 났기 때문에 팀원들과 상의 끝에 interceptor를 사용하기로 했다.
'Project 여담 > 5주차' 카테고리의 다른 글
11/04 : 3번째 멘토링 / 중간점검 (0) | 2023.11.05 |
---|---|
11/03 : 일정 삭제하기 DataIntegrityViolationException 오류 => ON CASCADE 추가 (0) | 2023.11.03 |
11/02 : 일정 상세보기 지도에 인포윈도우 추가 (0) | 2023.11.02 |
11/01 : 일정 상세보기 kakao map api와 DB 연동해 마커 찍기 (0) | 2023.11.01 |
10/31 : 일정 상세보기 로직 구현 (0) | 2023.10.31 |