Interceptor 사용해보기

PostController

간단하게 실험용으로 Get 요청 시 Hello World 를 반환하는 컨트롤러를 만든다.

@GetMapping("/hello")
public String hello() {
    return "Hello World";
}

AuthIntercepteor

인터셉터를 구현하기 위해 우선 HandlerInterceptor 를 상속받는 인터셉터 클래스를 하나 만든다.

윈도우 기준 ctrl + i 를 누르면 구현할 수 있는 아래 사진처럼 메서드 목록이 나온다.

전부 다 구현하고 어떻게 동작하는지 확인할겸 로그를 찍어볼것이다.

@Slf4j
public class AuthInterceptor implements HandlerInterceptor {

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

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

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

 preHandle

이 글에서 설명했듯 prehandle 은 boolean 값을 return 값으로 반환한다.

true 면 다음 단계를 진행하고 false 면 해당 요청을 거기서 중단한다.

WebMvcConfig

인터셉터를 적용하기 위해 아래처럼 Config 를 설정해준다.

이렇게 설정하면 모든 컨트롤러에 대해 인터셉터가 동작할것이다.

애플리케이션을 실행하거나 Mock 테스트를 수행하고 로그를 확인하면 아래처럼 동작하는걸 확인할 수 있다.

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new AuthInterceptor());
    }
}

 


ControllerTest

위에서 작성한 AuthIntercepteor 의 preHandle 값에 따른 인터셉터 호출을 비교해보기 위해 간단한 Mock 테스트를 수행한다.

@DisplayName("/hello 요청시 Hello World 를 출력한다.")
@Test
void hello() throws Exception {
    mockMvc.perform(
        MockMvcRequestBuilders.get("/hello")
        )
        .andExpect(status().isOk())
        .andExpect(content().string("Hello World"))
        .andDo(print());
}

ㄴ preHandle - true

prehandle, postHandle, afterCompletion 모두 호출된다.

ㄴ preHandle - false

preHandle 만 호출된다.

'백엔드 > Spring' 카테고리의 다른 글

@ConfigurationProperties로 환경 변수 관리  (0) 2023.10.08
ArgumentResolver  (0) 2023.09.29
Filter  (0) 2023.09.29
Interceptor  (0) 2023.09.29
BeanValidation 써보기  (0) 2023.09.22

+ Recent posts