Spring Interceptor / 스프링 인터셉터 개념

강은혜·2022년 10월 17일

스프링

목록 보기
1/1
post-thumbnail

Spring Interceptor란?

Interceptor의 사전적 의미는 '가로채다, 가로막다' 인데,

스프링의 인터셉터 역시 같은 역할을 하는 것으로 생각하면 된다.

어떤 웹 프로젝트를 진행할 때에 로그인 기능은 거의 필수로 적용된다.

개발을 시작했을 때, 세션 체크를 위해 모든 서버 로직에 같은 코드를 복사했던 기억이 있다. 세션을 설정하고, 세션에 유효시간을 설정해서 만료된 세션이 되도록 같은 코드를 여기저기에 써 넣어줬었는데, 그 때만 해도 인터셉터에 대한 개념이 무지한 상태였다.

앞으로는 Spring framework 기반으로 웹 프로젝트를 진행할 때, Spring Interceptor를 이용하여 세션/로그인 관리를 하도록 하자.



Interceptor

인터셉터는 Dispatcher Servlet과 Controller 사이에서 HttpRequest, HttpResponse를 가로채는 역할을 한다.

정식 명칭은 핸들러 인터셉터 이고, DispatcherServlet이 컨트롤러를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 일종의 필터 역할을 한다.

흐름을 간략하게 보자면

Request가 오자마자 제일 처음 받는 친구는 ? Tomcat 이 받고 Filter처리를 한다.

필터 인코딩 처리한 Request를 Dispatcher Servlet한테 주고

Dispatcher Servlet은 Request를 Interceptor한테 준다.

Controller앞이다. Controller한테 아직 가지 않았다!


서비스타고 DAO타고 나갔다 올 때 Reponse 객체를 들고 돌아오는데 이 때 Interceptors에서 Post를 수행한다.

그리고 핸들러매핑하고 selector하고 뷰 처리하고 응답을 보내게 된다.

preHandle은 컨트롤러에 요청이 넘겨지기 이전에 호출, postHandle은 컨트롤러가 처리를 마친 후, afterCompletion은 view까지의 모든 요청처리가 완료되었을 때 호출된다.

preHandle에서 return true 면 controller에 요청을 넘기고, return false 면 controller
을 호출하지 않는다.

그래도 인터셉터가 어디서 동작하는지 확실하지 않다는 느낌이 들텐데, 아래 그림을 보면 보다 명확해진다.


업로드중..

Request가오면 DispatcherServlet이 받고 Handler Mapping 후 Handler Adapter 에서 우리가 인터셉터를 구현하는 부분이다.

preHandler ? 뭐가 처리되기 전에 ? -> Controller가 처리되기 전에 수행되며, Controller가 처리되고 난 후에는 postHandler이다.

모델,뷰까지 다 처리하고 난 후 Interceptor한번 더 실행된다(afterCompletion).

그러므로 Servlet단에 있다 라고 알 수 있다. 완전 Controller밖에 있으며 제어할 수 있다는 것.

자 이쯤 되면, Interceptor와 AOP의 차이점이 무엇인지 궁금해진다.

나 역시 '반복되는 일을 중복으로 처리하지 않기 위해 스프링의 AOP 방식을 이용해보자' 라는 생각에서 AOP에 대해 알아보다가 Interceptor가 더 적합하다는 것을 알게 된 케이스이다.

AOP 와 Interceptor의 차이 ?

AOP Interceptor

Target Method & Parameter Request & Response (Controller)

@Before preHandle()

@After postHandle()

After Returning afterConmpletion()

Controller 실행 전 후를 처리할 때에는 Interceptor

어떤 method 에 대한 전후 처리를 할 때에는 AOP

인터셉터를 만들기 위해서는

1) HandlerInterceptor 인터페이스를 구현하는 방법과

2) HandlerInterceptorAdapter를 상속하는 방법이 있다.

먼저 interceptor패키지 생성

TestInterceptor extends HandlerInterceptorAdapter 생성

인터셉터의 정확한 명칭은 핸들러인터셉터아답터

아답터패턴이란? 앞단에 붙어서 연결시켜주는 역할! 인터셉터는 컨트롤러의 아답터 역할!

servlet-context.xml에 인터셉터랑 빈 등록

root-context.xml아님! 컨트롤러 바깥쪽임

인터셉터를 빈으로 등록해놓으면 스프링이 사용할 수 있다.

인터셉터 여러개 등록 가능 url매핑

체크 포인트

일반적인 웹 프로젝트에서 세션 체크를 해야하는 곳은 크게 3군데 이다.

로그인, 로그아웃 관련

모든 ajax를 이용한 request

페이지 이동시

VO 데이터를 담는 개념

DTO (Data Transfer Object) 데이터를 전달하는 개념 - 로그인의 경우 id, pwd 전달. DTO개념이 조금 더 적합함.

0개의 댓글