본문 바로가기
강의/웹 프로그래밍(풀스택)

부스트코스 웹 프로그래밍(풀스택) - 1. 웹 프로그래밍 기초 - 5-3-1 강의 정리

by 리드민 2022. 4. 14.
반응형

[1] 강의

웹 프로그래밍(풀스택)

5. Servlet - BE

3) Servlet 라이프 사이클-1

 

[2] 개념 정리

HttpServlet의 3가지 메소드

- init :  딱 한 번만 호출됩니다. 서블릿 컨테이너가 서블릿 객체를 생성한 후 호출합니다. 서블릿이 작업하는데 필요한 자원을 준비시키는 코드를 넣습니다.
- service : 클라이언테의 HTTP 메소드(GET, POST 등)를 참조하여 doGet()을 호출할지, doPost()를 호출할지 판단합니다.

- destory : 딱 한 번만 호출됩니다. 웹 어플리케이션의 실행이 멈출 때, 서블릿이 사용한 자원을 초기화시킬 수 있도록 이 메서드를 호출합니다. 서블릿이 사용한 자원을 초기화 시키는 코드를 넣습니다.

 

[3] 강의 정리

  이번 강의에서는 서블릿의 생명주기에 대해서 알아보도록 하겠다. 서블릿이 언제 생성이 되고 언제 어떤 메서드들이 어떻게 호출이 되는지 이런 부분을 알아보려고 한다. 이 라이프 사이클에 대해서 자세히 설명하기 전에 일단은 여러분들이 이런 LifecycleServlet이라는 클래스를 하나 만들어서 실제로 어떤 식으로 어떤 메서드가 출력이 되는지 이런 부분들을 한번 실습을 통해서 알아보고 그 다음에 다시 다음 강의에서 내용들을 정리해보는 순서로 진행해보도록 하겠습니다. 이클립스를 열어주고. 전에 만들었던 프로젝트의 examples 이라는 패키지 안에다가 오늘 실습할 서블릿 클래스를 하나 작성해거다. 서블릿 클래스의 이름은 LifecycleServlet이라고 하나 작성해볼 거다. 이때 URL mappings는 그냥 둬도 된다. 다음 Next로 가서 여러분들이 반드시 언제 생성되고 언제 소멸되는지 이러한 부분들을 알아보기 위해서 메서드를 몇 개 override 해주시면 된다.

  init이라는 메서드와 destroy라는 메서드, service라는 메서드. 이렇게 세 개의 메서드를 override 해줄거다. 그리고 doGet, doPost 메서드는 체크 버튼을 잠깐 빼줄 거다. 이렇게 생각하고 close하시면, Finish하시면. 자동으로 이런 내용들이 만들어질 거다. 주석 부분들이 조금 어지럽다 생각되면 지워도 상관없다. 깔끔하게 보이게 하기 위해서 지워보겠다.. 지금 보니까 생성자, init(), destroy(), service() 이렇게 네 개의 생성자 메서드까지 합친다면 네 개의 메서드가 보인다. 해당 서블릿을 언제 어떻게 생성되고 이런 메서드들이 언제 호출이 되는지 알아보도록 하기 위해서 몇 가지 코드를 수정해보려고 한다. System.out.print()이라는 코드를 입력했다. System.out 하면 우리 콘솔을 의미하고 있다는 거 알거다. 전에 사용했었던 예제에서 response 객체로부터 얻어온 PrintWriter 객체 out 하고는 목적지가 다르다는 거를 기억해야 한다. System.out은 콘솔에 출력해줘야 하는 거다. 응답 결과로 보내줘는 아니라는 거 기억하면 좋을 거 같다.

  나는 이 객체가 생성됐을 때 이런 메시지가 보이게 할 거다. 마찬가지로 이런 init()이라는 메서드가 호출이 되면 이 메서드가 호출됐다고 출력해주고 싶은 거다. 다음은 이렇게 destroy 호출!!, service 호출!! 이렇게 넣어보도록 하자. 저장하고 한번 실행시켜 보도록 하겠다. LifecycleServlet을 Run on Server 해보자. 모든 메시지들은 콘솔에 출력해요 했기 때문에 이 콘솔 보이는가? 여기에 출력이 되고 있는 걸 볼 수 있을 거다. 해당 URL로 클라이언트가 서버한테 요청했었다. 그럼 서버는 이 URL을 받아서 이 Lifecycle이라는 URL 매핑은 LifecycleServlet이라는 정보를 알아냈을 거다. 그래서 무슨 일을 하냐면 이 해당 클래스가 메모리에 존재할까라는 것을 체크한다. 메모리에 존재하지 않는다면 이 객체를 생성하야겠다. 그래서 메모리에 올려주는 일을 해야 한다. 저버는 이게 메모리에 없어라는 판단을 했을 거다. 그러니까 이 Lifecycle Servlet을 생성했다. 그래서 생성자에 우리가 넣어준 메시지가 출력이 되는 걸 확인할 수 있을 거다. 이때 생성이 됐다.

  그 다음에는 init()이라는 메서드를 호출하고 있는 걸 볼 수 있다. 그리고 service()라는 메서드가 호출됐다. destroy()라는 메서드는 아직 호출되지 않고 있는 것을 확인할 수 있다. 그럼 이번에는 다시 브라우저에서 새로 고침 해보자. 이것은 새로운 요청이다. 새로 고침 했떠니 이번에는 처음처럼 LifecycleServlet 생성!! init 호출!! 이런 메서드들은 호출되지 않았다. service 호출!!이라는 service() 메서드만 호출되고 있는 것을 확인할 수 있을 거다. 이렇게 실행되는 부분은 반드시 이 부분만 이러는게 아니고, 똑같은 주소로 이렇게 호출해보면 다른 브라우저를 이용한다 하더라도 service()만 계속 호출이 되고 있는 걸 볼 수 있다. 서블릿은 서버에 서블릿 객체를 여러 개 만들지 않는다. 요청이 여러 번 들어오면 매번 생성하고 이런 일들을 반복하는 게 아니라 실제 요청된 객체가 메모리에 있어, 없어 이 부분을 체크해서 있다면 service라는 메서드만 호출한다. 그래서 한번 호출된 이후에는 계속 service()만 호출되고 있는 것을 여러분이 확인할 수 있었을 거다. 그렇다면 destroy()라는 메서드는 언제 호출될까? 예를 들어 제가 이 서블릿을 조금 수정해보려고 한다. 수정했다. 그리고 저장했다. 그러면 이 서블릿이 수정됐기 때문에 지금 메모리에 올라가있는 서블릿 객체는 더 이상 사용될 수 없겠지, 이랬을 때 콘솔을 다시 한번 살펴보니까 destoy()라는 메서드가 호출되고 있는 걸 확인할 수 있고. 그리고 다시 브라우저를 통해서 새로 고침 해보니까 메모리에 이제 존재하지 않는다. 그래서 다시 처음부터 객체를 생성하고 init()을 호출하고 service()를 호출하는 이런 부분들을 수행하고 있는 것을 확인할 수 있을 거다. 언제 어떤 메서드가 불리는지 여러분 한번 정리해보면 좋을 것 같다. 이 실습 내용들을 기억하고 다시 이론적인 내용들을 정리해보도록 하자.

 

[4] 코드 정리

package examples;

import java.io.IOException;
import java.io.PrintWriter;

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 test 호출!!");
	}

	
	public void destroy() {
		System.out.println("destroy 호출!!");
	}

	@Override
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
       {
		System.out.println("service호출!!");		
	}
	
}
​
반응형