스프링 인터셉터는 스프링 MVC 프레임워크에서 HTTP 요청을 가로채어 처리하는 컴포넌트입니다. 클라이언트의 요청이 컨트롤러로 전달되기 전에 사전 작업을 수행하거나, 컨트롤러의 실행 이후에 사후 작업을 수행할 수 있습니다. 즉, 서버에 들어온 Request객체를 컨트롤러의 핸들러(url에 매핑되어있는 매서드)로 도달하기 전에 낚아채서 개발자가 원하는 추가적인 작업을 한 후 핸들러로 보낼 수 있도록 해주는 것이 인터셉터입니다.
스프링 인터셉터는 여러 컨트롤러에서 공통으로 처리해야 하는 작업을 중앙에서 관리할 수 있습니다. 예를 들어 인증이나 권한 검사, 로깅등과 같은 전역적인 작업을 인터셉터에서 처리할 수 있습니다. 이는 코드의 중복을 줄이고 유지보수성을 향상시키는데 도움을 줍니다.
인터셉터는 HTTP 요청 전후의 처리 흐름을 제어할 수 있습니다. 클라이언트의 요청이 컨트롤러에 도달하기 전에 사전 작업을 수행하거나, 컨트롤러의 실행 이후에 사후 작업을 수행하는 등의 제어가 가능합니다. 이를 통해 요청의 전처리나 후처리를 담당할 수 있습니다.
스프링 인터셉터는 다양한 방식으로 설정할 수 있습니다. XML, 애노테이션, JavaConfig 등의 설정 방법을 사용하여 인터셉터를 등록하고 관리할 수 있습니다. 이는 개발자의 선호나 프로젝트의 요구에 맞게 유연하게 설정할 수 있도록 합니다.
스프링 인터셉터는 다양한 용도로 활용할 수 있습니다. 주로 인증과 권한 검사, 로깅, 트랜잭션 관리 등의 전역적인 작업을 처리하는데 사용되지만, 요청 처리의 어떤 단계에서든 원하는 작업을 수행할 수 있습니다. 예를 들어, 캐싱, 데이터 변환, 압축 등의 작업도 인터셉터를 통해 처리할 수 있습니다.
스프링은 다중 인터셉터를 지원하여 여러 개의 인터셉터를 등록하고 순차적으로 실행할 수 있습니다. 이를 통해 여러 개의 인터셉터가 각각의 작업을 수행하고 결과를 조합하여 최종 처리 결과를 도출할 수 있습니다.
개발자가 특정 Controller의 핸들러가 실행되기 전이나 후에 추가적인 작업을 원할 때 Interceptor를 사용합니다. 스프링 인터셉터를 사용함으로써 코드의 중복을 줄이고 관심사를 분리하여 개발자는 핵심 비즈니스 로직에 집중할 수 있습니다. 또한, 유연한 설정 방식과 다중 인터셉터 지원으로 인해 개발자는 프로젝트의 요구에 맞게 인터셉터를 활용할 수 있습니다.
클라이언트의 요청이 들어오면 먼저 HandlerMapping 이라는 Spring 컴포넌트가 요청과 관련된 적절한 컨트롤러를 찾는다. HandlerMapping은 요청 URL을 기반으로 컨트롤러를 선택하는 역할을 한다.
HandlerMapping은 해당 컨트롤러와 연결된 Interceptor 체인을 생성한다. Interceptor 체인은 여러개의 Interceptor 객체로 구성될 수 있으며, 각각의 Interceptor는 요청을 가로 채고 처리하는 역할을 수행한다.
Interceptor 체인의 각 Interceptor는 PreHandle 매서드를 호출하여 요청을 가로챈다.PreHandle 매서드는 요청을 처리하기 전에 싱행되는 매서드로, 요청에 대한 사전 작업을 수행할 수 있다.
PreHandle 메서드 실행 후, HandlerMapping은 적절한 컨트롤러를 호출합니다. 컨트롤러는 클라이언트 요청을 처리하고, 결과를 반환합니다.
컨트롤러가 실행된 후에는 Interceptor 체인의 각 Interceptor의 PostHandle 메서드가 호출됩니다. PostHandle 메서드는 컨트롤러의 실행 결과를 가로채고, 후속 작업을 수행할 수 있습니다.
PostHandle 메서드 실행 후, HandlerMapping은 적절한 View를 렌더링하여 클라이언트에게 응답을 보냅니다.
응답이 완료되면 Interceptor 체인의 각 Interceptor의 AfterCompletion 메서드가 호출됩니다. AfterCompletion 메서드는 요청 처리가 완료된 후에 실행되며, 리소스 정리나 로깅 등의 작업을 수행할 수 있습니다.
스프링 인터셉터는 HandlerInterceptor 인터페이스를 구현하여 작성됩니다. 이 인터페이스는 세 가지 메서드를 가지고 있습니다:
Interceptor를 사용하면 로그인 체크, 권한 검사, 로깅, 예외 처리 등과 같은 공통적인 기능을 중앙에서 관리할 수 있습니다. 중복 코드를 제거하고 유지보수성을 향상시킬 수 있습니다.
Interceptor는 여러 컨트롤러에 적용될 수 있으며, Interceptor 체인을 구성하여 여러 개의 Interceptor를 조합할 수 있습니다. 이로 인해 공통 기능을 간편하게 재사용하고, 필요에 따라 확장할 수 있습니다.
Interceptor는 요청 전(preHandle)과 후(postHandle)에 실행되는 메서드를 제공하여 요청 처리 과정을 세밀하게 제어할 수 있습니다. 예를 들어, 요청 전에 인증 체크를 수행하거나, 요청 후에 로깅 작업을 수행할 수 있습니다.
Interceptor를 사용하면 예외 처리를 중앙에서 처리할 수 있습니다. 예외가 발생하면 Interceptor의 예외 처리 메서드를 활용하여 일관된 방식으로 예외를 처리하고 사용자에게 적절한 응답을 보낼 수 있습니다.
Interceptor는 요청과 응답 사이에 위치하므로, 매 요청마다 Interceptor 체인이 실행되어야 합니다. Interceptor가 많거나 복잡한 작업을 수행하는 경우 성능에 영향을 줄 수 있습니다. 따라서 Interceptor의 사용은 신중하게 고려되어야 합니다.
Interceptor는 컨트롤러와 긴밀하게 결합되어 있습니다. 이는 컨트롤러의 변경에 따라 Interceptor도 변경될 수 있음을 의미합니다. 따라서 Interceptor의 사용은 컨트롤러와의 강한 결합도를 가질 수 있으므로 유지보수에 주의가 필요합니다.
Interceptor 체인에서 Interceptor의 실행 순서와 조건 제어를 올바르게 설정해야 합니다. 잘못된 순서나 조건 설정은 의도하지 않은 동작을 유발할 수 있으므로 주의가 필요합니다.
Interceptor는 주로 웹 요청을 처리하는 데 사용됩니다. 따라서 웹 애플리케이션에만 적용 가능하며, 다른 종류의 요청이나 서비스에는 사용할 수 없습니다.
잘 봤습니다. 좋은 글 감사합니다.