일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- QNA 봇
- 서버
- sts
- 웹
- 백준
- BOJ
- P Stage
- 풀스택
- 레벨2
- 파이썬
- 프로그래밍
- Naver boostcourse
- 대회
- 부스트캠프
- Naver boostcamp
- cs50
- Django
- 2021 Dev-matching 웹 백엔드 개발자
- AI Tech 4기
- 서블릿
- 백엔드
- 네이버
- Customer service 구현
- AI Tech
- 웹 프로그래밍
- 프로그래머스
- 장고
- 4기
- 구현
- boostcourse
- Today
- Total
daniel7481의 개발일지
[웹 프로그래밍(풀스택)] Servlet - BE(2) 본문
1. Servlet 생명 주기(1)
LifecycleServlet 작성
서블릿 생명주기를 확인할 수 있는 LifecycleServlet 작성하기.
HTTPServlet의 3가지 메소드를 오버라이딩
-init()
-service(request, response)
-destroy()
먼저 example 패키지에 LifecycleServlet이라는 서블릿을 하나 생성한다. 여기서 앞에서 설명한 몇가지 메소드의 체크박스를 체크해준다.
package examples;
import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/LifecycleServlet")
public class LifecycleServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public LifecycleServlet() {
System.out.println("LifecycleServlet 생성!");
}
public void init(ServletConfig config) throws ServletException {
System.out.println("init 호출!");
}
public void destroy() {
System.out.println("destroy 호출!");
}
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("service 호출!");
}
}
만들어진 서블릿을 다음과 같이 바꿔주자. 여기서 System.out은 콘솔창에 출력하는 것이기 때문에 앞에서 사용했던 response.getWriter()(클라이언트에게 보내주는 메소드)와는 다르다는 것을 기억하자. 위 서브릿을 서버에서 실행하면 빈 페이지와 콘솔에
LifecycleServlet 생성!
init 호출!
service 호출!
이라고 실행되는 것을 확인할 수 있을 것이다. 먼저 url mapping에 따라 URL을 호출하게 되면 LifecycleServlet이라는 정보를 알아내고, 그 다음 해당 클래스가 메모리에 존재하는지 확인한다. 만약 메모리에 존재하지 않으면 그 객체를 생성한다. 우리는 LifecycleServlet을 최초로 실행한 것이기 때문에 서버는 메모리 상에 없다라는 판단을 했을 것이고, 생성자 메서드가 호출이 된다. 이로 인해 우리가 생성자 메소드에 넣어놓은 LifcycleServlet 생성!이 출력되는 것을 알 수 있다. 또한 service()는 호출되고 destroy는 호출이 되지 않은 것을 알 수 있다. 이제 브라우저를 새로고침하면 service 호출!만 출력되는 것을 알 수 있다. 서블릿은 서버에 서브릿 객체를 여러 개 만들지 않는다. 요청이 여러번 들어오면 매번 생성하는 것이 아니라 요청된 객체가 메모리에 있나 없나에 따라서 생성자를 호출하거나 하지 않는다. 만약 servlet을 수정하게 되면 메모리 상에 있는 서블릿을 삭제해야 하기 때문에 destroy가 호출이 된다. 그 다음 생성자와 init으로 호출하고 service매서드가 실행된다.
2. Servlet 생명 주기(2)
위 그림처럼 WAS는 서블릿 요청을 받으면 해당 서블릿이 메모리에 있는지 확인한다. 만약 메모리에 없으면 서블릿 클래스를 메모리에 올리고, init() 메소드를 실행한다. 그 다음 요청과 응답을 관리하는 service() 메소드가 실행된다. 만약 WAS가 종료되거나 웹 애플리케이션이 새롭게 갱신되면 destroy()메소드가 실행된다.
service(request, response) 메소드
HelloServlet에서는 분명 doGet함수만 호출했는데 서블릿이 잘 실행됬다. service 메소드를 더 자세히 알아보자.
HttpServlet의 service메소드는 템플릿 메소드 패턴으로 구현한다.
- 클라이언트의 요청이 GET일 경우에는 자신이 가지고 있는 doGet(request, response)메소드를 호출
- 클라의 요청이 Post일 경우에는 자신이 가지고 있는 doPost(request, response)를 호출한다. 앞에서 설명한 바와 같이 우리의 서블릿은 HttpServlet을 상속한 것이다. 우리가 따로 service메소드를 오버라이드하지 않을 경우에는 부모 클래스인 HttpServlet의 service 메소드를 가지고 와서 사용하게 된다.
'Naver Boostcourse' 카테고리의 다른 글
[웹 프로그래밍(풀스택)] 1장을 마치며 (0) | 2022.01.23 |
---|---|
[웹 프로그래밍(풀스택)] Servlet -BE(3) (0) | 2022.01.23 |
[웹 프로그래밍(풀스택)] Servlet(1) (0) | 2022.01.22 |
[웹 프로그래밍(풀스택)] 개발 환경 설정-BE (0) | 2022.01.22 |
[웹 프로그래밍(풀스택)] HTML CSS를 마치며 (0) | 2021.12.10 |