티스토리 뷰

SPRING 공부/서블릿

Spring Interceptor

CodingDreamTree 2022. 7. 13. 21:05

인터셉터란?

스프링에서 제공하는  제공하는 기능으로 Dispatcher Servlet과 매핑된 URL의 Controller의 사이에서 존재하며

해당 Controller 호출 전과 후에 요청, 응답을 참조하거나 가공할 수 있는 필터라고 볼 수 있다.

 

주 용도로는 인증/인가 작업이나, API 호출에대한 로깅, 요청 응답 정보 가공등이 있다.

 

여기서 의문이 드는점이 있는데, 사실 필터랑 인터셉터랑 무슨 차이가 있냐이다.

1. 관리 주관자가 다르다.   필터 : 웹 Servlet 컨테이너 , 인터셉터: 스프링 컨테이너

2. Request,Response 객체를 새로운 객체로 넣을 수 있나?   필터 : Yes    ,  인터셉터 : No

    -> 필터에서는 request,response를 다음 필터로 넘겨주는 필터 체인을 쓰나, 인터셉터에서는 

          request,response에 객체 내부 상태만 변경 가능 할 뿐이다.

3. 용도에서 Filter가 포괄적인 기능을 담당하고, Interceptor에서  세분화된 기능을 담당한다.

 

 

구현해보기

1. HadnlerInterceptor 인터페이스를 구현하는 구현체를 만든다.

@Component
@RequiredArgsConstructor
@Slf4j
public class CustomInterceptor implements HandlerInterceptor {

    private final ExampleLog exampleLog;

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        log.info("CustomInterceptor preHandle 호출");
        log.info("인터셉터 CustomInterceptor 내의 exampleLog Bean 메서드 호출 시작 =====");
        exampleLog.testLog();
        log.info("인터셉터 CustomInterceptor 내의 exampleLog Bean 메서드 호출 끝 =====");
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        log.info("CustomInterceptor postHandle 호출");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        log.info("CustomInterceptor afterCompletion 호출");
    }
}

 

2. 각 메서드에 사용하고자 하는 기능을 넣는다.

1) preHadnle 메서드 - Controller 호출 직전 적용할 기능을 넣는다.

2) postHandle 메서드 - Controller 호출 후 적용할 기능을 넣는다.

3) afterCompletion 메서드 - View rendering 이후 적용할 기능을 넣는다.

                                             모든 것이 끝나면 클라이언트에게 Response를 전달한다.

 

 

3. WebMvcConfigurer 구현체에 인터셉터를 추가 등록 해준다.

 

@RequiredArgsConstructor
@Configuration
public class WebConfig implements WebMvcConfigurer {

    private final CustomTestFilter customFilter;
    private final CustomInterceptor customInterceptor;

    //필터를 Bean으로 등록해주기
    @Bean
    public FilterRegistrationBean customFilter(){
        FilterRegistrationBean<Filter>  filterRegistrationBean = new FilterRegistrationBean<>();
        filterRegistrationBean.setFilter(customFilter);
        filterRegistrationBean.setOrder(1);
        filterRegistrationBean.addUrlPatterns("/*");
        return filterRegistrationBean;
    }

    //InterCeptor 등록해주기
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(customInterceptor);
    }
}

 

4. 테스트코드로 해당 컨트롤러를 호출해서 로그를 확인해보자

 

@AutoConfigureMockMvc
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.MOCK)
public class ExampleControllerIntegreTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    void getExample() throws Exception{
        ResultActions resultActions = mockMvc.perform(get("/example")
                                                        .accept(MediaType.APPLICATION_JSON)
                                                        .contentType(MediaType.APPLICATION_JSON)
                                                        );

        resultActions.andDo(MockMvcResultHandlers.print());
    }

}

 

자세히 보면 Filter -> Interceptor -> Controller 순으로 호출되는 것을 볼 수 있다.

 

지식 출처 : [Spring] 필터(Filter) vs 인터셉터(Interceptor) 차이 및 용도 - (1) - MangKyu's Diary (tistory.com)  

                  Spring에서 Handler Interceptor 개념 및 구현해보기 (goodgid.github.io)

'SPRING 공부 > 서블릿' 카테고리의 다른 글

서블릿 필터  (0) 2022.07.10
Spring Servlet의 원리  (0) 2022.01.19
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함