servlet이 나오기 전에는 고정된 내용을 가진 정적 웹 페이지만을 제공했고, 사용자들의 요청을 정적 웹 페이지에서 표현하기에는 한계가 있었기 때문에 동적인 데이터를
제공하는 웹 페이지의 필요성을 느끼고 CGI(Common Gate Interface)가 나오게 됐습니다. 하지만 CGI는 새로운 프로세스를 계속 만들어야 한다는 단점
때문에 자바 진영에서 동적 데이터를 제공하기 위한 CGI 기반으로 servlet이 등장하게 됐습니다.
javax.servlet.Servlet
인터페이스를 상속 받은 구현체를 구현해야 함init()
메소드를 수행한다.(처음 초기화시 init(); 수행)service()
메소드를 수행한다. (실제 서비스 로직, doGet(), doPost() 메소드 등을 호출)destroy()
메소드를 수행하여 만들었던 servlet을 제거한다.즉 main()
메소드가 필요 없고 독립적으로 실행되지 않으며 오직 servlet container에 의해 생성, 실행되고 소멸됩니다.
Servlet Container는 servlet의 생명주기를 관리하는 컨테이너입니다.
예를 들어 Servlet Container는 공장의 관리인👷🏻♂️ 이고 servlet은 공장의 기계 🦾 라고 생각해보자면,
Servlet Container는 어떤 물품에 대한 요청이 들어오면 해당 물품을 만들기 위해 servlet을 가동해 물품을 만들어 내서 요청한 사람에게 넘겨주는 것을 생각하면 됩니다.
public class SampleServlet extends HttpServlet {
@Override
public void init() throws ServletException {
// 처음 초기화시 실행되어야 할 로직
}
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) {
// 실제 서비스 로직
}
@Override
public void destroy() {
// 종료시 실행되어야 할 로직
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// get 요청 시 수행될 로직
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) {
// post 요청 시 수행될 로직
}
}
위 코드처럼 기본적인 init(), service(), destroy()
메소드 뿐만 아니라 HttpServlet을 상속받아 들어오는 Request에 대해 처리할
doGet(), doPost()
메소드를 반드시 구현해줘야 합니다.