Notice
Recent Posts
Recent Comments
Link
«   2024/04   »
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
Tags
more
Archives
Today
Total
관리 메뉴

Be Coder

Servlet Programming - 서블릿 개요와 동작 과정 본문

Servlet Programming - 서블릿 개요와 동작 과정

ForzaCoding 2020. 4. 19. 18:47

1. 서블릿 개요

- Server Side Applet의 약어. 웹 컨테이너에서 수행되는 Java 클래스.

- Java에서도 CGI 방식을 따라 웹 프로그래밍이 가능하도록, 자바 서버 프로그래밍 기술인 서블릿이 등장.

 

2. 서블릿 특징

- 서버의 응용 프로그램을 구현하는 기술. 서버 프로토콜 종류에 관계없이, FTP, SMTP, HTTP 등 여러 애플리케이션 기반의 응용프로그램을 개발할 수 있음.

- 서블릿은 클라이언트의 요청에 대해 서블릿 컨테이너에 의해 독립된 스레드 기반으로 서비스. 다중 스레드 서비스가 기본적으로 제공되므로, 프로세스 기반 CGI 보다 빠름.

- HTTP 프로토콜을 사용하는 웹, 서버 환경에서 주로 사용.

- 컨테이너는 클라이언트에서 전송되는 Request / Response 에 대한 처리를 담당.

- 서블릿 표준 api에서 제공되는 추상 클래스와 인터페이스를 구현하는 클래스를 제공하기 때문에, 특정 서블릿 컨테이너를 기반으로 개발 & 테스트하더라도, 언제던 다른 컨테이너 기반으로 교체가 가능

- Tomcat이 대표적인 서블릿 컨테이너로 사용되며, WAS로는 WebLogic, WebSphere, Jeus 등이 있음.

- 서블릿은 비즈니스 로직과 프리젠테이션 로직이 혼합된 형태임.(추후, 모델2 MVC, 스프링 학습 후 둘을 가능한 분리)

 

3. 서블릿 동작 과정

