Presentation is loading. Please wait.

Presentation is loading. Please wait.

4 서블릿의 라이프 사이클.

Similar presentations


Presentation on theme: "4 서블릿의 라이프 사이클."— Presentation transcript:

1 4 서블릿의 라이프 사이클

2 학습 목표 서블릿 클래스로부터 서블릿 객체가 만들어지고, 서블릿 객체가 초기화 되어서 서블릿이 되고, 서블릿이 사용되고, 최종적으로 소멸되기까지의 전 과정을 서블릿의 라이프 사이클이라고 한다. 이 장에서는 서브릿의 라 이프 사이클에 관련된 프로그래밍 기술을 배워보자. 내 용 서블릿의 라이프 사이클 서블릿 클래스의 init 메서드의 destroy 메서드 서블릿 설정 정보를 갖는 ServletConfig 객체 서블릿의 환경을 표현하는 ServletContext 객체

3 1. 서블릿의 라이프 사이클 (1) 웹 브라우저에서 호출되면 서블릿 클래스로부터 서블릿 객체가 만들어지고, 그 객체가 웹 컨테이너에 의해 초기화된 다음에 호출된다. 웹 브라우저의 요청을 처리할 수 있는 상태의 서블릿 객체를 서블릿이라고 함. [그림 6-1] 서블릿의 라이프 사이클

4 1. 서블릿의 라이프 사이클 (2) 서블릿 실행 과정 (1)

5 1. 서블릿의 라이프 사이클 (3) 서블릿 실행 과정 (2)

6 1. 서블릿의 라이프 사이클 (4) 서블릿 실행 과정 (3)

7 1. 서블릿의 라이프 사이클 (5) 서블릿 라이프 사이클(Life Cycle) (1) 서블릿 일생에 대해 궁금한 점?
서블릿 클래스는 언제 로딩되는가? 서블릿의 생성자는 언제 호출되는가? 서블릿은 얼마나 오랫동안 살아 있는가? 서블릿은 자원을 언제 초기화하는가? 서블릿은 사용한 자원을 언제 깨끗하게 청소하는가?

8 1. 서블릿의 라이프 사이클 (6) 서블릿 라이프 사이클 (2)

9 1. 서블릿의 라이프 사이클 (7) 서블릿 라이프 사이클 (3) – 관련 메소드

10 1. 서블릿의 라이프 사이클 (8) 서블릿 라이프 사이클 (3) – 관련 메소드

11 1. 서블릿의 라이프 사이클 (9) 서블릿 라이프 사이클 (4) – 4번의 중요한 순간들 init() 호출
컨테이너 에서 서블릿 객체를 생성한 다음에 호출한다. service() 이전에 실행 서블릿 객체를 초기화 초기화할 내용(DB 접속 등)이 있는 경우 재정의 service() 호출 클라이언트의 요청 후 컨테이너에서 쓰레드를 이용하여 호출 요청의 HTTP 메소드(GET, POST등)를 참조하여 해당 메소드(doGet(), doPost() 등) 호출 판단 거의 재정의 하지 않음

12 1. 서블릿의 라이프 사이클 (10) 서블릿 라이프 사이클 (4) – 4번의 중요한 순간들
doGet() / doPost() 호출 service() 메소드에서 HTTP 메소드(GET, POST)를 참조하여 호출 비즈니스 로직을 구현 또는 호출 두 메소드 중 하나는 반드시 재정의하여 구현해야 한다. destroy() 호출 컨테이너 에서 서블릿 객체를 제거할 때에 호출한다. 거의 웹 애플리케이션을 종료할 때. 서블릿 객체 초기화 및 실행 도중에 할당한 자원을 제거 init() 메소드를 재정의하였거나 제거할 자원이 있는 경우 재정의

13 스레드에 의해 동일한 작업이 중복 수행되는 경우?
1. 서블릿의 라이프 사이클 (11) 서블릿 라이프 사이클 (5) – 클라이언트 요청 실행 클라이언트의 요청은 서로 다른 다른 스레드에서 실행 스레드에 의해 동일한 작업이 중복 수행되는 경우?

