본문 바로가기
Study/WEB

[Spring Boot With Kotlin] Spring Interceptor

by Becoming a Hacker 2022. 7. 25.
반응형

로그인을 수행한 이후에만 사용 가능한 기능들이 있을 경우 로그인이 정상적으로 이뤄졌는지 확인하는 것은 세션을 통해 간단히 확인할 수 있습니다. 그러나 해당 기능들과 매핑된 모든 메서드에서 로그인 여부를 확인하는 것은 코드도 길어질 뿐만 아니라 매우 귀찮은 작업이라고 할 수 있습니다.

 

만약 이와 같이 특정 경로에 접근하기 전에 확인해야 될 내용(ex: 권한 확인, 로그 수집)이 있다면 Spring Interceptor를 이용하여 쉽게 확인할 수 있습니다.

 

Spring Interceptor는 "Request가 처리되기 이전"과 "Request가 처리된 이후" 그리고 "모든 요청이 마무리 된 이후"에 필요한 작업을 정의하여 처리할 수 있습니다.

Method 설명
preHandle Request가 처리되기 이전
postHandle Request가 처리된 이후
afterCompletion 모든 요청이 마무리된 이후

 

먼저 특정 경로에 접근하기 전에 처리할 코드가 포함된 Interceptor를 정의합니다.

LogInterceptor.kt

class LogInterceptor : HandlerInterceptor {
    override fun preHandle(request: HttpServletRequest, response: HttpServletResponse, handler: Any): Boolean {
        println("[preHandle][${request}] : [${request.method}] ${request.requestURI}")
        return true
    }

    override fun postHandle(
        request: HttpServletRequest,
        response: HttpServletResponse,
        handler: Any,
        modelAndView: ModelAndView?
    ) {
        println("[postHandle][$request]")
    }

    override fun afterCompletion(
        request: HttpServletRequest,
        response: HttpServletResponse,
        handler: Any,
        ex: Exception?
    ) {
        println("[afterCompletion][request]")
    }
}

 

이후, WebMvcConfigurer를 상속한 Class를 생성하여 Interceptor를 연결해줍니다.

addPathPatterns : Interceptor할 경로 지정

excludePathPatterns : Interceptor 하지 않을 경로 지정

@Configuration
class WebConfig: WebMvcConfigurer{
    override fun addInterceptors(registry: InterceptorRegistry) {
        // path need to log check
        val logCheckList = Arrays.asList("/admin/**")
        // path don`t need to log check
        val logExceptionCheckList = Arrays.asList("/icons/**", "/css/**", "/js/**","/plugins/**","/images/**")

        registry.addInterceptor(LoginInterceptor())
            .addPathPatterns(logCheckList)
            .excludePathPatterns(logExceptionCheckList)
    }
}

 

마지막으로 Controller를 생성하여 /main 경로에 매핑한 뒤 애플리케이션을 실행시켜 줍니다.

@Controller
class MainController {
    @GetMapping("/main")
    fun index(model: Model): String{
        println("/main")
        return "index" // templates file name without file extension
    }
}

 

앞서 설명드린 것과 같이 preHandle > Controller > postHandle > afterCompletion 순으로 로그가 찍히는 것을 확인할 수 있습니다.

 

댓글