Back-End/Spring

[Spring MVC2][로그인 처리] - 스프링 인터셉터(공통의 관심사 해결 방안)

얄루몬 2022. 5. 20. 17:27

 

💻본 포스팅은 '스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 김영한'님의 강의를 듣고 작성되었습니다.

https://inf.run/vQHp

 

스프링 MVC 2편 - 백엔드 웹 개발 활용 기술 - 인프런 | 강의

웹 애플리케이션 개발에 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. MVC 2편에서는 MVC 1편의 핵심 원리와 구조 위에 실무 웹 개발에 필요한 모든 활용 기술들을 학습할 수 있

www.inflearn.com


목차
1. 공통의 관심 사항
    - 서블릿 필터
    - 스프링 인터셉터
2. 스프링 인터셉터
3. 스프링 인터셉터 정리
4. ArgumentResolver

공통의 관심 사항

    • 로그인 한 사용자만 상품 관리 페이지에 들어갈 수 있어야 한다는 요구사항이 있을 경우 개발자는 로그인 하지 않은 권한 없는 사람이 접근 제한한 부분을 들어가는 것을 기술적으로 막아두어야 한다.
    • 이때 로그인 하지 않을 때 꽤나 많은 접근의 제한이 있어야 하고 우리는 이를 위해 로그인 여부 체크하는 로직을 하나 넣어주면 되지만 매우 많은 컨트롤러에 공통으로 로그인 여부를 체크해주어야 하기에 상황이 복잡해진다.
    • 이처럼 공통으로 인증(로그인 했는지 안 했는지)에 관심을 가지고 있는 경우를 공통 관심사라고 한다.
    • 스프링의 AOP로 공통 관심사 문제를 해결할 수 있지만 웹과 관련된 공통 관심사의 경우엔 서블릿 필터, 혹은 스프링이 제공하는 인터셉터를 사용하는 것이 바람직하다.
    • 웹과 관련된 공통 관심사 처리는 HTTP 헤더나 URL 정보들이 필요하고 서블릿 필터와 스프링의 인터셉터는 HttpServletRequest를 제공해 이 문제를 처리할 수 있게 한다.

스프링 인터셉터

스프링이 제공하는 인터셉터는 서블릿 필터보다 훨씬 강력하다.

서블릿 필터 인터셉터(스프링이 제공)
doFilter( ) 하나만 제공 컨트롤러 호출 전 제공(preHandle)
컨트롤러 호출 후(PostHandle)
요청 완료 이후(afterCompletion)
request, response만 제공 request, response 제공
handler(어떤 핸들러 호출 됐는지 호출 정보)
modelAndView(어떤 모델과 뷰가 반환되는지에 관한 응답 정보)

스프링 인터셉터의 흐름(정상 흐름의 경우)

  • preHandle
    • 컨트롤러 호출 전에 호출된다. (더 정확하게는 핸들러 어댑터 호출 전에 호출된다.)
    • preHandle의 응답값이 true라면 다음으로 진행
    • preHandle의 응답값이 false라면 더는 진행하지 않는다.
      • 이 경우라면 나머지 인터셉터는 물론, 핸들러 어댑터도 호출되지 않는다.
  • postHandle
    • 컨트롤러 호출 후에 호출된다.(더 정확하게는 핸들러 어댑터 호출 후에 호출된다.)
    • 예외 발생 경우라면?
      • 컨트롤러에서 예외가 발생하면 postHandle( ) 호출되지 않는다.
  • afterCompletion
    • 뷰가 렌더링 된 이후에 호출된다.
    • 예외 발생 경우라면?
      • 예외가 발생하면 postHandle( )이 호출되지 않기 때문에 이와 무관하게 공통 처리를 하기 위해서 afterCompletion( )을 사용해야 한다.
      • 예외 발생 시 afterCompletion( )에 예외 정보를 포함해서 호출한다.
        • 예외 발생에도 호출된다.

인터셉터 흐름(예외 발생)

  • preHandle
    • 컨트롤러 호출 전에 호출 된다.
  • postHandle
    • 컨트롤러에서 예외가 발생하면 postHandle은 호출되지 않는다.
  • afterCompletion
    • afterCompletion( )은 예외가 발생해도 늘 호출된다.

인증

인증은 컨트롤러 호출 전에만 호출되면 되는 개념으로 preHandle만 구현하면 된다. (이때 인터셉터 메서드를 모두 구현하지 않아도 되는 이유는 default 메서드로 구현되어 있어 기본구현이 되어 있기 때문에 인터페이스의 메서드를 모두 구현하지 않아도 되기 때문이다.)

 

인터셉터 정리

  • 공통의 관심사를 해결하기 위해서 필터와 인터셉터 기능을 사용하게 되는데 스프링을 사용하고 필터를 사용해야 하는 특별한 경우가 아니라면 인터셉터를 사용할 것을 권장한다.
  • 스프링 MVC 구조에 특화된 필터 기능을 제공하고 있기 때문에 스프링 MVC를 사용하고 특별히 필터를 사용해야 하는 상황이 아니라면 인터셉터를 사용하는 것이 훨씬 편리하다.

ArgumentResolver 활용

  • ArgumentResolver
    • 컨트롤러로 들어온 파라미터를 가공하거나 수정하는 기능이다.