스프링(Spring)

Spring Interceptors(스프링 인터셉터)

개발학생 2023. 1. 2. 20:03
반응형

*22년 4월 한 달간 한국이러닝협회의 '실전 개발자를 위한 Spring Framework'를 수강하고 정리한 내용입니다

*모든 이미지의 출처는 한국이러닝협회의 '전 개발자를 위한 Spring Framework'에 있습니다

 

 

1. Spring Interceptors의 특징

- 모든 요청에서 반드시 거쳐야 하는 Servlet Filter와 유사하지만, 인터셉터는 컨트롤러 요청에만 적용됨

- Been Container 로딩 후에 적용되므로, Bean 사용 가능

- 총 3부분에 대해 공통 기능을 넣을 수 있음

  1) preHandle: 컨트롤러(핸들러) 실행 전
  2) postHandle: 컨트롤러(핸들러) 실행 후, 아직 뷰를 실행하기 전
  3) afterCompletion: 뷰를 실행한 이후

 

2. 사례: 웹 요청 처리시간 측정기

- preHandle과 afterCompletion을 이용

- 웹사이트에서 어떤 URK이 가장 많이 호출되고, 얼마나 많은 시간이 걸리는지 알 수 있는 방법

 

1) 인터셉터 생성

public class MeasuringInterceptor extends HandlerInterceptorAdapter {

	@Override
    public boolean preHandle(HttpServletRequest request,
    	HttpServletResponse response, Object handler) throws Exception {
        request.setAttribute("mi.beginTime", Syster.currentTimeMills());
        return true;
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request,
    HttpServletResponse response, Object handler, Exception ex)
    
    throws Exception
    	long beginTime = (long) request.getAttribute("mi.beginTime");
        long endTime = System.currentTimeMills();
        
        System.out.println(request.getRequestURI() + "실행시간:"
        			+ (endTime - beginTime));
    }
}

 

2) 특정 URL 지정하기

- /test/로 시작하는 모든 URL, /event/로 시작하는 모든 URL에 MeasuringInterceptor 적용

<mvc:interceptors>
	<mvc:interceptor>
    	<mvc:mapping path="/text/**/"/>
        <mvc:mapping path="/event/**/"/>
        <bean id="measuringinterceptor"
        	  class="kr.co.acomp.hello.interceptor.MeasuringInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

 

3) Servlet-context.xml 설정

<mvc:interceptors>
<bear id="measuringInterceptor"
	  class="kr.co.acomp.hello.interceptor.MeasuringInterceptor" />
</mvc:interceptors>

 

4) 실행 결과

 

3. 사례: 로그인 처리

- 요청 경로마다 별도의 접근제어가 필요하고, 접근 내용을 기록함

- preHandle를 이용한 로그인 체크기 제작

- 컨트롤러보다 로그인을 체크하는 중복 코드를 만들지 않고 로그인 체크

 

1) 인터셉터 생성

public class LoginCheckInterceptor extends HandlerInterceptorAdapter {

	@Override
	public boolean preHandle(HttpServletRequest request,
    HttpServletResponse response, Object handler) throws Exception {
    	boolean wasLogin = request.getSession().getAttribute("_MEMBER_") != null;
        
        if(!wasLogin) {
        	response.sendRedirect("http://www.naver.com");
        }
        
        return wasLogin;
}

 

2) DispatcherServlet 설정

<mvc:interceptors>
	<mvc:interceptor>
    	<mvc:mapping path="/test/**/" />
        <mvc:mapping path="/event/**/" />
        <bean id = "measuringInterceptor"
        	  class = "kr.co.acomp.hello.interceptor.MeasuringInterceptor" />
    </mvc:interceptor>
    <mvc:interceptor>
    	<mvc:mapping path="/**" />
        	<mvc:exclude-mapping path="/index" />
            <mvc:exclude-mapping path="/regist" />
            <mvc:exclude-mapping path="/login" />
            <bean id="loginCheckInterceptor"
            	  class="kr.co.acomp.hello.interceptor.LoginCheckInterceptor" />
    </mvc:interceptor>
</mvc:interceptors>

 

3) Interceptor가 선언된 순서대로 실행됨

- measuringInterceptor -> loginCheckIntercepter

 

반응형