나의개발일지

Spring) Interceptor 본문

Back-End/Spring

Spring) Interceptor

아. 이렇게 하면 될거 같은데.. 2024. 4. 19. 00:39
728x90



Interceptor

  • Controller가 요청을 처리하기 전/후 처리
  • 공통 코드 사용으로 코드 재사용성 증가
  • 로깅, 모니터링 정보 수집, 접근 제어 처리 등의 실제 Business Logic과는 분리되어 처리해야 하는 기능들을 넣고 싶을 때 유용함

 

Interceptor 종류

preHandle

  • Controller method가 실행되기 전 호출
  • return 타입이 boolean => false를 반환하면 request를 바로 종료
  • 전처리 작업이나 요청 정보를 가공하는 작업등

postHandle

  • Controller method 실행 직후 view 페이지가 렌더링 되기 전 호출
  • return 타입이 void

afterCompletion

  • view 페이지가 렌더링 되고 난 후 호출
  • 예외가 발생해도 실행
  • return 타입이 void

 


Interceptor 등록 및 호출

 

Interceptor 등록

Interceptor는 웹관련 로직이므로 웹 관련 설정파일인 servlet-context.xml에 등록한다.

 

<servlet-context.xml>

<interceptors>
	<interceptor>
    	<mapping path="/article"/>
        <beans:bean class="com.company.interceptor.AInterceptor"/>
    </interceptor>
    <interceptor>
    	<mapping path="/article"/>
        <beans:bean class="com.company.interceptor.BInterceptor"/>
    </interceptor>
   <interceptor>
    	<mapping path="/article"/>
        <beans:bean class="com.company.interceptor.CInterceptor"/>
    </interceptor>
</interceptors>

 

 

Interceptor는 처리되는 순서가 중요하다 위의 코드를 실행시 preHandle, postHandle, afterCompletion의 순서는 다음 그림과 같다.

 

Interceptor 호출

HandlerInterceptor 인터페이스 구현

<Ainterceptor class 구현> = implements HandlerInterceptor 

package com.company.interceptor;

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

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class AInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        System.out.println("AInterceptor - preHandle");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("AInterceptor - postHandle");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
            Exception ex) throws Exception {
        System.out.println("AInterceptor - afterCompletion");
    }

}

 

 

위의 형식으로 B, C interceptor도 구현하고 /article 요청을 보내면 실행결과로는

AInterceptor - preHandle
BInterceptor - preHandle
CInterceptor - preHandle
(컨트롤러에 대한 요청 처리)
CInterceptor - postHandle
BInterceptor - postHandle
AInterceptor - postHandle
CInterceptor - afterCompletion
BInterceptor - afterCompletion
AInterceptor - afterCompletion

 

이런식으로 나오게 된다.

728x90
반응형

'Back-End > Spring' 카테고리의 다른 글

Spring) RestAPI  (0) 2024.04.24
Spring) Mybatis  (2) 2024.04.23
Spring) AOP  (0) 2024.04.17
Spring) DI 의존성 주입  (0) 2024.04.15
Spring) IoC & Container  (0) 2024.04.15