티스토리 뷰

donaricano-btn
반응형

웹 애플리케이션이 동작하는 방식을 단순하게 표현하면 위의 그림과 같을 것입니다. 클라이언트가 웹 브라우저를 통해 웹 서버에 필요한 자원을 요청하면 서버가 사용자가 요청한 것을 넘겨 주게 되겠죠. 자원(resource)이라고 하는 것은 HTML 페이지나 그림파일 혹은 PDF 파일이 될 수도 있습니다. 중요한 것은 클라이언트가 요청하면 서버는 그 요청에 응답한다는 것입니다.

 

클라이언트와 서버가 요청과 응답을 주고 받기 위해서는 서로 같은 규칙을 가지고 대화해야 합니다. 웹 애플리케이션에서 주로 사용하는 대화의 규칙은 HTTP(Hyper Text Transfer Protocol) 입니다. 클라이언트가 HTTP 요청을 보내면 서버는 HTTP 응답으로 대답합니다. HTTP는 이렇게 요청(Request)과 응답(Response)이라는 단순한 구조로 이루어져 있습니다.

 

웹 서버의 주된 기능은 웹 페이지를 클라이언트로 전달하는 것입니다. 주로 그림, CSS, 자바스크립트를 포함한 HTML 문서가 클라이언트로 전달됩니다. 하지만 이런 웹 서버의 경우 이미 존재하는 즉, 정적인 페이지를 제공하는 역할만 할 수 있습니다. 실시간으로 작성된 페이지를 제공하거나 서버 상에 데이터를 저장하는 것은 웹 서버가 할 수 없는 일입니다. 때문에 이런 역할을 해 주는 다른 도우미 애플리케이션이 필요합니다.

 

이런 도우미 애플리케이션을 사용하면 웹 서버는 도우미 애플리케이션에 요청을 전달하기만 합니다. 그러면 도우미 애플리케이션은 요청받은 작업을 수행하거나 동적인 페이지를 만들어서 웹서버로 전달합니다. 웹서버는 이를 다시 클라이언트로 전해줍니다. 이렇게 웹서버와 도우미 애플리케이션을 합쳐서 Web Application Server, WAS 라는 이름으로 부릅니다.

 

자바에서는 이 역할을 해 주는 것이 바로 서블릿입니다.

 

그러나 서블릿은 도움이 필요합니다. 요청이 들어오면 누군가 요청을 처리할 새로운 스레드를 만들어야 하고 서블릿에서 필요한 메서드를 호출해야 합니다. 또 파라미터로 받은 값을 넘겨주기도 해야 합니다. 이 역할을 하는 것이 바로 컨테이너 입니다.

 

웹서버가 사용자로부터 서블릿에 대한 요청을 받으면 컨테이너에게 이 요청을 넘깁니다. 요청을 넘겨받은 컨테이너는 서블릿을 찾아 필요한 메소드를 호출하게 됩니다.

 

자바 개발자인 제가 만드는 WAS 역시 서블릿 컨테이너가 될 것입니다. 

 

이왕에 컨테이너에 대한 이야기를 시작했으니 실제 서블릿 컨테이너가 하는 일에 대해 조금 더 자세히 알아보도록 하겠습니다. 

 

1. 먼저 사용자(클라이언트)가 브라우저(꼭 브라우저를 통하지 않을 수도 있지만 이 프로젝트에서는 브라우저를 통한 요청에 대해서만 다루겠습니다)를 통해 HTTP Request를 보냅니다. 이 때 요청을 보내는 서버와 필요한 자원의 위치는 URL을 통해서 전달됩니다.

 

2. HTTP Request를 받은 컨테이너는 HttpServletRequest와 HttpServletResponse 객체를 생성합니다. 이 객체들은 각각 들어온 요청과 응답을 담을 객체입니다. 그리고 해당하는 요청을 처리할 스레드를 생성합니다. 보통은 스레드 풀을 사용하겠죠?

 

3. 그런데 만약 클라이언트의 요청이 정적자원에 대한 요청이라면 정적자원을 HTTP Response에 담아 클라이언트로 전송합니다. 그러면 클라이언트의 브라우저를 통해 해당하는 정적 자원을 받을 수 있게 됩니다.

 

4. 만약 정적자원에 대한 요청이 아니라면 서블릿에 대한 요청인지를 판단합니다. 이를 판단하기 위해 서버에 배포되어 있는  웹 애플리케이션은 WEB-INF 디렉토리 아래에 web.xml 이라는 배포서술자를 제공합니다. 이 배포 서술자 안에는 서블릿 요청을 받는 URL과 해당하는 서블릿의 클래스 위치가 매핑(mapping)되어 있습니다. 서블릿 컨테이너는 이 배포서술자를 읽어 서블릿에 대한 요청인지를 판단하게 도비니다.

 

5. 만약 매핑된 서블릿이 있다면 컨테이너는 해당하는 서블릿 클래스를 로드(load)하게 됩니다. 그리고 그 클래스의 인스턴스를 생성합니다. 만약 이미 클래스가 로드되어 인스턴스가 존재하는 상태라면 컨테이너는 이미 존재하는 인스턴스를 사용합니다. 

 

6. 서블릿 인스턴스는 init, service, doGet, doPost, 등의 메소드가 있습니다. 이 메소드의 종류는 실제로 서블릿 클래스를 만들 때 다시 알아보기로 하고 일단은 서블릿의 인스턴스를 생성한 컨테이너가 서블릿의 service메소드를 호출하여 요청된 작업을 처리한다는 것만 알고 넘어가도록 하겠습니다.

 

7. 서블릿 인스턴스에서 동적으로 생성된 페이지를 HttpServletResponse 객체에 담아 클라이언트로 응답하고 나면 서블릿 컨테이너의 역할은 끝이 납니다. 그러면 컨테이너는 HttpServletRequest, HttpServletResponse 두 객체를 소멸시키고 사용한 스레드를 반납하게 됩니다.

 

이 과정을 통해 알 수 있는 명확한 서블릿 컨테이너의 역할(기능)은 다음과 같습니다.

 

1. 클라이언트로부터 요청받은 정적 파일 전송

 

2. 클라이언트로부터 요청받은 서블릿 클래스 로드

 

3. 로드된 서블릿 클래스의 인스턴스 생성

 

4. 서블릿에 의해 동적으로 만들어진 페이지 전송

 

앞으로 제가 만들 WAS 역시 이 기능들이 구현되게 될 것입니다.

반응형
donaricano-btn
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함