관리 메뉴

HAMA 블로그

톰캣 최종분석 ex05 소스 분석 본문

WAS & 웹서버

톰캣 최종분석 ex05 소스 분석

[하마] 이승현 (wowlsh93@gmail.com) 2015. 8. 15. 19:52




1. main 으로 시작한다.  (크게 2개의 컴포넌트(?) 로 나누어진다. HTTPConnector 와 SimpleContext) 


2. main 은 각각의 클래스들의 객체를 생성하고 의존관계를 맺은 후에  HttpConnector 의 start 를 호출하여 

  솔루션이 시작된다.


3. 크게 2가지 파이프라이닝이 있다. ( 파이프라인에 대한건 chain of responsibility 패턴이나 ,  intercepting 

   filter 패턴을 알면 이해하기 쉽다) . 이걸 이해해야한다. 


4. SimplePipiline 은 intercepting filter 패턴에서 매니저 역할이다. 이것은 각각의 valve (filter 와 같다) 를 순

  회하며 각각의 선행작업을 한후에 마지막에 basic 작업을 하며 종료한다. 마치 필터들이 선행해서 어떤 액션

  을 한후에 마지막에 컨트롤러가 마무리하는것과 같다. 


5. SimpleLoader 는 서블릿 클래스를 메모리로 올리는 유틸리티성 클래스이다.


6. HTTPConnector 는 젤 앞에서 서버소켓을 운용하며, 클라이언트과 커낵션을 맺고, request/ response 객

  체를 생성하여 SimpleContext 객체에 invoke 한다. 


7. SimpelContextMapper 는 내부의 맵을 이용하여 url 에 맞는 서블릿을 리턴해준다. 


8. SimpleWrapper A 는 A 서블릿의 래퍼이다. 


9. 중요한 2가지 파이프라이닝에 대해서 알아보자.


10. 첫번째 파이프라이닝은 SimpleContext 가 가지고있는데 , 해당 파이프라이닝은  value 로써

    ClientIPLoggerValve 와 HeaderLogerValue 를 가지고있으면 마지막 basic 은 SimpleContextValve 를 호

    출하며 끝마친다. 

    예상하듯이 앞의 두 밸브는 필터역할을 하며, 마지막 SimpleContextValve  는 클라이언트가 요청하는 서

    블릿을 찾아내어 해당 서블릿의 파이프라이닝을 시작한다.


11. 두번째 파이프라이닝은 SimpelWrapper A 에 등록된 valve 를 따라가며 진행되는데, 이 예제에서는 선행 

     valve  는 없으며 마지막 basic 이  SimpleWrapperValve 이다. 

     SimpleWrapperValve  의 역할은 클라이언트가 요청한 서블릿의 service 메소드를 호출하는것이다.


     결국 우리가 어떤 서블릿(컨트롤러) 를 만들어서 톰캣이나 스프링에 설정해두면, SimpleWrapperValve 

     이 해당 컨트롤러를 호출하게되는것이다.


아래 코드는 SimpleWrapperValve  의 invoke 함수이다. 


public void invoke(Request request, Response response, ValveContext valveContext)

    throws IOException, ServletException {


    SimpleWrapper wrapper = (SimpleWrapper) getContainer();

    ServletRequest sreq = request.getRequest();

    ServletResponse sres = response.getResponse();

    Servlet servlet = null;

    HttpServletRequest hreq = null;

    if (sreq instanceof HttpServletRequest)

      hreq = (HttpServletRequest) sreq;

    HttpServletResponse hres = null;

    if (sres instanceof HttpServletResponse)

      hres = (HttpServletResponse) sres;


    // Allocate a servlet instance to process this request

    try {

      servlet = wrapper.allocate();

      if (hres!=null && hreq!=null) {

        servlet.service(hreq, hres);

      }

      else {

        servlet.service(sreq, sres);

      }

    }

    catch (ServletException e) {

    }

  }


'WAS & 웹서버' 카테고리의 다른 글

톰캣 최종분석 ex14 소스 분석  (0) 2015.08.24
톰캣 클래스패스의 이해 (번역)  (0) 2015.07.31
Comments