본문 바로가기
개발 지식/JSP & Servlet

[JSP & Servlet] doGet, doPost 그리고 기타 메소드의 lifeCycle

by 에르주 2020. 8. 4.
반응형

지난 포스팅에서는 서블릿이 어떠한 개념을 가지고 있으며 어떻게 설정을 하는지 이야기했다.

이번에는 그 서블릿이 HttpServlet을 상속 받았을 때의 메소드 관련해서 이야기를 해보려고한다.

 

반드시 있어야 할 메소드인 doGet(요청의 Default는 Get)과 많이 쓰이는 doPost에 대해서 이야기 해보려고 한다.

 

다들 들어봤듯 HTTP 통신에서 GET 방식과 POST 방식에 대해서 많이 이야기한다. 

 

요청의 형태는 다음과 같이 5개으로 볼 수 있다

 

1. 브라우저에서 URL값을 입력 (Get 방식)

2. 새로고침 (Get 방식)

3. 링크 (Get 방식)

4. 사용자 입력 후 버튼 클릭 (Get | Post 방식)

5. javaScript 이용한 location.href ="서블릿" (Get 방식)

 

GET방식 같은경우에는 URL에 쿼리를 붙이는 방식으로 데이터를 전달하는 방식이고

ex) http://test.com:8080/ld/testServlet?userID={{userID}}&userPassword={{userPassword}}

 

POST는 Body값을 통해서 전달하는 방식이다.

 

메소드 이름처럼 doGet은 Get으로 요청받았을 때 실행되는 메소드이고 doPost는 Post로 요청받았을 때 메소드로

서블릿이 처음 생성되고 단 한번만 호출되는 것이 아니라 요청의 수(쓰레드 수 증가)만큼 실행된다.

 

package com.controller;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class LoginServlet
 */
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("doGet");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		System.out.println("doPost");
	}

	

}

 

 

 

더 나아가서 변수와 서블릿 메소드의 lifeCycle을 알아보자.

 

 

변수 같은 경우

1) 인스턴스 변수 즉 전역변수

- 해당 변수이 경우에는 최초 실행 후 여러사용자에게 사용가능하다. 즉 다른 메소드를 통해 값을 더 하거나 호출 할 수가 있다.

 

2) 지역변수

- 메소드 안의 지역 변수 일 경우에는 최초 실행 후 여러번 새로고침 즉 호출이 된다 하더라도 관련 메소드에 대한 쓰레드 수만 추가 될 뿐 변수 안의 값이 더해지거나 수정되지는 않는다.

package com.controller;

import java.io.IOException;
import java.util.ArrayList;

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;

/**
 * Servlet implementation class TestServlet
 */
@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {
	//private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
    
    public TestServlet() {
        super();
        // TODO Auto-generated constructor stub
    } */

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	
	// 인스턴스 변수 ==> 단 한번만 생성된다. 여러사용자에게 공유 가능
	int num;
	ArrayList<String> list = new ArrayList<String>();
	
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		
		// 로컬 변수, 여러 사용자에게 공유 불가
		System.out.println("doGet");
		
		int size=10;
		
		list.add("홍길동");
		num++;
		
		//list는 누적됌
		for(String str: list) {
			System.out.println(str);
		}
	
		System.out.println(num);// 누적됌
		System.out.println(size); //누적 안됌
		
	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("destory");
	}

	@Override
	public void init(ServletConfig config) throws ServletException {
		// TODO Auto-generated method stub
		// 처음 한번만 호출한다.
		System.out.println("init");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}*/

}

 

 

이제 HttpServlet의 LifeCycle을 알아보자면

 

1) init 클래스

- 초기화 클래스로 웹 컨테이너에 의해서 처음 서블릿 인스턴스가 생성될 때 단 한번 호출된다.

 

2) service 메서드

- 클라이언트가 요청할 때마다 호출 된다. 클라이언트가 원하는 동적인 처리 작업 시 필요한데 보통 doGet 또는 doPost 메서드를 이용한다. 

 

3) destory 메소드

- 서블릿 인스턴스가 웹 컨테이너에서 제거 될 때 호출 된다. 따라서 init 메서드에서 구현했던 초기화 작업을 반납 처리 작업 시에 사용된다.

 

끝.

 

 

 

 

반응형

댓글