스프링 인터셉터(interceptor)

2023. 8. 3. 10:33·Spring
728x90

스프링 인터셉터는 서블릿 필터와 마찬가지로 웹과 관련된 공통 관심 사항을 효과적으로 해결할 수 있는 기술이다.

공통 관심 사항이란 로그인을 해야 서비스를 이용할 수 있는 대부분의 웹 서비스에서 로그인을 하지 않은 사용자의 접근을 제한하기위해 모든 컨트롤러 로직에 로그인 여부를 확인하는 코드를 작성하는 비효율적 행위를 막아햐한다.

이렇게 많은 로직에서 공통으로 관심이 있는 부분을 공통 관심사라 한다.

 

스프링 인터셉터의 흐름

HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러

 

스프링 인터셉터는 스프링 MVC가 제공하는 기능이다. 때문에 디스패처 서블릿 이후에 등장하게 된다.

스프링 인터셉터에 URL 패턴을 매우 정밀하게 적용할 수 있다.

 

스프링 인터셉터 제한

HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 -> 컨트롤러 (로그인 사용자)

HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 스프링 인터셉터 (비 로그인 사용자)

 

인터셉터에서 적절하지 않은 요청이라고 판단하면 거기서 끝을 낼 수 있다.

 

스프링 인터셉터 체인

HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 인터셉터1 -> 인터셉터2 -> 컨트롤러

스프링 필터와 마찬가지로 스프링 인터셉터도 체인으로 구성된다. 그래서 중간에 인터셉터를 자유롭게 추가할 수 있다.

예를 들어서 로그를 남기는 인터셉터를 먼저 적용하고, 그 다음에 로그인 여부를 체크하는 인터셉터를 만들 수 있다.

 

스프링 인터셉터 인터페이스

스프링의 인터셉터를 사용하려면 HandlerInterceptor인터페이스를 구현하면 된다.

public interface HandelrInterceptor{

	default boolean preHandle(HttpServletRequest request, HttpServletResponse response,
    				Object handler) throws Exception{}

	default boolean postHandle(HttpServletRequest request, HttpServletResponse response,
    				Object handler, @Nullable ModelAndView modelAndView) throws Exception{}
	
    default boolean afterCompletion(HttpServletRequest request, HttpServletResponse response,
    				Object handler, @Nullable Exception ex) throws Exception{}

}

 

서블릿 필터의 경우 단순하게 doFilter()하나만 제공된다. 인터셉터는 컨트롤러 호출 전(preHandle), 호출 후(postHandle), 요청 완료 이후(afterCompletion)와 같이 단계적으로 잘 세분화 되어 있다.

서블릿 필터의 경우 단순히 request, response만 제공했지만, 인터셉터는 어떤 컨트롤러(handler)가 호출되는지 호출 정보도 받을 수 있다. 그리고 어떤 modelAndView가 반환되는지 응답 정보도 받을 수 있다.

 

인터셉터의 흐름에서 봤듯이 디스패처 서블릿에서 preHandle를 컨트롤러 호출 전에 호출한다.

preHandle의 응답값이 true이면 다음으로 진행하고, false이면 더는 진행하지 않는다. false인 경우 나머지 인터셉터는 물론이고, 핸들러 어댑터도 호출되지 않는다. 그림에서 보면 1번에서 끝이 나는 것이다.

그 다음은 서블릿이 컨트롤러에 접근하고 난 다음 postHandle을 호출한다.

그리고 view를 내보낸 후 afterCompletion을 호출한다.

 

예외가 발생하면 postHandle은 호출되지 않는다.

반면에 afterCompletion은 항상 호출된다. 이 경우 예외(ex)를 파라미터로 받아서 어떤 예외인지 로그로 출력할 수 있다.

 

인터셉터는 스프링 MVC 구조에 특화된 필터 기능을 제공한다고 이해하면 된다. 스프링 MVC를 사용하고, 특별히 필터를 꼭 사용해야 하는 상황이 아니면 인터셉터를 이용하는 것이 편리하다.

728x90

'Spring' 카테고리의 다른 글

오류화면 보여주기  (0) 2023.08.03
스프링 인터셉터 - 요청 로그  (0) 2023.08.03
오류 메시지 처리(2)  (0) 2023.07.14
오류 메시지 처리  (0) 2023.07.14
검증 - Validation  (0) 2023.07.04
'Spring' 카테고리의 다른 글
  • 오류화면 보여주기
  • 스프링 인터셉터 - 요청 로그
  • 오류 메시지 처리(2)
  • 오류 메시지 처리
Bello's
Bello's
개발하는 벨로
  • Bello's
    벨로의 개발일지
    Bello's
  • 전체
    오늘
    어제
    • 분류 전체보기 (199) N
      • 노예 일지 (7)
        • 스타트업 노예일지 (3)
      • CS 이론 (81)
        • 학과 수업 (4)
        • 알고리즘 (64)
        • 시스템 프로그래밍 (3)
        • 데이터 통신 (1)
        • 운영체제 (2)
        • 데이터베이스 (1)
      • project (3)
      • 나는 감자다. (4)
      • Spring (27)
      • 모각코 (45)
        • 절개와지조(모각코) (7)
        • 어쩌다보니 박준태가 조장이조 (11)
        • 어쩌다보니 박준태가 또 조장이조 (12)
      • LikeLion🦁 (20)
      • 캘리포니아 감자 (4)
      • OpenSource Contribute (1)
      • 우아한테크벨로 (1) N
        • 프리코스 회고록 (6) N
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    나는 감자
    JPA
    뛰슈
    Spring
    모각코
    어렵다
    백준
    8기
    회고록
    누적합
    그래프 순회
    타임리프
    오블완
    감자
    절개와지조
    DFS
    티스토리챌린지
    자바
    BFS
    프리코스
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.5
Bello's
스프링 인터셉터(interceptor)
상단으로

티스토리툴바