Servlet - Controller 처리 과정

  • [ 배경 ]
    • 자바 웹 개발을 하다 보면, 공통적으로 처리해야 할 업무가 생깁니다.
    • 예를 들어 로그인 관련 세션 처리, 사용자 권한 체크, XSS(Cross Site Script) 방어 로직, PC Mobile 플랫폼 분기 처리, 로그 처리, 페이지 인코딩 변환 등이 있습니다.
      • XSS(Cross Site Script)란 웹 어플리케이션에서 사용자 입력 값에 대한 필터링이 제대로 이루어지지 않을 경우, 공격자가 입력이 가능한 폼에 악의적인 스크립트를 삽입하여 해당 스크립트가 희생자 측에서 동작하도록 하여 악의적인 행위를 수행하는 취약점이다. 공격자는 취약점을 이용하여 사용자의 개인정보 및 쿠키정보 탈취, 악성코드 감염, 웹 페이지 변조 등의 공격을 수행한다.

  • 공통업무에 관련된 코드를 모든 페이지마다 작성한다면 중복코드가 많아지게 되고 프로젝트 단위가 커질수록 서버에 부하를 줄 수 있으며, 소스 관리도 되지 않아 레거시한 코드가 될 확률이 높아집니다.

  • 즉, 공통 부분은 따로 빼서 관리하는 게 좋습니다.

  • 이러한 공통업무를 Spring에선 프로그램 흐름의 앞, 중간, 뒤에 추가하여 자동으로 처리할 수 있는 방법이 있습니다.
    • Filter
    • Interceptor
    • AOP

  • 각각의 특징과 차이점에 대해 알아보겠습니다.

  • [ 과정 ]
    • Interceptor와 Filter는 Servlet 단위에서 실행된다. 반면 AOP는 메서드 앞에 Proxy 패턴의 형태로 실행됩니다.

    • 요청 패킷의 실행 순서를 보면 Filter -> Interceptor -> AOP ->Interceptor -> Filter 순입니다.
      1. 서버를 실행시켜 서블릿이 올라오는 동안 init이 실행 되고, 그 후 doFilter 가 실행됩니다.
      2. 컨트롤러에 들어가기 전 preHandler 가 실행된다.
      3. 컨트롤러에서 나와 AOP, postHandler, doFilter 순으로 진행된다.
      4. 서블릿 종료 시 destroy가 실행된다.

    • Filter(필터)
      • 말 그대로 요청과 응답을 필터 하는 역할을 한다.

      • 서블릿 필터는 DispatcherServlet 이전에 실행되는데 필터가 동작하도록 지정된 자원의 앞단에서 요청 내용을 변경하거나, 자원의 정보를 체크합니다.

      • 또한, 자원의 처리가 끝난 후 응답 내용에 대해서도 변경처리를 할 수 있다. 보통 인코딩 변환처리, XSS방어 등에 대한 요청 처리로 사용한다고 한다.

      • 필터의 실행 메서드 순서는
        • init() - doFilter() - destroy() 순서다.

    • Intercepter(인터셉터)
      • 요청에 대한 작업 전/후로 가로챈다.

      • 필터는 스프링 콘테스트 외부에 존재하여 스프링과 무관하게 동작한다.

      • 하지만, 인터셉터는 스프링의 DispatcherServlet이 컨트롤러를 호출하기 전, 후로 끼어들기 때문에 스프링 콘텍스트 영역 내부에서 Controller(Handler)에 관한 요청과 응답에 처리한다.

      • 스프링의 모든 빈 객체에 접근할 수 있다. 

      • 인터셉터는 여러 개를 사용할 수 있고, 로그인 체크, 권한 체크, 프로그램 실행시간 계산 작업, 로그 확인 등의 업무를 처리할 때 주로 사용한다.

      • 인터셉터의 실행 메서드 순서는
        • preHandler() - postHandler() - afterCompletion() 순서다.

    • AOP( OOP를 보완하는 개념)
      • 객체지향 프로그래밍을 했을 때 중복을 줄일 수 없는 부분을 줄이기 위해 종단(관점)에서 보고 처리하는 개념입니다.

      • 주로 '로깅', '트랜잭션', '에러 처리' 등 비즈니스 단의 메서드에서 조금 더 세밀하게 조정하고 싶을 때 사용합니다.

      • Interceptor나 Filter와는 달리 메서드 전후의 지점에 자유롭게 설정이 가능하다.

      • Interceptor나 Filter는 주소로 대상을 구분해서 걸러내야 하는 반면, AOP는 주소, 파라미터, 애노테이션 등 다양한 방법으로 대상을 지정할 수 있다.

      • AOP의 Advice와 HadnlerInterceptor의 가장 큰 차이점은 호출 방식인 파라미터의 차이다.

      • Advice의 경우 JointPoint나 ProceedingJointPoint 등을 활용해서 호출한다.
        반면, HandlerInterceptor는 Filter는 HttpServletRequest, HttpServeltResponse를 파라미터로 사용한다.

      • AOP의 포인트 컷을 정하는 각종 어노테이션이 궁금하면 제 블로그 글인 AOP란? 을 참조 부탁드립니다.

  • [ 결과 ]
    • java에서 공통부분을 처리하는 방법인 Filter, Interceptor, AOP의 각각 특징에 대해 이하였습니다.

  • [ 성과 ]
    • Servlet - Controller 처리 순서에 대해 이해하였고 상황에 맞게 공통부분을 따로 처리하는 Filter, Interceptor, AOP를 적용하는 이유를 알았습니다.

'spring' 카테고리의 다른 글

MyBatis란?  (0) 2020.08.08
OCP 계방폐쇠 원칙 이해하기  (0) 2020.07.08
AOP란?  (0) 2020.06.19

+ Recent posts