서블릿의 구조
서블릿은 좀 전에 자바 웹 프로그램이라고 소개한 적이 있다.
이는 웹을 구성하는 기본적인 요소인데 우리는 보통 이 웹 어플리케이션으로 Tomcat을 사용하게 된다. Tomcat의 폴더를 가 보면
이와 같이 구성 되어있는 것을 볼 수 있다. 이는 웹 어플리케이션이라면 가져야 할 폴더 구조이다.
서블릿의 동작 원리와 라이프 사이클(life cycle)
더 정확히 말하자면 여기서 클라이언트가 아니라 WAS(Web Application Server)일 것이다.
여기서 서블릿 컨테이너의 역할은 서블릿과 서버를 연결 해 주고 객체를 생성 해 주는 것이다. 따라서 요청이 있을때 마다 객체를 생성 해 주는 역할을 하게 된다.
- 클라이언트로부터 요청이 들어오면 http 프로토콜을 사용하게 되므로 request, response객체를 생성하기 된다.
- 요청된 url에 매핑된 서블릿의 생성자를 호출하게 된다.
- 생성자는 init()메서드를 실행하게 된다.
- init()메서드는 service()메서드를 호출하고 service()메서드는 스레드에 담겨진다.
- 요청한 방식(get, post)에 따라서 해당 메서드로 이동한다.
- 응답하고 연결을 끊는다.
이것이 servlet의 동작 순서이다. 그러면 각 메서드의 역할을 알아보자.
- 생성자 : 생성자는 따로 작성하지 않고 default 생성자를 이용해도 된다. default 생성자는 init()메서드를 호출하게 된다.
- init() : init()메서드는 service()메서드를 호출하게 된다.
- service() : 요청된 방식(get, post)를 확인하고 맞는 메서드로 분기 시켜준다. (doGet(), doPost())
- doGet() : get방식으로 요청된 처리를 한다.
- doPost() : post방식으로 요청된 처리를 한다.
- destroy() : 연결 해제
자 여기 까지 알았으면 service()메서드가 스레드에 담겨진다는 말에 대한 의문이 생길 것이다.
매번 이러한 과정을 거치게 된다면 시간도 오래걸릴뿐만 아니라 매번 객체가 생성되어 서버가 마비가 되는 등의 문제가 발생하게 된다. 따라서 최초 요청에만 위와 같은 동작을 하게 되고 이후에는 바로 스레드의 서비스 메서드로 이동하게 된다. 이를 코드를 통해 알아보자.
package sample;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class LifeCycle extends HttpServlet {
private static final long serialVersionUID = 1L;
public int count =0;
public LifeCycle() {
System.out.println("LifeServlet의 생성자 호출됨...");
}
@Override
public void init() throws ServletException {
System.out.println("init() 호출됨...");
}
@Override
public void destroy() {
System.out.println("destroy() 호출됨...");
}
@Override
public void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
System.out.println("service() 호출됨...");
System.out.println(count);
count++;
}
}
이해를 돕기 위해 모든 메서드를 오버라이딩 해놨다.
사실 destroy() 메서드는 톰캣을 끄는 속도가 더 빨라서 확인할 수 없지만 알 수 없는 오류로 운좋게 확인했다.
이와 같이 최초 요청시에만 생성자와 init()메서드가 실행되었고 새로고침 하면서 계속 요청을 하면 service() 메서드만 실행되는 것을 볼 수 있다.
'FRONT > JSP' 카테고리의 다른 글
[Front] JSP 동작 원리와 기초 (0) | 2020.06.10 |
---|