rhanziy

Spring - Spring Interceptor 스프링 인터셉터 본문

Java

Spring - Spring Interceptor 스프링 인터셉터

rhanziy 2023. 4. 21. 15:43

1. 정의 및 사용예시

인터셉터(Interceptor)란?
컨트롤러(Controller)의 '핸들러(Handler)'를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 일종의 필터.
intercept라는 단어는 '낚아채다'라는 의미이다. 해당 단어의 의미와 같이 사용자 요청에 의해 서버에 들어온 Request 객체를 컨트롤러의 핸들러(사용자가 요청한 url에 따라 실행되어야 할 메서드, 이하 핸들러)로 도달하기 전에 낚아채서 개발자가 원하는 추가적인 작업을 한 후 핸들러로 보낼 수 있도록 해주는 것.

 

개발자는 특정 Controller의 핸들러가 실행이 되기 전이나 후에 추가적인 작업을 원할 때 Interceptor를 사용할 수 있다.

 

ex) 개발자가 관리자 계정만이 실행할 수 있는 Controller 핸들러를 작성할 때, 핸들러에 접근하는 사용자가 관리자인지 확인하는 세션 체크 코드를 각 핸들러에 작성해야한다.

이 때, 적용해야 할 핸들러가 수천개라면 일일이 코드를 작성함으로써,  1. 메모리 낭비/서버의 부하가중 2. 코드의 누락 발생 가능성이라는 문제점이 야기된다.

 

이러한 문제점들을 방지하기 위해 인터셉터를 사용할 수 있다. 인터셉터를 사용하게 되면 개발자는 핸들러 수만큼 작성했던 세션체크코드를 인터셉터 클래스에 한번만 작성하면 된다. 그리고 인터셉터 적용 유무의 기준이 되는 url을 servelt-conetext.xml에 설정을 해주게 되면 스프링에서 일괄적으로 해당 url 경로의 핸들러에 인터셉터를 적용해주기 때문에 누락에 대한 위험이 상당히 줄게 된다.

 


2. 구현

 

 스프링에서 제공하는  org.springframework.web.servlet.HandlerInterceptor  인터페이스를 구현하거나,  org.springframework.web.servlet.handler.HandlerInterceptorAdapter  추상 클래스를 오버라이딩 함으로써 자신만의 인터셉터를 만들 수 있다. HandlerInterceptorAdapter 추상 클래스 경우 HandlerInterceptor 인터페이스를 상속받아서 구현되었다.

 

API 공식문서

 

HandlerInterceptor (Spring Framework 6.0.8 API)

postHandle Interception point after successful execution of a handler. Called after HandlerAdapter actually invoked the handler, but before the DispatcherServlet renders the view. Can expose additional model objects to the view via the given ModelAndView.

docs.spring.io

 


 

3. 내부 메서드

 

가.  preHandle()

  •  컨트롤러가 호출되기 전에 실행된다.
  •  컨트롤러가 실행 이전에 처리해야 할 작업이 있는 경우 혹은 요청정보를 가공하거나 추가하는 경우에 사용됨.
  • 실행되어야 할 '핸들러'에 대한 정보를 인자 값으로 받기 때문에 '서블릿 필터'에 비해 보다 세밀하게 로직을 구성할 수 있다.
  • 리턴 값이 boolean입니다. ture를 리턴하게 된다면 preHandle() 실행 후 핸들러에 접근을 하고, false를 리턴하게 되면 작업을 중단하기 때문에 컨트롤러와 남은 인터셉트가 실행되지 않는다.

 

나.  postHandle()

  •  핸들러가 실행은 완료되었지만 아직 View가 생성되기 이전에 된다.
  •  ModelAndView 타입의 정보가 인자 값으로 받는다. 따라서 Controller에서 View에 정보를 전달하기 위해 작업한   Model 객체의 정보를 참조하거나 조작할 수 있다.
  •  preHandle()에서 리턴 값이 false인 경우 실행되지 않는다.
  •  적용 중인 interceptor가 여러 개인 경우 preHandle()는 역순으로 호출됨.
  •  비동기적 요청 처리 시에는 처리되지 않는다.

 

다.  afterCompletion()

  •  모든 View에서 최종 결과를 생성하는 일을 포함한 모든 작업이 완료된 후에 실행된다.
  •  요청 처리 중에 사용한 리소스를 반환해주기 적당한 메서드.
  •  preHandle()에서 리턴 값이 false인 경우 실행되지 않음.
  •  적용 중인 interceptor가 여러 개인 경우 preHandle()는 역순으로 호출된다.
  •  비동기적 요청 처리 시에는 호출되지 않음.

4. 동작 위치 및 순서

 

사용자가 url을 통해 Requset객체를 보내면, DispatcherServlet은 해당 객체를 받아 분석한 뒤 '핸들러매핑(HandlerMapping)'에게 사용자의 요청을 처리할 핸들러를 찾도록 요청한다.

 

그 결과, '핸들러 실행 체인(HandlerExecutionChain)'이 동작하게 되는데, 이 핸들러 실행 체인은 하나 이상의 핸들러 인터셉터를 거쳐 컨트롤러가 실행될 수 있도록 구성되어있다. 핸들러 인터셉터를 등록하지 않았다면 곧바로 컨트롤러가 실행된다.

 

 

참고

https://kimvampa.tistory.com/144

 

[Spring][쇼핑몰 프로젝트][12] 인터셉터 적용

프로젝트 Github : https://github.com/sjinjin7/Blog_Project 프로젝트 포스팅 색인(index) : https://kimvampa.tistory.com/188 목표 로그인, 관리자 메서드 인터셉터 적용 저번 포스팅에서 관리자 페이지를 만들었습니

kimvampa.tistory.com

 

'Java' 카테고리의 다른 글

Spring - 계층 구조  (0) 2023.04.25
Spring - Spring Interceptor 실습  (0) 2023.04.21
SQL - 쿼리 분석  (0) 2023.04.18
SQL - OUTER JOIN 외부조인  (0) 2023.04.17
Java - 제네릭 클래스  (0) 2023.04.11
Comments