Spring Boot: Interceptor 인터셉터

김아무개·2023년 6월 7일
0

Spring Boot 🍃

목록 보기
32/95
post-custom-banner

보고 배운 인강 링크 1
보고 배운 인강 링크 2

인터셉터

  • 스프링에서 제공하는 공통처리 기능

  • Filter와 매우 유사한 형태로 존재한다.

    Filter와 차이점은
    Filter는 Web Application에 등록되고
    Interceptor는 Spring Context에 등록 된다는 점이다.

  • 실제 매핑된 Handler 정보 확인 가능

  • 조금 더 상세한 조건식과,
    세부적인 스펙(pre, post, after)을 통해 구체적인 시점에 구체적인 동작이 가능하다.

  • AOP와 유사한 기능을 제공할 수 있으며,

    AOP와 비교한다면
    AOP는 인터셉터보다 더 구체적인 조건( 어노테이션, 파라미터, 주소 등 )과
    동작 위치(After Throwing 등)을 갖는다.

  • logging을 하는데에 사용되기도 하지만 , 주로 인증 단계를 처리한다.
    이를 선/후 처리 함으로써 Service business logic과 분리 시킨다.



HandlerInterceptor

컨트롤러(Controller)의 메서드 실행 전후에 특정한 작업을 수행할 수 있게 해준다.

preHandle()

컨트롤러의 메서드가 실행되기 전에 호출된다.

preHandler()을 사용하여 요청의 전처리 작업을 수행할 수 있다.

예를 들어, 특정한 조건을 검사하거나 인증/인가 절차를 수행할 수 있다.
이 메서드가 false를 반환하면 요청의 처리가 중단되고 컨트롤러 메서드는 실행되지 않는다.

postHandle()

컨트롤러의 메서드 실행 후, 뷰(View)가 렌더링 되기 전에 호출된다.

해당 메서드를 사용하여 응답 데이터를 가공하거나 로깅 등의 후처리 작업을 수행할 수 있다.

afterCompletion()

뷰가 렌더링 된 후에 호출된다.

해당 메서드를 사용하여 리소스 해제로깅 등의 마무리 작업을 수행할 수 있다.
이 메서드는 요청의 처리가 완료된 후 항상 호출되며, 예외 발생 여부와 상관없이 실행된다.



WebMvcConfigurer

스프링 MVC의 구성(config)을 커스터마이징하기 위해 사용되는 인터페이스이다.

이 인터페이스에서 제공하는 addInterceptors 메서드를 사용해서
인터셉터(HandlerInterceptor)를 등록하고, 요청 전후에 수행할 작업을 정의할 수 있다.



interceptor 생성 실습

1. interceptor 파일 작성

HandlerInterceptor 인스턴스를 상속받고,
@Component 어노테이션을 붙여준다.

@Component
public class AuthInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
		// 요청 url 확인
		String url = request.getRequestURI();
        log.info("request url : {}", url);
        
        // 반환값이 false 이면, 해당 요청 경로의 controller 실행이 안됨
        return true;
    }

}

2. config 파일 작성

작성한 interceptor를
WebMvcConfigurer에 등록해주어야 동작을 한다.

WebMvcConfigurer 인터페이스를 상속받고, @Configuration어노테이션을 붙여준다음

addInterceptors 메서드를 오버라이드 하여

작성했던 interceptor 파일을 등록해준다.

@Configuration
@RequiredArgsConstructor
public class MvcConfig implements WebMvcConfigurer {

    private final AuthInterceptor authInterceptor;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    	// addInterceptor만 작성하면 모든 경로에서 인터셉터가 동작하며,
        registry.addInterceptor(authInterceptor)
                // addPathPatterns()를 붙여주면 특정 uri에만 인터셉터를 동작시킨다.
        		.addPathPatterns("/users", "/login")
                // excludePathPatterns()를 붙여주면 특정 uri는 제외하고 인터셉터가 동작한다.
                .excludePathPatterns("/join");
    }
}
profile
Hello velog! 
post-custom-banner

0개의 댓글