티스토리 뷰

1. Servlet 작동 순서

 - 클라이언트에서 servelt요청이 들어 오면 서버에서는 servlet컨테이너를 만들고, 요청이 있을때 마다 스레드가 생성 됨.

 

1-1 작동 순서

 - 웹브라우저: 웹브라우저를 통해 클라이언트가 웹서버로 요청

 - 웹서버: 요청이 들어온 것을 감지하고, WAS로 요청을 보냄

 - 웹어플리케이션서버(WAS): Servelt 컨테이너로 요청을 보냄

 - Servlet 컨테이너: 컨테이너 안에서 스레드 생성(들어온 요청을 처리하기 위해) 및 Servlet객체 생성

 

 

 

1. 클라이언트(or Web Server)는 서블릿 컨테이너(Tomcat)에게 HTTP request를 전송.

2. 서블릿 컨테이너는 HttpServletRequest, HttpServletResponse 객체를 생성.

3. HTTP request를 분석하여 어떤 서블릿에 대한 요청인지를 찾아냄. (web.xml을 참조)

4. 만약 해당하는 서블릿 클래스가 메모리 영역에 존재하지 않는다면 (실행된 적이 없다면) 서블릿 객체를 하나 생성하고, init() 메서드를 호출. 그 이후에는 클라이언트 요청마다 쓰레드를 하나씩 생성하여 요청을 처리.

5. 서블릿 컨테이너는 service()를 호출하고, Get, Post에 따라 doGet(), doPost()를 호출.

6. doGet, doPost 메서드는 동적인 페이지를 생성한 후, HttpServletResponse에게 데이터를 전달.

7. 응답이 완료되면 HttpServletRequest, HttpServletResponse 객체를 소멸.

 

 

1-2 Servlet과 다른 CGI언어의 차이

- 다른 CGI언어: 서버로 요청(Request)이 들어옴 -> 요청을 처리할 객체 생성. 요청이 한 개 들어왔으면 그 요청을 처리할 한개의 객체 생성. (요청이 또 들어왔을 때는, 요청 만큼 객체를 계속 생성) 요청이 많이 들어왔을 때, 객체가 계속 생성되기 때문에 서버 부하가 걸림

 

- 서블릿: Java를 기반으로 하기 때문에, 요청이 들어올 경우, 서버 안의 JVM(멀티 스레드 지원)을 통해 스레드 생성 -> 요청을 생성된 스레드로 보냄. -> 새로운 요청이 또들어왔을 때는 다른 스레드를 생성해서 요청 처리(반복) -> 스레드를 이용해서 요청을 처리하기 때문에, 다른 CGI언어에 비해 서버 부하가 적게 발생 (속도가 빠르고, 효율적으로 서버를 운영할 수 있음)

 

 * CGI : 공통 게이트웨이 인터페이스 (common gateway inferface)의 약어로, 웹서버와 외부 프로그램 사이에서 정보를 주고받는 방법이나 규약들을 말함. 즉, CGI는 사용자의 요청에 의한 서버의 응답을 수행하기 위해 서버가 외부 프로그램과 정보를 주고 받기 위한 규약들을 말하며 CGI를 가능하게 하기 위해서는 CGI 프로그램이 필요하다. CGI 프로그램은 웹서버의 환경에 따라 다르게 구현되며 Java를 통해 구현된 Servelt은 CGI 프로그램을 구현하기 위한 도구중 하나이다. CGI는 규약이며 동작 원리이고 그것을 웹개발에서 실행해주는 것이 WAS이며, WAS는 Java등과 같은 언어로 구성할 수 있다

 

2. Servelt 라이프사이클(생명주기)

*생명주기: 해당 객체가 언제 생성되어 어떤 절차를 통해 언제 없어지는지. 생명 주기에 맞추어 메소드를 실행해야 한다. (어느시점에 어느 메서드가 Callback이 되는지 )

 

 - Servlet의 사용도가 높은 이유는 빠른 응답 속도 때문.

 - Servlet은 최초 요청 시 객체가 만들어져 메모리에 로딩되고(탄생), 이후 요청 시에는 기존의 객체를 재활용하기 때문에 동작 속도가 빠름.

 - 웹어플리케이션 서버가 종료될 때 or Class파일이나 Java파일을 수정했을 때 객체가 사라짐.

 

2-1 Servlet 라이프사이클

 1) Servlet객체 생성(최초 한번)

 2) Init() 호출 (최초 한번)

 3) service(), doGet(), doPost() 호출 (요청시 매번)

 *service(): doget() or dopost()가 없을 때 실행, 같이 있으면 callback

 ex) 클라이언트가 요청하는 방식(get, post, 웹브라우저로 직접 접근)에 따라 그에 알맞는 메서드 호출

 4) destroy() 호출 (마지막 한번)

 ex) 자원 해제, servlet 수정, 서버 재가동 등의 이유로 수행되던 Servlet객체의 소멸

 

@WebServlet("/LifeCycle")
public class LifeCycle extends HttpServlet {
	private static final long serialVersionUID = 1L;

    public LifeCycle() {
        super();
    }
    @PostConstruct
    public void beforeInit() {
    	System.out.println("PostConstruct");
    }
	public void init(ServletConfig config) throws ServletException {
		System.out.println("Init");
	}
	public void destroy() {
		System.out.println("Destory");
	}
    @PreDestroy
    public void afterDestroy() {
    	System.out.println("PreDestroy");
    }
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doGet");
	}
[출처] Servlet 동작순서, 라이프사이클(생명주기), 선처리 후처리 (PostConstruct, PreDestory)|작성자 pjok1122

 

3. Servlet 선처리, 후처리

 - Servelt의 라이프 사이클중 init()과 destroy()메소드와 관련하여 선처리(init()전)와 후처리(destroy()후) 작업 가능.

 - init()을 호출하기 전에 @PostConstruct를 통해 선처리 가능. Override개념이 아니며, 어노테이션으로 처리

 - destroy()호출 이후 @PreDestroy를 통해 후처리 가능. Override개념이 아니며, 어노테이션으로 처리

 

*개발을 할때 생명주기를 고려하는 것이 중요한 이유

 -우리가 개발을 할 때 아래단(JVM 등)에서 호출을 해주는 시점을 정확히 인지하고 있어야, 그 시점에 해당하는 기능을 구현할 수 있다. 

*선처리, 후처리를 하는 이유

 -init()가 실행되기 전이나 destroy()가 실행된 후 실행할 메서드가 있는 경우 사용

*CGI

 - http://www.sck.pe.kr/c-cgi/whatiscgi.htm

 

4. 배포서술자 (DD, Deployment Descriptor)

 

- 프로젝트의 WebContent/WEB-INF/web.xml 파일을 의미함.

- 클라이언트가 접근한 URL이 어떤 Servlet에 대한 요청인지를 저장하고 있으며, URL 매핑 또한 관리함.

*참고 자료

https://blog.naver.com/PostView.nhn?blogId=pjok1122&logNo=221725994535

댓글