인터셉터 위치 및 순서
1) 사용자는 서버에 자신이 원하는 작업을 요청하기 위해 url을 통해 Request 객체를 보냄
2) DispatcherServlet은 해당 Request 객체를 받아서 분석한뒤 '핸들러 매핑(HandlerMapping)' 에게
사용자의 요청을 처리할 핸들러를 찾도록 요청
3) 그 결과로 핸들러 실행체인(HandlerExectuonChanin)이 동작하게 되는데, 이 핸들러 실행체인은 하나이상의 핸들러 인터셉터를 거쳐서 컨트롤러가 실행될수 있도록 구성
(핸들러 인터셉터를 등록하지 않았다면, 곧바로 컨트롤러가 실행. 반대로 하나 이상의 인터셉터가 지정되어 있다면 지정된 순서에 따라서 인터셉터를 거쳐서 컨트롤러를 실행)
왜 사용하는건지?
특정 Controller의 핸들러가 실행되기 전이나 후에 추가적인 작업을 원할 시 Interceptor 사용 (로그인체크, 권한체크 등)
로그인체크를 예로 들면!
로그인을 해야만 실행할 수 있는 Controller 핸들러를 작성한다고 가정해보자
로그인체크를 핸들러마다 작성해주어야 하는데 적용해야할 핸들러수가 수천개가 된다면 어떻게 해야할까?
이 때 두가지의 큰 문제가 발생한다.
첫번째, 메모리 낭비, 서버의 부하가 늘어남
두번째, 코드의 누락에 대한 걱정
이러한 문제점을 보완하기 위한 수단으로 개발자는 Interceptor 를 사용!!
Interceptor를 사용하게 되면 개발자는 핸들러 수 만큼 작성했던 체크코드를 Interceptor클래스에 한번만
작성하면 된다! 자연스레 메모리 낭비도 줄일 수 있다 :)
구현방법
1. 자신이 원하는 이름의 클래스(class)를 생성한 후 해당 클래스에
HandlerInterceptor, HandlerIntreceptorAdapter 둘 중 하나를 선택하여 상속을 해주시면 됩니다.
상속 시에 차이점은 HandlerInterceptor 경우 인터페이스이기 때문에 implements 키워드를,
HandlerInterceptorAdapter는 추상 클래스이기 때문에 extends를 키워드를 사용
2. 작성한 Interceptor 클래스를 스프링에서 인식할 수 있도록 빈으로 등록해주어야 합니다.(mvc-config.xml)
우리가 만든 Interceptor 클래스를 빈으로 등록해주는 코드와 Interceptor를 어떠한 url에 적용시킬지를 설정하는
코드를 추가합니다. 전체 url에 적용되도록'/**'를 입력해주시면 됩니다.
만약 인터셉터를 적용하고 싶지 않다면 위처럼 <exclude-mapping path="예외 uri"/> 를 지정해서 예외시킬 수 있음!
로그인체크가 되지 않은 상태에서
URL창에 user_view 주소 입력 시 이것을 interceptor가 쳐내고 user_main을 보여줌
'JAVA' 카테고리의 다른 글
[Spring] 트랜잭션 전파 속성 (Transaction Propagation) (0) | 2022.09.23 |
---|---|
[Spring] @requestBody 와 @responseBody 차이점 (0) | 2022.09.19 |
[Spring] AOP (Spring AOP)란? (0) | 2022.09.02 |
[Spring] Spring MVC 란? (2) | 2022.09.01 |
[Spring] DispatcherServlet 개념 (0) | 2022.08.29 |
댓글