독도갈매기의 개발 블로그

[Spring] 인터셉터 ( Interceptor ) 본문

Java

[Spring] 인터셉터 ( Interceptor )

독도갈매기 2021. 10. 1. 18:00

Interceptor

인터셉터( Interceptor )란?

  • 컨트롤러( Controller )의 핸들러( Handler )를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할 수 있는 일종의 필터
// Node.js

app.get('/', (req, res) => {
    res.send('Hello World!'); // Controller Handler
    console.log('me too!'); // Controller Hanlder
});

핸들러( Handler )란?

  • 사용자가 요청한 url에 따라 실행되어야 할 메서드( Method ), 함수( Function )
    Ex) res.send(), console.log(), etc...

왜 사용 해야 하는가?

  • 특정 Controller의 Handler가 실행 되기 전이나 후에 추가적인 작업을 원할 때 사용하게 된다.
    Ex) 로그인 확인, 권한 확인, etc...

권한 확인 시에는 왜 필요할까? 그냥 Handler를 작성하면 하면 안되는건가?

  • 관리자 권한 확인 Controller Handler 수가 적다면 문제가 없겠지만, 적용해야 할 핸들러가 수십, 수백, 수천 개가 된다면 메모리 낭비, 서버 부하 증가, 코드 누락과 같은 문제들이 발생하게 됩니다.
  • 메모리 낭비, 서버 부하 증가 : 적용되는 Handler 수만큼 증가하는 세션 체크 코드 수
  • 코드 누락에 대한 걱정 : 적용되어야 할 Handler에 적용이 누락되었을 때 보안 문제

위와 같은 문제점을 해결할 수 있는 방법은?

  • 이러한 문제점들을 줄이기 위한 수단으로 Interceptor를 사용하게 됩니다.
  • Interceptor를 사용하게 되면 개발자는 Handler 수만큼 작성했던 세션 체크 코드를 Interceptor Class에 한번만 작성하게 되면 코드가 그만큼 줄어들어 메모리 낭비로 인한 서버 부하 문제점을 해결할 수 있는 방안이 됩니다.

세션 체크가 필요 없는 코드는?

  • 물론 Interceptor 적용 유무의 기준이 되는 URL을 설정할 수 있는 XML파일이 존재합니다.
    → 이로 인해 코드 누락에 대한 위험이 상당히 줄어들게 됩니다.

어떤 메서드들이 있는가?

스프링 제공 HandlerInterceptor 인터페이스와 HandlerInterceptorAdapter 추상 클래스에 정의되어 있는 메서드는 preHandle(), postHandle(), afterCompletion() 3가지가 있음.

preHandle()

  • Controller가 호출되기 전에 실행됨.
    → 유저 권한 확인, 로그인 여부 확인 시 용이해 보임.
  • Controller가 실행 이전에 처리해야 할 작업이 있는 경우 혹은 요청정보를 가공하거나 추가하는 경우 사용.
  • 실행되어야 할 'Handler'에 대한 정보를 인자 값으로 받기 때문에 'Servlet Filter'에 비해 보다 세밀하게 로직 구성 가능.
  • 리턴 값이 boolean, ture를 리턴하게 된다면 preHandle() 실행 후 Handler에 접근함, false를 리턴하게 되면 작업을 중단하기 때문에 Controller와 남은 Interceptor가 실행되지 않음.

postHandle() - Builder에서 사용된 Interceptor

  • Handler가 실행은 완료되었지만 아직 View가 생성되기 이전에 호출됨.
    → ftl에서 사용할 데이터를 담고 View에 보내 줄 때 사용할 것 같음.
  • ModelAndView 타입의 정보가 인자 값으로 받는다, 따라서 Controller에서 View에 정보를 전달하기 위해 작업한 Model 객체의 정보를 참조하거나 조작할 수 있음.
  • preHandle()에서 리턴 값이 false인 경우 실행 X
  • 적용 중인 Interceptor가 여러 개인 경우 preHandle()는 역순으로 호출.
  • 비동기적 요청 처리 시에는 처리 X

afterCompletion()

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