일단 프로젝트에 필터(Filter)와 인터셉터(Interceptor)를 한꺼번에 만들어보겠습니다.
들어가면서 …
둘 다 웹 어플리케이션에서 HTTP 요청/응답을 가로채고 처리하는 역할을 합니다. 하지만 이 둘은 동작 방식과 사용 목적이 약간씩 다릅니다. 아래 표는 필터와 인터셉터의 차이점을 간단히 비교한 것입니다.
일단 요약부터 해보겠습니다.
구분 | 필터(Filter) | 인터셉터(Intercepter) |
위치 | 서블릿 컨테이너 앞단 | 서블릿 컨테이너 내부 |
등록 | web.xml 파일 또는 @WebFilter 어노테이션 | @Configuration 클래스 또는 @Component 어노테이션 |
적용 대상 | URL 패턴 | 컨트롤러 또는 뷰 렌더링 |
작업 시기 | 요청/응답 처리 전후 | 컨트롤러 실행 전후, 뷰 렌더링 전후 |
필요한 초기화 작업 | 필요함 | 불필요함 |
작업 수행 방식 | ServletRequest, ServletResponse, FilterChain 사용 | HttpServletRequest, HttpServletResponse, Object, ModelAndView 사용 |
언제 어디서 어떻게 쓰이는가? 알고 싶지 않음?
실제로 필터와 인터셉터는 주로 로깅, 인코딩 설정, 보안, 세션 처리 등과 같은 공통적인 작업을 처리하는 데에 사용됩니다. 다만, 필터는 모든 URL 패턴에 대해 적용되므로 세밀한 제어가 어렵지만, 인터셉터는 컨트롤러나 뷰 렌더링에 대해 적용되므로 세밀한 제어가 가능합니다. 필터와 인터셉터는 상황에 맞게 선택하여 사용하는 것이 좋습니다.
필터 예시 코드
@WebFilter(filterName = "MyFilter", urlPatterns = { "/*" })
public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 요청 처리 전 필터 작업 수행
String encoding = request.getCharacterEncoding();
if (encoding == null) {
request.setCharacterEncoding("UTF-8");
}
// 다음 필터 또는 서블릿 호출
chain.doFilter(request, response);
// 응답 처리 후 필터 작업 수행
response.setCharacterEncoding("UTF-8");
}
}
위 예시에서는 모든 URL 패턴에 대해 MyFilter라는 이름의 필터를 등록하고 있습니다. doFilter() 메소드는 요청 처리 전 필터 작업과 응답 처리 후 필터 작업 사이에서 chain.doFilter()를 호출하여 요청/응답 데이터를 처리합니다.
인터셉터 예시 코드
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 컨트롤러 실행 전 작업 수행
String path = request.getRequestURI();
if (path.contains("/admin/")) {
// 로그인이 필요한 페이지로 접근할 경우 로그인 페이지로 이동
response.sendRedirect("/login");
return false;
}
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// 컨트롤러 실행 후 뷰 렌더링 전 작업 수행
if (modelAndView != null) {
modelAndView.addObject("user", request.getSession().getAttribute("user"));
}
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) throws Exception {
// 뷰 렌더링 후 작업 수행
}
}
위 예시에서는 MyInterceptor라는 이름의 인터셉터를 등록하고 있습니다. preHandle() 메소드에서는 관리자 페이지에 접근하는 경우 로그인 페이지로 이동하는 작업을 수행하고, postHandle() 메소드에서는 컨트롤러에서 사용할 모델에 세션에서 가져온 사용자 정보를 추가하는 작업을 수행합니다.
요약하면…
요약하자면, 필터는 서블릿 컨테이너 앞단에서 실행되고, 웹 애플리케이션에서 발생하는 모든 요청과 응답에 대해 처리를 수행
합니다. 반면 인터셉터는 서블릿 컨테이너 내부에서 실행되고, 주로 컨트롤러 처리 전후에 작업을 수행
합니다.
필터와 인터셉터는 모두 요청/응답 처리에 대한 추가 작업을 수행할 수 있는데, 필터는 URL 패턴에 대해 적용되고, 인터셉터는 컨트롤러나 뷰 렌더링에 대해 적용됩니다. 또한 필터는 초기화 작업이 필요하지만, 인터셉터는 빈으로 등록하여 간단하게 사용할 수 있습니다.
내저장소 바로가기 luxury515
'Back-end > 기타' 카테고리의 다른 글
@Transactionl 이 무용지물이 된 케이스 (0) | 2023.04.17 |
---|---|
유효성체크,예외처리,응답메시지에 대한 공통처리. (0) | 2023.04.17 |
on duplicate key update (0) | 2023.04.16 |
AWS KMS 관련 세팅 (0) | 2023.04.14 |
DI(Depandency Injection) 에 관하여 (0) | 2023.04.14 |