본문 바로가기
개발/Spring FW

[Spring FW] Interceptor

by Devsong26 2023. 12. 9.

Spring Framework에서 Interceptor는 웹 애플리케이션에서 요청 처리 과정에 특정 작업을 수행하도록 하는 메커니즘입니다. 이는 AOP(Aspect-Oriented Programming)의 개념과 유사하며, 주로 요청의 전처리(pre-processing)나 후처리(post-processing)를 담당합니다. Interceptor는 핸들러 매핑(HandlerMapping)과 연계하여 사용되며, 컨트롤러(Controller)가 요청을 처리하기 전후에 특정 작업을 수행할 수 있게 해줍니다.

Interceptor를 구현하고 사용하기 위한 주요 단계는 다음과 같습니다:

  • Interceptor 구현
    • HandlerInterceptor` 인터페이스를 구현하는 클래스를 만듭니다. 이 인터페이스에는 주로 `preHandle()`, `postHandle()`, `afterCompletion()` 세 가지 메소드가 있습니다.
    • preHandle()는 요청이 컨트롤러에 도달하기 전에 호출됩니다. 이 메소드에서는 인증 검사와 같은 전처리 작업을 수행할 수 있습니다.
    • postHandle()는 컨트롤러가 요청을 처리한 후, 뷰(View)가 렌더링되기 전에 호출됩니다.
    • afterCompletion()는 요청 처리가 완전히 끝난 후, 즉 뷰가 렌더링되고 응답이 클라이언트에 전송된 후에 호출됩니다.
  • Spring 구성에 Interceptor 등록
    • 구현한 Interceptor를 Spring의 웹 애플리케이션 컨텍스트에 등록합니다. 이는 XML 기반 구성 또는 Java 기반 구성(Java Config)을 사용하여 수행할 수 있습니다.
  • URL 매핑
    • Interceptor를 특정 URL 패턴에 적용하도록 구성합니다. 이를 통해 특정 요청에 대해서만 Interceptor가 동작하도록 할 수 있습니다.


Interceptor는 Spring MVC의 흐름을 유연하게 제어하고, 공통된 로직(예: 로깅, 인증, 검증 등)을 중앙에서 관리할 수 있게 해주는 강력한 도구입니다. 그러나 과도한 사용은 애플리케이션의 복잡성을 증가시킬 수 있으므로, 필요한 경우에만 적절하게 사용하는 것이 중요합니다.

 

 

 

동작원리

 

Spring Framework에서 Interceptor의 동작 원리를 이해하기 위해서는 먼저 Spring MVC의 요청 처리 과정을 알아야 합니다. Spring MVC에서 HTTP 요청이 들어오면, DispatcherServlet이 그 요청을 받아 처리합니다. 이 과정에서 Interceptor는 DispatcherServlet과 실제 요청을 처리하는 Controller 사이에서 특정 로직을 실행하는 역할을 합니다.

Interceptor의 주요 동작 원리는 다음과 같습니다:

  • 요청 수신
    • DispatcherServlet이 HTTP 요청을 받습니다.
  • Interceptor 체인 실행
    • DispatcherServlet은 해당 요청에 매핑된 Interceptor들을 순서대로 실행합니다. 이 때, 각 Interceptor의 `preHandle()` 메소드가 호출됩니다.
    • `preHandle()` 메소드는 요청이 Controller에 도달하기 전에 실행됩니다. 이 메소드는 boolean 값을 반환하며, `true`를 반환하면 요청 처리가 계속 진행되고, `false`를 반환하면 요청 처리가 중단됩니다. `false`를 반환할 경우, 이후의 Interceptor 체인 및 Controller에 대한 요청 처리는 실행되지 않습니다.
  • Controller 실행
    • 모든 `preHandle()` 메소드가 `true`를 반환하면, 요청은 Controller로 이동하여 실제 비즈니스 로직이 처리됩니다.
  • Interceptor의 `postHandle()` 실행
    • Controller에서 요청을 처리한 후, DispatcherServlet은 다시 Interceptor 체인을 역순으로 실행합니다. 이 때, 각 Interceptor의 `postHandle()` 메소드가 호출됩니다.
    • `postHandle()` 메소드는 Controller가 요청을 처리하고, 뷰를 렌더링하기 전에 실행됩니다. 이는 요청 처리에 대한 후처리 작업에 적합합니다.
  • 뷰 렌더링
    • Controller가 반환한 ModelAndView 객체를 바탕으로 뷰가 렌더링됩니다.
  • Interceptor의 `afterCompletion()` 실행
    • 마지막으로, 요청 처리가 완전히 끝나고 응답이 클라이언트로 전송된 후, Interceptor 체인의 `afterCompletion()` 메소드가 역순으로 호출됩니다.
    • `afterCompletion()` 메소드는 전체 요청 처리 과정이 완료된 후에 호출되므로, 주로 자원 해제와 같은 정리 작업에 사용됩니다.

 

Interceptor는 이렇게 DispatcherServlet과 Controller 사이의 여러 지점에서 요청 처리 과정에 개입하여, 로깅, 인증, 권한 검사, 공통 로직 처리 등 다양한 목적으로 사용될 수 있습니다.

'개발 > Spring FW' 카테고리의 다른 글

[MyBatis] TypeHandler  (0) 2023.12.12
[Spring FW] Filter  (0) 2023.12.10
Spring에서 ApplicationEvent 처리하기  (0) 2023.11.29
스프링 트랜잭션  (0) 2023.11.26
Feign Client  (2) 2023.11.25