- 우선, HTTP 프로토콜에 대한 이해가 필요함.(https://milancode.tistory.com/18 참고)

 

1. 웹 클라이언트가 웹 서버에 메시지를 보낸다.(GET, POST 등) 필요에 따라, 매개변수와 웹 서버로부터 전달받아서 보관하던 쿠키 정보를 같이 보낼 수 있다.

2. 웹 서버는 웹 클라이언트한테 받은 HTTP 요청을 해석한 뒤, 서블릿에 대한 요청이면, 서블릿 컨테이너로 네트워크를 통해 요청을 전달한다. 네트워크를 통해 통신하므로, 웹 서버 컴퓨터와 서블릿 컨테이너 컴퓨터가 달라도 괜찮다. 대신 두 컴퓨터는 네트워크로 연결되어 있어야 한다.

3. 웹 서버로부터 클라이언트의 요청을 전달받은 서블릿 컨테이너는 해당 서블릿을 생성하여, 서비스를 수행하도록 service()메소드를 호출한다. 

4. 서블릿은 서블릿 컨테이너에 의해 인스턴스가 생성되어, 필요에 따라 init()메소드가 호출되어 초기화되고, 그 다음에 실제 서비스 수행을 위해 service() 메소드가 호출된다.

5. 서블릿은 서비스를 수행하고, 해당 결과를 알려주는 결과 페이지를 웹 서버에게 네트워크를 통해 전달한다.

6. 웹 서버는 서블릿 컨테이너로 전달받은 결과 웹 페이지를 웹 클라이언트에게 HTTP 응답으로 전달한다

 

요약

클라이언트 URL 요청 -> 웹 서버가 전달 받고 컨테이너로 전달 -> Servlet객체 + 쓰레드 생성

-> 쓰레드가 service() 메소드 호출 -> doGet(), doPost()인지 파악한 뒤, response, request 객체를 인자로 메소드 호출

-> 웹 페이지 생성 -> Container, WebServer, Client로 응답을 전달

 

 

4. 서블릿과 JSP의 변천과정

순서 설명
Servlet의 문제점 Servlet 코드 내에 HTML 코드가 존재하는 상태. 비즈니스 로직과 프레젠테이션 로직이 함께 존재하여, 개발 및 관리하기 어려움. HTML 코드 변경 시, 서블릿을 매번 재컴파일 해야함.
JSP 등장

상호보완하는 JSP 등장. Servlet 코드에서 HTML 코드를 JSP 기술로 처리. 컴파일 과정이 없어지고, 개발 및 관리가 용이해짐. 하지만, 아직도 JSP 페이지 내에 HTML 코드가 혼재. 

JSP 페이지 내에 포함된 Java 코드를 Tag처럼 사용할 수 있도록, Custom Tag가 등장하고, Custom Tag를 표준 라이브러리 형태로 제공하는 JSTL 등장.

JSP Scripting 한계 Java, HTML, JavaScript 등 여러 코드가 혼재. 프레젠테이션 관리는 쉬워졌지만, 프로그램 관리는 더 복잡.
Model-2 아키텍처 등장

Servlet과 JSP 기반의 웹 어플리케이션 유지보수 및 확장성을 위해, 역할을 구분하는 MVC 패턴 적용한 (Model-1, Model-2) 방식 등장. 

Mode : 자바클래스(DAO, DTO)

View : JSP, JSTL

Controller : Servlet

오픈소스 프레임워크 등장

Struts, Spring, Himbernate, iBatis 등 프레임워크 등장. 표준 아키텍처 제공. (Model-2 기반)

 

* Model-1과 Model-2의 차이 

> MVC 패턴을 구현하는 부분에서 처리하는 방식의 차이

- Model-1의 경우는 사용자의 요청을 받는 부분(Controller)의 역할이 JSP이고, Model-2는 사용자의 요청을 받는 부분이 Servlet.

- Model-2가 Controller의 역할을 Servlet이 담당하게 하여, 비즈니스 로직과 프레젠테이션 로직을 더욱 잘 분리하게 해줌.

 

 

5. Servlet Life Cycle

> Servlet Class는 객체 생성 및 메소드 호출하는 주체가 Serlvet Container.

웹 클라이언트로부터 온 요청을 받아 처리하기 위해, Serlvet은 Servlet Container 내에서 실행되고, 데이터 유지를 위해 세션을 사용할 수 있다.

> Servlet Container가 Servelt instance의 Life Cycle을 관리하며, 3개의 메소드를 호출한다. 

 즉, 개발자는 Serlvet 구현 시, Life Cycle과 관련된 메소드를 작성해야한다.

Life Cycle의 3가지 메소드

> 3가지 메소드에는 init(), service(), destory()가 있다.

- init() : Servlet Container가 요청을 처리할 Servlet instance를 생성하고, Servlet이 초기화 작업을 수행할 수 있도록 init()메소드를 내부적으로 자동 호출한다. 즉, 초기화 해줄 작업이 있다면, init()메소드 내에서 정의해야한다.

- service() : init()메소드 호출 후, service()메소드를 호출해서, 클라이언트의 요청을 받아 처리하게 한다. Serlvet이 ServletRequest(요청) 객체와 ServletResponse(응답 - 결과 페이지) 객체를 service() 호출하며 매개변수로 전달한다. 

- destory() : Servlet이 요청 작업을 모두 처리하면, Servlet Container에 의해 스레드 풀에 들어가거나, 메모리에서 내려간다. 스레드 풀로 가는 경우는 나중에 다시 실행될 수 있으나, 메모리에서 내려가는 경우는 가비지 컬렉션이 되는 것이므로, Serlvet이 작업을 마칠 수 있게 해야한다. 즉, Servlet이 gc되기 전, 마지막으로 처리할 작업 기회를 destory()를 통해 정의한다.

 

* LifeCycle을 코드로 수행해보면, 객체는 하나, 스레드는 여러 개가 생성되어 서비스한다. (여러 사용자 요청 처리)

 

 

 

5. Servlet의 사용자 요청 처리

Web Container    <-->   Servlet Class   <-->   Servlet Interface

 1. Container가 Serlvet Class를 메모리에 적재한다.

 2. Servlet Class의 Constructor Method를 호출하여, 인스턴스를 생성해 메모리에 적재한다.

 3. 생성된 인스턴스의 init() 메소드가 호출된다.( * init() 메소드는 Servlet Life Cycle에서 딱 한 번 실행 된다.)

 4. service() 메소드는 클라이언트의 요청이 있을 때 마다 수행된다. 

   > 요청이 오면 web.xml 파일을 참조하여 URL Mapping을 수행하고, 해당 Servlet의 인스턴스로부터 스레드를 생성해 service() 메소드를 호출한다. 

   > GET 방식 요청이면 doGet() 메소드, POST 방식 요청이면 doPost()를 호출하고, 개발자는 저 메소드들에 필요한 기능을 구현한다.

 5. destory() 메소드는 Serlvet 인스턴스가 더 이상 존재할 이유가 없어 메모리에서 내려갈 때 호출된다. 이 때 마지막 처리에 필요한 것이 있다면 destory() 메소드 안에 구현한다.

 

 

 

참고 : https://www.ntu.edu.sg/home/ehchua/programming/java/JavaServlets.html#zz-3.