Servlet의 동작 과정 및 생명주기
Servlet
서버에서 수행되는 소형 프로그램. 일반적으로 서버에 존재하며 사용자 입력에 의해 데이터베이스에 접근하는 프로그램은 공통 게이트웨이 인터페이스(CGI) 프로그램을 사용해 수행되는데, 자바 서버 프로그램은 자바 프로그래밍 언어로 수행된다. CGI 프로그램보다 수행 속도가 빠르고, 프로그램 프로세스가 생성되는 것이 아니라 각 사용자 요청이 상주 프로그램(daemon)의 하나의 스레드(thread)로 수행된다. 추가(add-on) 모듈로 된 자바 서블릿은 넷스케이프 엔터프라이즈와 인터넷 정보 서버(IIS), 아파치 서버에서 수행된다.
즉, 클라이언트 요청을 처리하고 그 결과를 다시 클라이언트에게 전송하는 Servlet 클래스의 구현 규칙을 지킨 자바 프로그램이다.
[그림1] Servlet 동작 과정
1 클라이언트가 웹 브라우저에 URL을 입력하면 해당하는 HTTP Request를 해당하는 서버의 Servlet Container에 보낸다.
2. Servlet Container는 HttpServletRequest, HttpServletResponse 두 객체를 생성한다.
3. 클라이언트가 요청한 URL을 DD(배포서술자, Deplyment Descriptor)를 참조해서 분석하여 어느 서블릿에 대한 요청인지 찾는다.
4. Servlet Container는 service() 메소드를 호출하며, POST, GET여부에 따라 doGet() 또는 doPost()가 호출된다.
5. doGet() 또는 doPost() 메소드는 동적인 페이지를 생성한 후 HttpServletResponse 객체에 응답을 보낸다.
6. 응답이 완료되면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킨다.
DD(Deployment Descriptor : 배포 서술자)
: 웹 컨테이너에게 사용자가 지금 접근한 URL 주소가 서블릿 요청임을 인식하고 그 서블릿 클래스의 위치는 어디에 있다고
알려주기 위해 필요한 정보들이 적혀 있는 파일이다. 주로 프로젝트의 WebContent/WEB-INF/web.xml 파일에 작성된다.
위의 코드는 web.xml 파일인데 이 파일을 보면 <sevlet>과 <servlet-mapping> 태그를 제외한 나머지 태그는 web.xml 에 기본으로 작성된다. 결국 우리가 직접 작성해야대는 부분은 <sevlet>과 <servlet-mapping>태그 이다.
<servlet-name> : <servlet>과 <servlet-mapping>을 연결해줄 수 있게 연결고리 같은 역할을 하며, xml 내부에서만 사용하는 이름이기 때문에 임의로 이름을 지정해준다.
<servlet-class> : 서블릿 클래스 파일을 호출할 수 하는 역할이며, 서블릿 클래스 파일의 위치와 클래스 파일명을 작성해준다. 예를 들어, a패키지안에 b.java 라는 java파일이 있다면 a.b 라고 입력해주면 된다.
<url-pattern> : 클라이언트가 요청한 URL의 주소형식이 명시된 URL 패턴과 동일한지 비교하는 역할입니다. 예를들어, www.abcd.com/Zitoo 라 요청하면 우리가 만든 서블릿 b.java가 실행되서 웹브라우저에 보여지게 된다.
따라서, 웹 컨테이너가 인식하는 순서는
1. <servlet-mapping>에서 <url-pattern>을 통해 사용자가 요청한 URL과 비교한다.
2. 동일할 경우 <servlet-mapping>의 <servlet-name>을 통해 <servlet>내의 <servlet-name>과 일치하는 <servlet-name>을 찾는다.
3. 일치하는 <servlet-name>이 있을 경우 해당 <servlet-name>의 <servlet-class>를 호출한다.
이 과정을 URL과 Servlet을 Mapping한다고 한다.
Servlet 생명주기
[그림2] Servlet 생명주기
객체생성 : 서블릿이 처음으로 요청된경우에는 서블릿 클래스를 메모리에서 로딩하여 객체를 생성 한다. 생성된 객체는 메모리에 계속 존재하므로 이후부터는 서블릿 객체가 새로 생성되지 않고, 메모리에 있는 서블릿 객체로 사용한다.
init() : 객체가 생성되면서 init()이 최초에 한번 호출된다.
Service() : 클라이언트의 요청이 있을때 service()가 GET, POST 여부에 따라 실행된다. 여러 클라이언트가 동시에 요청을 하더라도 쓰레드가 생성되므로 동시에 service()가 실행이 되기 때문에 수행속도가 빠르다.
destory() : 서블릿이 더 이상 필요로 하지 않을 경우 destory() 메소드가 호출되서 연결을 해지한다.
Servlet 예제
Servlet으로도 예제에서 본 것처럼 JAVA기반으로 HTML은 문자열로 만들어서 출력 한다. 그런데 예제는 태그가 몇 개 안되지만 태그가 많은 HTML 페이지를 만들려고 한다면 매우 번거로울 것이다. 또한 작성 도중에 태그중에 에러가 발생한다면 찾는것도 매우 힘들것이다. 이러한 번거로움 때문에 JSP가 나왔는데, JSP는 HTML기반으로 작성이되고 동적처리를 담당하는 부분을 JAVA로 작성한다. JSP가 사용하기 편할듯 보이지만 동적인 부분이 많은 부분까지 JSP로 하기에는 무리가 있다. 그래서 Sevlet, JSP 둘 중에 하나만 사용하는 것이 아니라 각자의 장단점을 살려서 보여지는 부분은 HTML이 중심이 되는 JSP, 다른 JAVA 클래스에게 데이터를 넘겨주는등 동적인 부분은 Java 코드가 중심이 되는 Servlet으로 작성해서 둘을 혼용해서 사용하는 것이 바람직하다.
출처
구루비 지식창고 http://wiki.gurubee.net/pages/viewpage.action?pageId=26740202&
'프로그래밍 > 웹 개발' 카테고리의 다른 글
Kendo UI Grid (5) | 2015.06.02 |
---|