반응형
로그인을 수행한 이후에만 사용 가능한 기능들이 있을 경우 로그인이 정상적으로 이뤄졌는지 확인하는 것은 세션을 통해 간단히 확인할 수 있습니다. 그러나 해당 기능들과 매핑된 모든 메서드에서 로그인 여부를 확인하는 것은 코드도 길어질 뿐만 아니라 매우 귀찮은 작업이라고 할 수 있습니다.
만약 이와 같이 특정 경로에 접근하기 전에 확인해야 될 내용(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 순으로 로그가 찍히는 것을 확인할 수 있습니다.
'Study > WEB' 카테고리의 다른 글
Kotlin에 대하여 알아보자 (0) | 2022.08.01 |
---|---|
Spring과 Spring Boot의 차이점에 대해 알아보기 (0) | 2022.07.26 |
[Spring Boot] Bean 이해하기 (With Spring Container) (0) | 2022.07.25 |
[Spring Boot With Kotlin] RESTFul API, JSON 데이터 처리하기 (0) | 2022.07.24 |
[Spring Boot With Kotlin] 오류 별 해결 방안 정리 (0) | 2022.07.24 |
댓글