일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |
- forwardref type
- npm에러
- react
- 리액트네이티브아이콘
- materialicons
- Filter
- 타입스크립트
- map
- Next.js
- array
- reactnative error
- app:compiledebugkotlin
- app.post
- mainapplication.kt
- extends
- 배열중복요소제거
- 이진탐색
- Spring
- async
- err_connection_refused
- interface
- 안드로이드빌드에러
- 상속
- javascript
- 스크롤이벤트
- reactnative
- TS
- 슬라이딩윈도우
- generic
- set
- Today
- Total
rhanziy
Spring - Spring Interceptor 스프링 인터셉터 본문
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 공식문서
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
'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 |