본문 바로가기

개발중/Spring

[스프링] Intercepter 설정하는 법에 대해서 ✍

728x90
반응형

구글링으로 'Intercepter 가 무엇인가 ?' 라는 물음에 대해 

'공통관심사를 분리하여 API 가 호출될 때에 세 가지 시점에 맞춰 필요한 로직을 입맛대로 구현할 수 있는 기능이야' 까지는 대답을 할 수 있었다.

 

하지만 구현은 해본적이 없어 직접 설정을 해보았다.

: (

 

빈수 깃허브 >> https://github.com/soobinJung/Intercepter

 

GitHub - soobinJung/Intercepter: Intercepter Test

Intercepter Test. Contribute to soobinJung/Intercepter development by creating an account on GitHub.

github.com


실행되지 않는 인터셉트

 

공부한 곧이곧대로 코드를 적었으나 아무리 API 를 호출해도 

preHandle, postHandle, afterCompletion 아무것도 호출된 흔적이 없었다.

 

package com.example.binsoo.intercepter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class Intercepter implements HandlerInterceptor {

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

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

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

 

설정에 대해 찾아보기 시작했다.

 

 xml 뿐만 아니라 다양한 설정에 대한 정보가 널려있었다.

WebMvcConfigurer 를 상속받고 addInterceptors 를 구현했다.

 

package com.example.binsoo.intercepter;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new Intercepter())
                .addPathPatterns("/api/*") // 해당 경로에 접근하기 전에 인터셉터가 가로챈다.
                .excludePathPatterns("/api/no"); // 해당 경로는 인터셉터가 가로채지 않는다.
    }
}

 

위의 코드에서 주의깊게 봐야 할 부분은 세 가지이다.

 

1️⃣ Intercepter 를 구현하고 적용시키지 않으면 무슨 소용일까 ?

InterceptorRegistry 에 addInterceptor 를 이용해 구현한 Intercepter 를 적용시켜주자.

 

2️⃣ Interceptor가 실행되어야 하는 API 경로 지정

addPathPatterns 로 Interceptor 가 실행되어야 하는 경로를 지정해주자.

 

3️⃣ Interceptor가 실행되어서는 안되는 API 경로 지정

excludePathPattern 를 이용해서 인터셉터가 가로채지 않아도 되는 경로를 지정해주자.

 


 

테스트 코드

 

아래의 두 가지 API 가 존재할 경우를 가정해보자.

  • /api/yes
    • /api 의 하위에 있기 때문에 Interceptor 가 동작한다.
  • /api/no
    • /api 의 하위에 있지만 제외 url 로 지정했기 때문에 동작하지 않는다.

 

package com.example.binsoo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api")
public class TestController {

    @GetMapping("/yes")
    public String yesBinsoo() {
        System.out.println("Intercepter Yes.");
        return "Intercepter Yes.";
    }

    @GetMapping("/no")
    public String noBinsoo() {
        System.out.println("Intercepter No.");
        return "Intercepter No.";
    }
}

 


728x90
반응형