본문 바로가기
events/부스트코스

[부스트코스] 1. 웹 프로그래밍 기초 | 5. Servlet - BE | Servlet Lifecycle

by kimtahen 2020. 2. 24.
반응형

  Servlet 어플리케이션을 알맞게 생성하기 위해서는, Servlet의 동작방식을 잘 알고 있어야 한다. 그중에서도 가장 기본이 바로 Lifecycle이다.

1. 개념 

  Servlet이 WAS 위에서 생성되면 아래와 같은 순서대로 Servlet의 매서드들을 실행한다.


1. WAS는 Servlet 요청을 받으면, 일단 그 Servlet이 메모리에 있는지 확인한다.

2. 메모리에 없다면, Servlet의 생성자를 이용해서 그 Servlet을 메모리에 등록한다. 

3. init() 메서드를 실행한다.

4. service() 메서드를 실행한다. Client의 요청을 처리한다.

5. WAS가 종료되거나, Servlet이 갱신되면 destroy() 메서드가 실행된다.


2. 실행

  저번 포스팅을 참고하여 Lifecycle이라는 이름을 가진 Servlet을 하나 생성해보자. 단, 생성과정에서 Next를 두번눌러서

이 화면의 doGet, doPost의 체크박스를 헤제한뒤, init, destroy, service에 체크를 해준후 Finish를 클릭한다.

그럼 이와 같이, 네개의 매서드가 자동으로 입력된 Servlet이 생성된다.

 

  위에서 부터 차례대로 생성자, init 메서드, destroy 메서드, service 메서드 이다. 각 생성자와 메서드들이 어느시점에서 호출되는지를 확인하기 위하여 아래와 같이 코드를 수정해보자. 주석은 보기 편하게하기 위하여 삭제하였다.

public Lifecycle() {
    super();
    System.out.println("생성자 호출");
}
    
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 은 콘솔에 출력하는 것을 의미한다.

 

이제 Run As - Run On Server 을 선택하여 Servlet을 실행해보자.

이렇게 Eclipse inner browser가 실행되면서 /helloworld/Lifecycle 로 접속하게 되면, 콘솔창에서 

`

생성자 호출

init 메서드 호출 

service 메서드 호출 

`

순서대로 실행되는 것을 볼 수 있다.

 

위의 브라우저에서 새로고침을 몇번 눌러보자. 그러면 

이와 같이 service 메서드만 계속 호출되는 것을 확인할 수 있다. 

브라우저에서 새로고침을 한다는 것은 클라이언트에서 해당 URL로 다시 요청을 보내는 것과 같다. 클라이언트의 요청은 service 메서드에서 처리하기 때문에 service  메서드만 계속 호출이되는 것이다.

 

  그럼 이제 WAS를 종료시켜보자. WAS의 종료는 

Servers 탭에서 우측 상단의 빨간색 네모 버튼을 클릭하면 된다.

Console 탭으로 다시 돌아와보면 destroy 메서드가 정상적으로 호출이 되었다는 것을 확인할 수 있다.

 

이번에는 doGet메서드와 doPost메서드를 Servlet에 포함시켜서 실행시켜보자. 다시 Lifecycle.java 파일을 클릭한뒤, 상단의 Source - Override/Implement Methods... 순으로 클릭하면

이런 창이 하나뜨면서 Lifecycle 클래스가 상속한 HttpServlet 클래스의 메서드들을 손쉽게 추가할 수 있다. doGet, doPost을 체크하고 OK를 클릭하자.

 이렇게 doGet 메서드와 doPost 메서드가 추가되었다.

 

상단에

import java.io.PrintWriter;

PrintWriter을 import 해주고, 위 코드에서 Service 메서드를 삭제한다. 그리고 doGet메서드와 doPost메서드를 아래와 같이 수정하여 작성한다.

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("doGet 메서드 호출");
		resp.setContentType("text/html");
		PrintWriter out = resp.getWriter();
		out.println("<!DOCTYPE html>\r\n" + 
				"<html>\r\n" + 
				"<head>\r\n" + 
				"	<title>lifecycle</title>\r\n" + 
				"</head>\r\n" + 
				"<body>\r\n" + 
				"	<form method=\"post\" action=\"/helloworld/Lifecycle\">\r\n" + 
				"		<input type=\"text\" name=\"content\">\r\n" + 
				"		<button type=\"submit\">Click</button>\r\n" + 
				"	</form>\r\n" + 
				"</body>\r\n" + 
				"</html>");
		out.close();
	}

	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		System.out.println("doPost 메서드 호출");
		PrintWriter out = resp.getWriter();
		String content = req.getParameter("content");
		out.println("<h1>Hello"+content+"</h1>");
		
	}

Ctrl+s 로 저장을 한뒤,

Run As - Run On Server을 클릭하여 서버를 재시작해보자.

순서대로 생성자 호출 - init 메서드 - doGet 메서드 호출이 일어난다. 그리고 입력칸에 아무 글자나 입력하고 Click 버튼을 눌러보자.

그러면 아래와 같이 doPost 메서드가 호출되며 화면이 바뀐다.

Service 메서드를 삭제하였지만, doGet 메서드와 doPost 메서드가 정상적으로 호출이된다. 아마도, HttpServlet 클래스를 상속받았기에, Service()메서드가 없어도 상위 클래스의 Service 메서드를 호출하기 때문일 것이다.

반응형

댓글