본문 바로가기

개발

Container(컨테이너)

Container

 

  • Servlet을 실행하고 관리하는 역할을 한다.
  • Web Server는 사용자로부터 Servlet을 요청 받으면 바로 호출 되는 것이 아니라, Container에게 요청이 넘어간다.
  • Container는 요청을 넘겨 받아 HTTP Request와 HTTP Response 객체를 만들어, 이를 인자로 Servlet doPost()나 doGet() method 중 하나를 호출한다

C2-73

 

Container가 주는 혜택

 

  • 통신(Communication) 지원
    • Container는 Servlet과 Web Server가 서로 통신할 수 있는 손쉬운 방법을 제공한다.
    • Server와 대화하기 위하여 개발자가 직접 해야 하는 복잡한 일련의 일을 할 필요가 없다.
    • Container는 어떻게 Web Server와 통신해야 하는지 알 알고 있으며, 이런 통신 기능을 API로 제공하여 개발자가 통신 API에 대해 고민할 필요 없다.
    • 개발자가 신경 쓸 부분은 Servlet에 구현해야 할 Business Logic이다.

     

  • 생명주기(Lifecycle) 관리
    • Container는 Servlet의 탄생과 죽음을 관리한다.
    • 개발자 관점에서 보자면, Servlet Class를 Loading하여 instence화 하고, 초기화 method를 호출하고, 요청이 들어오면 적적할 method를 호출하는 작업을 Container가 한다.
    • Servlet이 생명을 다하는 순간에는 적절하게 garbage collection을 진행한다.

     

  • Multi Threading 지원
    • Container는 요청이 들어올 때마다 새로운 Java thread를 하나 만든다.
    • Client 요청에 따라 적절한 HTTP method를 실행하면 Threading 작업이 끝난다.
    • thread 안전성에 대하여 개발자가 뭔가 하지 않아도 된다.

     

  • 선언적인 보안 관리
    • Container를 사용하면, 보안에 관련된 내용을 Servlet 또는 Java Class Code 안에 Hardcoding할 필요가 없다.
    • Container가 있는 환경이라면 보안관리는 XML 배포 서술자에다가 기록하면 된다.
    • 보안에 대해 뭔가 수정할 일이 생기더라도, Java Source Code를 수정하여 다시 Compile하지 않아도 보안관리가 가능하다.

     

  • JSP 지원

    C2-75


    Container가 요청을 다루는 법

     

    1. 사용자가 Servlet에 대한 Link를 선택한다.
    2. Container는 들어온 요청이 Servlet이라는 것을 간파하고 HttpServletResponse, HttpServletrequest 객체를 생성한다.
    3. 사용자가 날린 URL을 분석하여 어떤 Servlet에 대한 요청인지 알아내고 해당 Servlet thread를 생성하여 Request/Response 객체를 인자로 넘긴다.
    4. Container는 Servlet Service() method를 호출하고 요청에 지정한 방식(Method)에 따라 doGet()을 호출할지, doPost()를 호출할지 결정한다.(여기서는 일단 HTTP GET 방식이라 가정한다.)
    5. doGet() method는 동적인 Page를 생성한 다음, 이를 Response 객체에 실어 보내며 보내고 난 후에도 Container는 Response 객체에 대한 참조(Reference)를 가지고 있는다.
    6. thread 작업이 끝나면, Container는 Response 객체를 HTTP Response로 전환하여 Client로 내려 보내고 마지막으로 Request와 Response 객체를 소멸 시킨다.

    C2-76