14 2. 서블릿 초기화 & 종료 (1) 서블릿 로딩 & 초기화 컨테이너 시작 시 배포된 웹 애플리케이션 및 서블 릿을 확인
로딩 : 컨테이너 시작 시 로딩 또는 최초 클라이언 트 요청 시 로딩 초기화 : 서블릿 로딩 후에 init()를 호출하여 서블 릿을 초기화 함. service() 메소드는 서블릿 초기화 완료 후에 실행 가능함.

15 2. 서블릿 초기화 & 종료 (2) 서블릿 초기화 객체가 서블릿이 되는 순간
서블릿 객체는 초기화 과정을 통해 컨테이너로 부터 서블릿 자격을 부여받음

16 [그림 6-2] 서블릿 클래스의 init 메서드와 destroy 메서드
2. 서블릿 초기화 & 종료 (3) init() / destroy() 메소드 재정의 서블릿 일생에서 한번만 실행되어야 할 코드는 서블릿 클래스 안에 init() 메서드와 destroy() 메서드를 선언하고 그 안에 써 놓으면 된다. public class SomeServlet extends HttpServlet { public void init() throws ServletException { } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { out.println( “<HTML> ”); out.println( “<HEAD><TITLE>Hello</TITLE></HEAD> ”); out.println( “<BODY>Hello, Everyone.</BODY> ”); out.println( “</HTML> ”); public void destroy() { 서블릿이 초기화될 때 해야 할 일을 기술하는 부분 서블릿이 제거되기 전에 해야 할 일을 기술하는 부분 [그림 6-2] 서블릿 클래스의 init 메서드와 destroy 메서드

17 2. 서블릿 초기화 & 종료 (4) init() 메서드의 작성 방법
파라미터가 없는 메서드로 선언해야 하고, 리턴 타입은 void로 지정해야 하며, public 메서드로 선언해야 한다. javax.servlet.ServletException 타입 예외를 던질 수 있으며, 필요치 않으면 생략 가능 위의 점선으로 표시된 부분에 서블릿 클래스의 초기화 작업 중에 실행해야 할 코드를 작성 public void init() throws ServletException { } 우리가 작성할 코드가 들어가는 부분

18 2. 서블릿 초기화 & 종료 (5) init() 메서드 호출
컨테이너는 서블릿 클래스를 로딩한 후에 서블릿 클래스의 init(ServletConfig config) 메소드를 호출하여 초기화한다. init(ServletConfig config) 메소드에서 init() 메소드를 호출한다.

19 2. 서블릿 초기화 & 종료 (6) init() 메서드의 재작성 예 (1)
[예제6-1] 피보나치 수열을 출력하는 서블릿 클래스 import javax.servlet.http.*; import javax.servlet.*; import java.io.*; import java.math.BigInteger; public class FibonacciServlet extends HttpServlet { private BigInteger arr[]; public void init() { arr = new BigInteger[100]; arr[0] = new BigInteger( “1 ”); arr[1] = new BigInteger( “1 ”); for (int cnt = 2; cnt < arr.length; cnt++) arr[cnt] = arr[cnt-2].add(arr[cnt-1]); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String str = request.getParameter( “NUM ”); int num = Integer.parseInt(str); if (num > 100) num = 100; response.setContentType( “text/html;charset=euc-kr ”); PrintWriter out = response.getWriter(); out.println( “<HTML> ”); out.println( “<HEAD><TITLE>피보나치 수열</TITLE></HEAD> ”); for (int cnt = 0; cnt < num; cnt++) out.println(arr[cnt] + “ ”); out.println( “</BODY> ”); out.println( “</HTML> ”);

20 2. 서블릿 초기화 & 종료 (7) init() 메서드의 재작성 예 (2)
톰캣의 webapps 디렉터리 아래에 웹 애플리케이션 디렉터리를 만들고, 서블릿 클래 스를 컴파일한 결과를 설치하고 등록한다. ② WEB-INF/classes 서브디렉터리에 [예제 6-1] 의 컴파일 결과를 저장하세요 ③ WEB-INF 서브디렉터리에 다음과 같은 web.xml 파일을 만들어서 저장하세요 ① 톰캣의 webapps 디렉터리 아래에 brain06/WEB-INF/classes 서브디렉터리를 만드세요

21 [그림 6-6] 웹 컨테이너가 시작될 때 서블릿이 초기화되도록 만드는 엘리먼트
2. 서블릿 초기화 & 종료 (8) init() 메서드의 재작성 예 (3) [예제 6-1]을 호출하면서 출력할 항의 수를 URL 뒤에 쓰세요. [그림 6-5] 예제 6-1의 실행 결과 웹 컨테이너가 시작될 때 서블릿이 초기화되도록 만드는 엘리먼트 [그림 6-6] 웹 컨테이너가 시작될 때 서블릿이 초기화되도록 만드는 엘리먼트

22 2. 서블릿 초기화 & 종료 (9) destroy() 메서드의 작성 방법
destroy 메서드의 작성 방법은 init 메서드와 비슷함 파라미터가 없어야 하고, 리턴 타입은 void여야 하고, public 메서드로 선언해야 한 다. 하지만 init 메서드와 달리 throws 절을 쓸 수 없다. public void destroy() { } 우리가 작성할 코드가 들어가는 부분

23 [그림 6-7] 인사말을 출력하는 웹 애플리케이션의 화면 설계
2. 서블릿 초기화 & 종료 (10) destroy() 메서드의 재작성 예 (1) 로그 파일 생성 및 로그 작성 [그림 6-7] 인사말을 출력하는 웹 애플리케이션의 화면 설계 [그림 6-7]의 왼쪽 화면의 URL [그림 6-7]의 오른쪽 화면의 URL

24 2. 서블릿 초기화 & 종료 (11) destroy() 메서드의 재작성 예 (2) [예제6-2] 이름을 입력받는 HTML 문서
<HEAD> <META http-equiv= “Content-Type ” content= “text/html;charset=euc-kr ”> <TITLE>이름 입력</TITLE> </HEAD> <BODY> <H3>이름을 입력하십시오.</H3> <FORM ACTION=greeting> 이름: <INPUT TYPE=TEXT NAME=NAME> <INPUT TYPE=SUBMIT VALUE= ‘확인 ’> </FORM> </BODY> </HTML>

25 2. 서블릿 초기화 & 종료 (12) destroy() 메서드의 재작성 예 (3)
[예제6-3] 인사말을 출력하는 서블릿 클래스 import javax.servlet.http.*; import javax.servlet.*; import java.io.*; import java.util.*; public class GreetingServlet extends HttpServlet { private PrintWriter logFile; public void init() throws ServletException { try { logFile = new PrintWriter(new FileWriter(“c:\\data\\log.txt ”, true)); } catch (IOException e) { throw new ServletException(e); public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { String name = request.getParameter( “NAME ”); String greeting = “안녕하세요, ” + name + “님. ”; if (logFile != null) { GregorianCalendar now = new GregorianCalendar(); logFile.printf( “%TF %TT - %s %n ”, now, now, name); response.setContentType( “text/html;charset=euc-kr ”); PrintWriter out = response.getWriter(); out.println( “<HEAD><TITLE>인사하기</TITLE></HEAD> ”); out.println( “<BODY> ”); out.println(greeting); out.println( “</BODY> ”); out.println( “</HTML> ”); } public void destroy() { if (logFile != null) logFile.close();

26 2. 서블릿 초기화 & 종료 (13) destroy() 메서드의 재작성 예 (4) ② [예제 6-3] 의 컴파일 결과를
classes 디렉터리에 저장하세요. ③ web.xml 파일을 열어서 다음과 같은 두 엘리먼트를 추가하세요 ① brain06 웹 애플리케이션 디렉터리의 WEB-INF 서브디렉터리로 가세요.

27 [그림 6-10] 예제 6-3이 만든 로그 파일의 내용 확인하기
2. 서블릿 초기화 & 종료 (14) destroy() 메서드의 재작성 예 (5) [그림 6-10] 예제 6-3이 만든 로그 파일의 내용 확인하기 출력 메시지

28 3. 클라이언트 요청 실행 (1) service() 메소드 실행 (1) 컨테이너의 클라이언트 요청 실행 과정
HttpServletRequest & HttpServletResponse 객체 생성 새로운 스레드 생성 또는 스레드 풀에서 가져오기 스레드에서 service(request, response)를 호출 & 실행 service(request, response) 반환 후에 스레드 제거 HttpServletRequest & HttpServletResponse 객체 제거

29 3. 클라이언트 요청 실행 (2) service() 메소드 실행 (2)
service() 메소드는 매개변수 HttpServletRequest 객체에서 HTTP 요청 메소드 유 형을 읽어와 그에 대응하는 서블릿 메소드를 호출하여 요청을 처리한다. HTTP 요청 메소드 GET  doGet() 메소드 호출 HTTP 요청 메소드 POST  doPost() 메소드 호출 그 외 HTTP 요청 메소드 HEAD TRACE PUT DELETE OPTION CONNECT

30 3. 클라이언트 요청 실행 (3) service() 메소드 재정의 doGet()/doPost() 메소드 재정의
클라이언트 요청은 doGet()/doPost() 메소드에서 처리하기 때문에 service() 메소드 는 거의 재정의할 필요가 없음. doGet()/doPost() 메소드 재정의 클라이언트 요청을 적절히 처리하여 응답을 반환하기 위해 반드시 재정의하여야 함. HttpServletRequest 객체와 HttpServletResponse 객체를 매개변수를 전달받아 이 를 사용하여 요청을 처리하기 때문에 이들 객체에 대한 이해가 필수적.

31 3. 클라이언트 요청 실행 (4) HttpServletRequest 인터페이스 (1)
HttpServletRequest 인터페이스 (1) 요청 유형, 쿠키, 세션 등 HTTP 요청에 대한 인 터페이스를 추상화한 것으로 HTTP 요청 접근 관 련 메소드 포함 HTTP 프로토콜에 관련된 메소드들이 추가 되어 있음

32 3. 클라이언트 요청 실행 (5) HttpServletRequest 인터페이스 (2)
HTTP 요청 메시지 정보를 접근하는 인터페이스 제공 HTTP 요청 메소드 : GET & POST

33 3. 클라이언트 요청 실행 (6) HttpServletRequest 인터페이스 (3)
HTTP 요청 메소드 : GET & POST

34 3. 클라이언트 요청 실행 (7) HttpServletRequest 인터페이스 (4) GET & POST 요청 메소드 차이
데이터의 형식 및 크기 보안 즐겨찾기 등록 사용 용도 멱등(Idempotent) 여부

35 3. 클라이언트 요청 실행 (8) HttpServletRequest 인터페이스 (5)
멱등(Idempotent) : 아무 부작용 없이 동일한 작업을 한번 이상 계속 할 수 있다는 것 을 의미

36 3. 클라이언트 요청 실행 (9) HttpServletRequest 인터페이스 (6) 멱등이 아닌 요청 예:

37 3. 클라이언트 요청 실행 (10) HttpServletRequest 인터페이스 (7) 멱등이 아닌 요청 예:

38 3. 클라이언트 요청 실행 (11) HttpServletRequest 인터페이스 (8) 멱등이 아닌 요청 예:

39 3. 클라이언트 요청 실행 (12) HttpServletRequest 인터페이스 (9)
멱등인 요청 : GET, HEAD / 멱등이 아닌 요청 : POST, DELETE GET 또는 POST 요청 메소드 요청 결정 방법 : <form >에 method 정의가 빠진 경우 GET으로 결정이 된다.

40 3. 클라이언트 요청 실행 (13) HttpServletRequest 인터페이스 (10) – 자주 사용하는 메소드
클라이언트 플랫폼 정보 및 브라우저 정보 String client = request.getHeader(“User-Agent”); Request에 관련된 쿠키 Cookie[] cookies = request.getCookies(); 클라이언트 세션 정보 HttpSession session = request.getSession(); Request의 HTTP 메소드 String theMethod = request.getMethod(); Request의 입력 스트림 InputStream input = request.getInputStream();

41 3. 클라이언트 요청 실행 (14) HttpServletRequest 인터페이스 (11) – 자주 사용하는 메소드
getInputStream()에 반환하는 입력 스트림은 언제 사용하는가? getHeader() & getIntHeader() 차이점? getRemotePort(), getServerPort(), getLocalPort() 차이점?

42 3. 클라이언트 요청 실행 (15) HttpServletResponse 인터페이스 (1)
HTTP 응답 메시지에 대한 인터페이스를 추상화  서블릿에서 클라이언트에 응답 데이터를 보내 기 위해 HttpServletResponse 객체를 사용 HTTP에 관련된 오류, 쿠키, 헤더 정보에 대한 메 소드들이 추가되어 있음

43 3. 클라이언트 요청 실행 (16) HttpServletResponse 인터페이스 (2) – 자주 사용하는 메소드
응답 데이터의 데이터 타입 정의 response.setContentType(“text/html”); 출력 스트림 사용 : 가급적 JSP 사용 권장 Writer writer = response.getWriter(); // 문자 출력 OutputStream output = response.getOutputStream(); // 바이트 출력 헤더 정보 설정, 쿠키 추가 등 response.addCookie(); response.addHeader();

44 3. 클라이언트 요청 실행 (17) HttpServletResponse 인터페이스 (3) Response 객체의 I/O 사용
동적 HTML 페이지 출력  소모적인 작업  JSP로 대체 이진 데이터(pdf, jar 등) 전송  바이트 출력 스트림을 이용하여 전송

45 3. 클라이언트 요청 실행 (18) HttpServletResponse 인터페이스 (4)
Response 객체의 I/O 사용 – 이진 데이터 전송 예

46 3. 클라이언트 요청 실행 (19) HttpServletResponse 인터페이스 (5)
Response 객체의 I/O 사용 – 이진 데이터 전송 예

47 3. 클라이언트 요청 실행 (20) HttpServletResponse 인터페이스 (6) 컨텐트 타입(MIME 타입) 설정
setContentType() 메소드– response.setContentType(“text/html”); 응답 메시지의 데이터 타입을 설정 HTTP 응답 메시지 헤더 중에 하나

48 3. 클라이언트 요청 실행 (21) HttpServletResponse 인터페이스 (7) 컨텐트 타입(MIME 타입) 종류
text/html application/pdf video/quicktime image/jpeg application/octet-stream application/x-zip

49 4. HTTP 요청 리다이렉터 & 디스패치 (1) HTTP 요청 리다이렉트 & 디스패치
클라이언트 요청을 받은 서블릿(또는 JSP)가 직접 처리하지 않고 클라이언트 요청을 다른 사이트 또는 다른 컴포넌트에 넘길 수 있다. HTTP 요청 리다이렉트(Redirect) (1) 클라이언트 요청에 대해 완전히 다른 URL로 방향을 바꾸어 처리하는 동작 서블릿 리다이렉트는 웹 브라우저가 처리 : if (workForMe) { // 요청을 처리 } else { response.sendRedirect(“ }

50 4. HTTP 요청 리다이렉터 & 디스패치 (2) HTTP 요청 리다이렉트(Redirect) (2)

51 4. HTTP 요청 리다이렉터 & 디스패치 (3) HTTP 요청 리다이렉트(Redirect) (3)

52 4. HTTP 요청 리다이렉터 & 디스패치 (4) HTTP 요청 리다이렉트(Redirect) (4) 주의할 사항 :
Response 객체에 쓰기 작업을 한 뒤에는 sendRedirect()를 할 수 없다 sendRedirect() 메소드는 매개변수롤 URL 객체가 아닌 String 객체를 받는다 sendRedirect(new URL( : error

53 4. HTTP 요청 리다이렉터 & 디스패치 (5) HTTP 요청 디스패치(Dispatch) (1)
클라이언트 요청을 웹 애플리케이션의 다른 컴포넌트(Servlet or JSP)에게 넘겨 처 리하도록 하는 동작  클라이언트 요청은 서버에서 처리됨.

54 4. HTTP 요청 리다이렉터 & 디스패치 (6) HTTP 요청 디스패치(Dispatch) (2)

55


Download ppt "4 서블릿의 라이프 사이클."

Similar presentations


Ads by Google