※ 본문은 혼자 공부한 내용을 기록한 글입니다. 오개념이 있다면 댓글로 알려주세요!
[ 1 ] Servlet 생명주기
Servlet은 Servlet Container에 의해 관리되며, Servlet Container는 Servlet의 생명주기 관리, 멀티스레딩 관리 등의 기능을 수행한다.
Servlet의 생명주기는 다음과 같다.
(1) WAS가 서블릿 요청을 받으면 해당 서블릿의 객체가 메모리에 있는지 확인
(2) 만약 메모리에 없다면
→ 해당 서블릿 클래스를 메모리에 올림
→ init() 메소드를 호출
→ service() 메소드를 호출
만약 메모리에 해당 서블릿 객체가 존재한다면
→ service() 메소드를 바로 호출
(3) WAS 종료 시 혹은 init() 메소드 수정 등 객체 삭제해야 할 때 destroy() 메소드 호출
@WebServlet("/MyServlet")
public class MyServlet extends HttpServlet {
public MyServlet() {
System.out.println("Servlet 객체 생성");
}
@Override
public void init() throws ServletException {
System.out.println("init() 실행");
}
@Override
protected void service(HttpServletRequest req,
HttpServletResponse resp) throws ServletException, IOException {
System.out.println("service() 실행");
}
@Override
public void destroy() {
System.out.println("destroy() 실행");
}
}
[실제 호출 결과]
① 처음으로 해당 Servlet을 요청했을 때
"Servlet 객체 생성 → init() 실행 → service() 실행 " 순서로 메서드가 호출된다.
② ①의 과정 이후 해당 Servlet을 다시 요청했을 때
service() 메소드의 결과인 "service() 실행" 만 console에 출력된다.
③ init()을 수정하고 저장할 때
destroy() 메소드의 결과인 "destroy() 실행" 이 console에 출력된다.
[ 2 ] service() 메소드
service() 메소드는 일반적인 자바 클래스의 main과 유사하며, 다음과 같은 역할을 한다.
- 응답에 대한 모든 내용은 service() 메소드에 구현해야 한다.
- Servlet이 수신한 모든 request에 대해 service() 메소드가 호출된다.
- service() 메소드는 request type(HTTP Method: GET, POST, PUT 등..)에 따라 적절한 메소드(doGet, doPost, doPut 등..)를 호출한다.
- service() 메소드를 Overriding 하지 않더라도, 부모 클래스인 HttpServlet의 service()가 자동으로 호출된다.
- 즉, 하위 클래스에 doGet, doPost를 Overriding했을 때 service() 메소드를 Overriding하지 않더라도 HttpServlet의 service() 메소드가 요청에 맞는 메소드를 알아서 호출해 준다.
@Override
protected void doGet(HttpServletRequest req,
HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doGet 호출");
PrintWriter out = resp.getWriter();
out.write("<!DOCTYPE html>");
out.write("<html>");
out.write("<head>");
out.write("<meta charset=\"UTF-8\">");
out.write("<title>Insert title here</title>");
out.write("</head>");
out.write("<body>");
out.write("<form action=\"MyServlet\" method=\"post\">");
out.write("<input type='text' name='name'>");
out.write("<input type=\"submit\" value=\"test\">");
out.write("</form>");
out.write("</body>");
out.write("</html>");
}
@Override
protected void doPost(HttpServletRequest req,
HttpServletResponse resp) throws ServletException, IOException {
System.out.println("doPost 호출");
String name = req.getParameter("name");
PrintWriter out = resp.getWriter();
out.write("doPost 호출 : " + name);
}
즉, MyServlet 서블릿에 service() 를 Overriding하지 않고 위처럼 doGet, doPost만 Overriding하여 구현하더라도 정상적으로 작동함을 확인할 수 있다.
위 서블릿은 처음에 url로 요청 시 doGet()이 실행되고, doGet() 내부 form 태그의 submit 실행 시 doPost()가 실행됨을 확인할 수 있다.
[추가]
doGet, doPost를 Overriding 한 경우, get, post 어느 요청이 있건 공통적으로 전처리해야 할 작업이 있다면 service() 메소드도 Overriding하여 전처리 작업을 구현하는 방법이 있다. 단, 이 경우 service() 메소드 내부에 super.service()를 통해 request type에 따라 doGet, doPost를 호출하도록 해야 한다. (super.service()가 없으면 전처리 작업만 수행되고 doGet, doPost는 호출될 수 없다)
따라서 위 서블릿에 전처리 작업을 수행할 service() 메소드를 다음과 같이 Overriding 할 수 있다.
@Override
protected void service(HttpServletRequest req,
HttpServletResponse resp) throws ServletException, IOException {
System.out.println("하위 클래스에서 service 오버라이딩");
System.out.println("get, post에서 공동으로 수행해야 할 작업");
super.service(req, resp);
}
[실제 호출 결과]
① 처음에 url로 Servlet 호출 시
service() 실행 후 doGet()이 실행됨을 확인할 수 있다.
② doGet() 내부 form 태그의 submit실행 시
마찬가지로 service() 실행 후 doPost()가 실행됨을 확인할 수 있다.
[참고자료]
https://coding-factory.tistory.com/742
[Web] 서블릿(Servlet)이란 무엇인가? 서블릿 총정리
서블릿(Servlet)이란? 서블릿이란 Dynamic Web Page를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술입니다. 웹을 만들때는 다양한 요청(Request)과 응답(Response)이 있기 마련이고 이 요
coding-factory.tistory.com
https://youngest-programming.tistory.com/45
[JSP] Servlet 라이프 싸이클 정리 + doGet, doPost
Servlet 라이프 싸이클에 대해 간단하게 정리한 포스팅을 할려고한다. 먼저 라이프사이클은 다음구과 같은 구조와 같다. 이것을 직접 확인해보았다. 다음과 같이 코딩을하고 실행시켜본다. 해당
youngest-programming.tistory.com
https://kangdaseul.tistory.com/13
[Servlet] Servlet 개념과 동작과정
HTML Form -> Servlet -> HTML Page 1. 사용자가 웹 페이지 form(HTML Form)을 통해 자신의 정보를 입력 (Input) 2. Servlet의 doGet() 또는 doPost() 매서드는 입력한 from data에 맞게 DB또는 다른 소스에서 관련된 정보를
kangdaseul.tistory.com
'Programming > Servlet&Jsp' 카테고리의 다른 글
[Servlet & Jsp] MVC 패턴, Model 1, Model 2 (1) | 2023.01.12 |
---|---|
[Servlet & Jsp] Jsp 구조, 코드블록 (1) | 2023.01.09 |
[Servlet & Jsp] Application, Session, Cookie (1) | 2022.11.26 |