본문 바로가기
⚙️Backend/Spring

[Spring] Filter + AOP + Interceptor : Interceptor

by Bㅐ추 2020. 6. 8.
728x90
반응형

2020/06/06 - [🌎Web Application/Spring] - [Spring] Filter + AOP + Interceptor : Filter

2020/06/06 - [🌎Web Application/Spring] - [Spring] Filter + AOP + Interceptor : AOP

2020/06/08 - [🌎Web Application/Spring] - [Spring] Login 기능 및 기타 어노테이션

 

5. Interceptor

5-1. 개념

인터셉터를 사용하면 브라우저 요청이 있을 때 요청 메서드 호출 전 후에 개발자가 원하는 기능을 수행할 수 있다.

사진출처 :  https://blog.naver.com/platinasnow/220035316135

브라우저의 요청을 해당 컨트롤러의 메서드가 처리하기 전 후에 인터셉터를 두어 특정작업을 수행한다. 인터셉터는 필터와 비슷한 기능을 하지만 필터는 웹 애플리케이션의 특정한 위치에서 만 동작하는데 반해, 인터셉터는 좀 더 자유롭게 위치를 변경해서 기능을 수행할 수 있다.

 

여기서 잠깐 헷갈릴 수 있어서 정리하겠다.

 

스프링에서 사용되는 AOP, Filter, Interceptor 세 가지 기능은 모두 무슨 행동을 하기전에 먼저 실행하거나, 실행한 후에 추가적인 행동을 할 때 사용되는 기능들이다.

 

기능적으로는 비슷하지만 내부 구현적으로는 큰 차이가 있다.

 

우선 Interceptor와 Filter는 Servlet 단위에서 실행된다. 반면 AOP는 메소드 앞에 Proxy패턴의 형태로 실행된다.

그래서 실행순서에서도  차이가 나는데, Filter가 가장 겉에 있고 그안에 Interceptor, 그안에 AOP가 있는 형태이다.

 

따라서 요청이 들어오면 Filter → Interceptor → AOP → Interceptor → Filter 순으로 거치게 된다.

AOP vs Filter, Interceptor

AOP의 경우 Interceptor나 Filter와는 달리 메소드 전후의 지점에 자유롭게 설정이 가능하고,

Interceptor와 Filter는 주소로 대상을 구분해서 걸러내야하는 반면, AOP는 주소, 파라미터, 애노테이션 등

다양한 방법으로 대상을 지정할 수 있다는 장점이 있다.

 

Filter vs Interceptor

Servlet 기술의 Filter와 Spring MVC의 Interceptor는 특정 URI에 접근할 때 제어하는 용도로 사용된다는

공통점을 가지고 있다. 두 기능의 가장 큰 차이는 위에서도 언급했듯이 실행 시점에 속하는 영역이 다르다. Interceptor의 경우

Spring의 영역(Context)에 존재하고, Filter는 웹 어플리케이션 내에 존재한다.

 

AOP vs Interceptor

AOP의 Advice와 HandlerInterceptor의 가장 큰 차이는 파라미터의 차이다.

Advice의 경우 JoinPoint나 ProceedingJoinPoint 등을 활용해서 호출한다.

반면에 HandlerInterceptor는 Filter와 유사하게 HttpServletRequest, HttpServletResponse를 파라미터로

사용한다. 

 

기존에 Controller에서 순수하게 필요한 파라미터와 결과 데이터를 만들어내고, Interceptor를 이용해서 웹과 관련된 처리를 도와준다.

 

5-2. 구현

인터셉터 기능은 스프링에서 제공하는 HandlerInterceptorAdator 클래스를 상속받거나 인터페이스인 HandlerInterceptor를 구현해서 사용한다. 

package com.mvc.upgrade.common.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class LoginInterceptor implements HandlerInterceptor{

	private Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);
	
	//Controller 실행 요청 전에 수행되는 메소드.
	//return 값이 false인 경우 controller 실행 시키지 않는다.
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		logger.info("[interceptor] : preHandle ");
		
		if(request.getRequestURI().contains("/loginform.do") 
				|| request.getRequestURI().contains("/ajaxlogin.do")
				|| request.getSession().getAttribute("login")!=null) {
			//세 개의 요청이 들어오게 된다면,
			// 요청이 loginform이거나, ajaxlogin.do 거나, login이 null이 아닐 때.
			return true; //controller실행
		}
		if(request.getSession().getAttribute("login")==null) {
			//null일때 아무것도 안들어있을 때.
			
			response.sendRedirect("loginform.do");
			// 컨트롤러에서 요청할 때 redirect:list.do ==> dispatcher가 view가 아닌 핸들러매핑으로 보낸다.
			// 
			return false;
		}
		
		
		return false;
	}

	// View단으로 forward 되기 전에 수행
	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
		logger.info("[interceptor] : postHandle");
		
	}

	//view까지 처리가 끝난 후 처리
	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		// TODO Auto-generated method stub
		logger.info("[interceptor] : afterCompletion");
	}

}

servlet-context.xml 설정

<!-- interceptor -->
	<interceptors>
		<interceptor>
			<mapping path="/*"/><!-- 인터셉터를 적용할 url -->
				<beans:bean class="com.mvc.upgrade.common.interceptor.LoginInterceptor"/>
			
		</interceptor>
	</interceptors>

 

내가 이해한 Filter와 Interceptor의 차이점은,

Filter는 해당 브라우저에 요청이 들어가기 한 참~ 전에 걸러내는 느낌 (즉,  DispatcherServlet 에 들어가기 전 , 앞단)

이고, Interceptor는 그 요청의 전 후에 걸러내는 느낌이다.(즉, DispatcherServlet에서 Handler(Controller)로 가기전에 정보 처리)

 

Filter로 Encoding기능을 사용하고, Interceptor는 사용자가 login을 안했으면 login폼으로 돌려보내는 기능을 사용한 걸 보면 알 수 있다.

 

 

 

 

 

 

 

 

 

 

 

https://jobc.tistory.com/40

728x90
반응형