구글링으로 'Intercepter 가 무엇인가 ?' 라는 물음에 대해
'공통관심사를 분리하여 API 가 호출될 때에 세 가지 시점에 맞춰 필요한 로직을 입맛대로 구현할 수 있는 기능이야' 까지는 대답을 할 수 있었다.
하지만 구현은 해본적이 없어 직접 설정을 해보았다.
: (
빈수 깃허브 >> https://github.com/soobinJung/Intercepter
실행되지 않는 인터셉트
공부한 곧이곧대로 코드를 적었으나 아무리 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.";
}
}
'개발중 > Spring' 카테고리의 다른 글
[Spring] 단일책임원칙을 지키고 있나요 (0) | 2022.12.16 |
---|---|
intellij jdk 설정하는 방법 기록하기 ✍ (0) | 2022.12.04 |
서블릿 필터와, 스프링 인터셉터 ( 면접단골질문 ) 🎹 (0) | 2022.11.25 |
@NotNull, @NotEmpty, @NotBlank (0) | 2022.11.24 |
@RestController, ResponseEntity, @PathVariable (0) | 2022.11.19 |