멀티캠퍼스 백엔드 과정38일차[7월 26일] - 서블릿 생명주기, printWriter

GoldenDusk·2023년 7월 30일
0

36일차는 취업 특강

자바 헤드퍼스트 원문 및 사이트

헤드 퍼스트 사이트

헤드 퍼스트 PDFiles.Net

서블릿

1. 서블릿이란?

서블릿

  • JSP가 나오기 전, 자바로 웹 애플리케이션을 개발할 수 있도록 만든 기술
  • 서버 단에서 클라이언트의 요청을 받아 처리한 후 응답하는 역할
  • 웹 자바 느낌

서블릿 특징

  • 클라이언트의 요청에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트
  • MVC 모델에서 컨트롤러(Controller) 역할
  • 모든 메서드는 스레드로 동작
  • javax.servlet.http 패키지의 HttpServlet 클래스를 상속받음

2. 서블릿 컨테이너

동작 구조

  1. 사용자가 서블릿에 대한 링크를 클릭한다.(HTTP 요청)
  2. 컨테이너는 들어온 요청이 서블릿이라는 것을 간파하곤 다음 두 객체를 생성한다.[HttpServletResponse, HttpServeltRequest]
  3. 사용자가 날린 URL을 분석하여 어떤 서블릿에 대한 요청인지 알아낸다. 여기서 DD를 참조하고 그 다음 서블릿 스레드를 생성하여 Request, Response 객체를 인자로 넘긴다.
  4. 컨테이너는 서블릿 service()메소드를 호출한다, 요청에 지정한 방식에 따라 doGet() 혹은 doPost()를 호출한다.
  5. doGet() 메소드는 동적인 페이지 생성 후 이를 Responce 객체에 실어 보낸다. 보내고 난 후 컨테이너는 Response객체에 대한 참조를 가지고 있다는 것을 잊지 말자.

서블릿 컨테이너

  • 웹브라우저 - 웹 서버 - 컨테이너(JAVA) : 서블릿
  • 컨테이너는 URL만 가지고 어떤 서블릿을 요청하는지 찾아낸다.
  • Request와 Response 객체를 생성하여 이에 대한 참조값을 서블릿 인자로 넘긴다.
  • 톰캣(Tomcat) 사용

    역할

    • 통신지원
    • 생명주기(라이프사이클)관리
    • 멀티스레딩 지원
    • 보안관리
    • JSP 지원

3. 서블릿의 동작 방식

동작방식

  • 추후 사진 부분을 spring으로 바꾸기

서블릿은 MVC 패턴에서 컨트롤러 역할

  • 클라이언트의 요청을 받음
  • 분석 후 요청을 처리할 서블릿을 탐색
  • 서블릿을 통해 비즈니스 서비스 로직을 호출
  • 모델(Model)로부터 그 결괏값을 받아음
  • request나 session 영역에 저장한 후 결괏값을 출력할 적절한 뷰(View) 선택
  • 최종적으로 선택된 뷰(jsp 페이지)에 결괏값을 출력한 후 요청한 클라이언트에 응답

4. 서블릿 작성 규칙

  1. 기본적으로 javax.servlet, javax.servlet.http, java.io 패키지를 임포트
  2. 서블릿 클래스는 반드시 public으로 선언해야 하고, HttpServlet을 상속받아야 함
  3. 사용자의 요청을 처리하기 위해 doGet( ) 메서드나 doPost( ) 메서드를 반드시 오버라이딩
  4. doGet( ) 또는 doPost( ) 메서드는 ServletException과 IOException 예외를 던지도록 (throws) 선언
  5. doGet( ) 또는 doPost( ) 메서드를 호출핛 때의 매개변수는 HttpServletRequest와
    HttpServletResponse를 사용

서블릿 클래스 예시

package 패키지명;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class 서블릿클래스명 extends HttpServlet { // HttpServlet 상속
 @Override // doGet() 오버라이딩
 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
 throws ServletException, IOException {
 // 메서드의 실행부
 }
}

5. 서블릿 작성

1) 서블릿 작성

  • 클라이언트의 요청을 전달한 “요청명” 결정

  • 서블릿은 요청명을 기준으로 이를 처리할 서블릿 선택

  • 요청명과 서블릿을 연결해주는 작업 매핑(mapping)

  • web.xml(DD)

  • @WebServelt 어노테이션을 사용하여 코드에 직접 명시

2) 동작구조 기반 해서 web에 등록해서 하는 예제

  • web.xml
<servlet>  <!-- 1. 서블릿 등록 자바 클래스 순서 중요 -->
    <servlet-name>HelloServlet</servlet-name>
    <servlet-class>servlet.HelloServlet</servlet-class>
  </servlet>
  <servlet-mapping>  <!-- 2. 서블릿과 요청명 매핑 jsp 파일-->
    <servlet-name>HelloServlet</servlet-name>
    <url-pattern>/12Servlet/HelloServlet11.so</url-pattern>
  </servlet-mapping>

  <servlet>  <!-- 서블릿 등록 -->
    <servlet-name>DirectServletPrint</servlet-name>
    <servlet-class>servlet.DirectServletPrint</servlet-class>
  </servlet>
  <servlet-mapping>  <!-- 서블릿과 요청명 매핑 -->
    <servlet-name>DirectServletPrint</servlet-name>
    <url-pattern>/13Servlet/DirectServletPrint.do</url-pattern>
  </servlet-mapping>
  • jsp 파일

 <%@ page language="java" contentType="text/html; charset=UTF-8"
     pageEncoding="UTF-8"%>
 <!DOCTYPE html>
 <html>
 <head>
 <meta charset="UTF-8">
 <title>HelloServlet</title>
 </head>
 <body>
 <h2>HelloServlet 1. web.xml에서 매핑한 후 JSP 출력하기</h2>
 <P>
 	<%= request.getAttribute("message") %>
 	<a href="./HelloServlet.so">바로가기</a>
 </P>
 </body>
 </html>
  • java 파일

```java
package servlet;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet{

	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		
		req.setAttribute("message", "Hello Servelt nice meet you!!");
		req.getRequestDispatcher("/12Servlet/HelloServlet.jsp").forward(req, resp);
	}

}
```

3) 어노테이션 이용

  • EL 이용해서 처음에는 아무것도 출력되지 않는다.

  • java 파일
    • req, res를 컨테이너가 전달해줌

  package servlet;
  
  import java.io.IOException;
  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("/12Servlet/AnnoMapping.do")
  public class AnnoMapping extends HttpServlet{
  
  	@Override
  	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  		req.setAttribute("message", "Hello AnnoMapping Servelt nice meet you!!");
  		req.getRequestDispatcher("/12Servlet/AnnoMapping.jsp").forward(req, resp);
  	}
  
  	
  }
  • jsp 파일

   <%@ page language="java" contentType="text/html; charset=UTF-8"
       pageEncoding="UTF-8"%>
   <!DOCTYPE html>
   <html>
   <head>
   <meta charset="UTF-8">
   <title>AnnoMapping</title>
   </head>
   <body>
   <h2>AnnoMapping</h2>
   <P>
   	${message}<br/>
   	<a href="<%= request.getContextPath() %>/12Servlet/AnnoMapping.do">바로가기</a>
   </P>
   </body>
   </html>

4) 한 번의 매핑으로 여러 가지 요청 처리

  • 한 번의 매핑으로 여러 가지 요청 처리
    • 서블릿에서 request 영역에 저장한 결괏값
    • 클라이언트가 요청한 전체 경로를 표시
    • 전체 경로에서 마지막의 xxx.one 부분을 추출한 문자열
    • 각 페이지로의 바로가기 링크
  • jsp 파일
    • FrontController.jsp
       <%@ page language="java" contentType="text/html; charset=UTF-8"
           pageEncoding="UTF-8"%>
       <!DOCTYPE html>
       <html>
       <head>
       <meta charset="UTF-8">
       <title>FrontController</title>
       </head>
       <body>
       <h2>FrontController : 한 번의 매핑으로 여러 가지 요청을 처리하기</h2>
       ${resultValue } <!-- 서블릿에서 request 영역에 저장할 결과값 -->
       <ol>
       <li>URI : ${uri}</li> <!-- 클라이언트가 요청한 전체경로를 표시 -->
       <li>요청명 : ${commandStr}</li> <!-- 사용자가 요청 -->
       </ol>
       
       <ul>
       <li><a href="../12Servlet/regist.one">회원가입</a></li>
       <li><a href="../12Servlet/login.one">로그인</a></li>
       <li><a href="../12Servlet/board.one">게시판</a></li>
       </ul>
       
       </body>
       </html>
      
  • java 파일
    • req.getRequestDispatcher("/12Servlet/FrontController.jsp").forward(req, resp);
      • 이게 있는 이유는 요청을 jsp 페이지로 전달해야 해서 사용

 package servlet;
 
 import java.io.IOException;
 
 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("*.one")
 public class FrontController extends HttpServlet{
 
 	@Override
 	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
 		
 		String uri = req.getRequestURI(); //12Servlet/regist.on
 		int lastSlash = uri.lastIndexOf("/"); //
 		String commandStr = uri.substring(lastSlash); // regist.one
 		
 		if(commandStr.equals("/regist.one"))
 			registFunc(req);
 		else if(commandStr.equals("/login.one"))
 			loginFunc(req);
 		else if(commandStr.equals("/board.one"))
 			boardFunc(req);
 		
 		req.setAttribute("uri", uri);
 		req.setAttribute("commandStr", commandStr);
 		req.getRequestDispatcher("/12Servlet/FrontController.jsp").forward(req, resp);
 		
 	}
 	
 	void registFunc(HttpServletRequest req) {
 		req.setAttribute("resultValue", "<h3>회원가입</h3>");
 	}
 	
 	void loginFunc(HttpServletRequest req) {
 		req.setAttribute("resultValue", "<h3>로그인</h3>");
 	}
 	
 	void boardFunc(HttpServletRequest req) {
 		req.setAttribute("resultValue", "<h3>게시판</h3>");
 	}
 
 }

5) JSP 없이 서블릿에서 바로 응답 출력

  • jsp 파일
    • DirectServletPrint.jsp

      <%@ page language="java" contentType="text/html; charset=UTF-8"
          pageEncoding="UTF-8"%>
      <!DOCTYPE html>
      <html>
      <head>
      <meta charset="UTF-8">
      <title>DirectServletPrint</title>
      </head>
      <body>
      <h2>DirectServletPrint web.xml에 매핑 후 Servlet에서 직접 출력</h2>
      <form method="post" action="../12Servlet/DirectServletPrint.do">
      <input type="submit" value="바로가기">
      </form>
      </body>
      </html>
  • java 파일
    • DirectServletPrint.java

      package servlet;
      
      import java.io.IOException;
      import java.io.PrintWriter;
      
      import javax.servlet.ServletException;
      import javax.servlet.http.HttpServlet;
      import javax.servlet.http.HttpServletRequest;
      import javax.servlet.http.HttpServletResponse;
      
      // 클래스를 http 서블릿 방식으로 변경 
      public class DirectServletPrint extends HttpServlet{
      
      	@Override
      	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      		//응답, 
      		resp.setContentType("text/html;charset=UTF-8");
      		//쓰기 기능
      		PrintWriter writer = resp.getWriterre();
      		//비동기 방식으로 통신할때 XML 이나 JSON방식을 처리할때(순수 데이터만 출력할때)
      		writer.println("<html>");
      		writer.println("<head><title>Insert title here</title></head>");
      		writer.println("<body>");
      		writer.println("<h2>서블릿에서 직접출력</h2>");
      		writer.println("<p>jsp로 포워딩 하지 않습니다.</p>");
      		writer.println("</body>");
      		writer.println("</html>");
      		writer.close();
      	}
      	
      }

6. 퀴즈

📌 01. Get방식의 HTTP 요청을 처리하기 위한 서블릿의 멤버 함수 이름은 무엇인가요?
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{}

📌 02. 쿼리 스트링에서 이름이 name인 파라미터 값을 추출하기 위한 HttpServeltRequest 클래스의 멤버 함수 이름은 뭔가요?
request.getParameter("name")

📌 03. 체크박스 형태의 HTML 페이지로부터 전달되는 입력 값을 추출하기 위해 가장 적절하기 이용될 수 있는 HttpServletRequest 클래스의 멤버 함수 이름은 무엇인가요?
reqeust.getParameterValues()

📌 04. 다음은 사용자로부터 좋아하는 색깔을 받기 위한 color.html입니다. 다음 코드를 실행시켰을 때, 사용자가 입력한 값이 ‘Green’이라면, ‘Favorite Color:Green’이 출력되도록 ColorServlet 코드를 작성해주세요

  • html 파일

   <!DOCTYPE html>
   <html>
   <head>
   <meta charset="UTF-8">
   <title>Favorite Color</title>
   </head>
   <body>
       <form action="ColorServlet">
           What is your favorite color? <br />
           <input type="text" name="select" placeholder="Red, green, or blue?">
           <br/> <br/>
           <input type="submit" value="OK">
       </form>
   
   </body>
   </html>
  • java 파일

📌 여기에는 req.getRequestDispatcher("/12Servlet/FrontController.jsp").forward(req, resp); 안쓰는 이유는 PrintWriter out = resp.getWriter(); : 이 서블릿은 프론트 컨트롤러 패턴과 달리 직접 HTML 응답을 생성하여 보냄

  package servlet;
  
  import java.io.IOException;
  import java.io.PrintWriter;
  
  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("/Hello/ColorServlet")
  public class ColorServlet  extends HttpServlet{
  
  	@Override
  	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
  		  resp.setContentType("text/html;charset=UTF-8");
  		  PrintWriter writer = resp.getWriter();
  		  
  		 String color = req.getParameter("select");
  		 
  		 String result = "<html><h2>Favorite Color :  " + color + "</h2></html>";
  		 resp.getWriter().print(result);
  		
  
  }
  }
  

📌 05.

  • html 파일

  <!DOCTYPE html>
  <html>
  <head>
  <meta charset="UTF-8">
  <title>05</title>
  </head>
  <body>
  <form action="CityServlet" method="get">
  <input type="checkbox" name="city" value="seoul" checked>Seoul<br>
  <input type="checkbox" name="city" value="busan" checked>Busan<br>
  <input type="checkbox" name="city" value="incheon">Incheon<br>
  <input type="submit" value="Ok">
  </form>
  </body>
  </html>
  • java 파일

    package servlet;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    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("/Hello/CityServlet")
    public class CityServelt extends HttpServlet{
    
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    	    String[] usel = request.getParameterValues("city");
    	    String res = "<html>";
    			 
    	    
    	    for(String str : usel) {
    	    	res += "<h3>Selected city: " + str + "</h3>";
    	    }
    	    
    	    res += "</html>";
    	    response.getWriter().print(res);
    	}
    	}

    📌 06.

  • html 파일

       <!DOCTYPE html>
       <html>
       <head>
       <meta charset="UTF-8">
       <title>Insert title here</title>
       </head>
       
       <body>
       <form method="get"  action="SignupServlet">
       <table align=center>
       <tr><td colspan=2 align=center height=40><b>로그인</b><td></tr>
       <tr>
       <td align=right>아이디&nbsp;</td>
       <td><input type="text" name="id" placeholder="Email address" required></td>
       </tr>
       <tr>
       <td align=right>패스워드&nbsp;</td>
       <td><input type="password" name="ps" required></td>
       </tr>
       <tr>
       <td align=right>패스워드 확인&nbsp;</td>
       <td><input type="password" name="ps2" required></td>
       </tr>
       <tr>
       <td align=right>이름&nbsp;</td>
       <td><input type="text" name="name" placeholder="name" required></td>
       </tr>
       <tr>
       <td colspan=2 align=center height=50>
       <input type="submit" value="회원가입하기">
       </td>
       </tr>
       </table>
       </form>
       
       </body>
       </html>
  • java 파일

    package servlet;
    
    import java.io.IOException;
    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("/Hello/SignupServlet")
    public class SignupServlet extends HttpServlet{
    	
    	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		req.setCharacterEncoding("UTF-8");
    		resp.setContentType("text/html;charset=UTF-8");	
    		String res = "<html>";
    		res += "<h3>User ID: " + req.getParameter("id") + "</h3>";
    	    res += "<h3>Password: " + req.getParameter("ps") + "</h3>";
    	    res += "<h3>Name: " + req.getParameter("name") + "</h3>";
    	    res += "</html>";
    	    resp.getWriter().print(res);
    	}
    }

서블릿 만들기

  1. 오른쪽 마우스 클릭하면 서블릿을 만들 수 있음

  1. 꼭 체크 해 줄 것!

  1. 예제

       package ex;
       
       import java.io.IOException;
       import java.io.PrintWriter;
       
       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 HelloWorld
        */
       @WebServlet(description="My first Servlet", urlPatterns = {"/hello"} )
       //@WebServlet("/hello")
       // 현재 클래스가 서브클래스인 것을 컨테이너에 알리기 위해서 @WebServlet 에너테이션 사용
       // 어떤 요청에 의해 서블릿을 호출할 것인지 결정하는 url-mapping 부분이 urlPattern ()
       public class HelloWorld extends HttpServlet {
       	private static final long serialVersionUID = 1L;
              
           /**
            * @see HttpServlet#HttpServlet()
            */
           public HelloWorld() {
               super();
               // TODO Auto-generated constructor stub
           }
       
       	/**
       	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
       	 */
       	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
       		response.setContentType("text/html;charset=UTF-8");
       		PrintWriter out = response.getWriter();
       		
               out.append("<!DOCTYPE html><html><head><meta charset=\"UTF-8\"><title>HelloWorld</title></head><body>")
               .append("<h2>HelloWorld!</h2><hr>")
               .append("현재 날짜와 시간은: " +java.time.LocalDateTime.now())
               .append("</body></html>");
               
       	}
       	/**
       	 * @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);
       	}
       
       }

    서블릿 수명주기 메서드

  • @PostConstruct
    • 객체 생성 직후, init( ) 메서드를 호출하기 전에 호출
    • 애너테이션을 사용하므로 메서드명은 개발자가 정하면 됨
  • init()
    • 서블릿의 초기화 작업을 수행하기 위해 호출
    • 최초 요청 시 딱 한 번만 호출
  • service()
    • 클라이언트의 요청을 처리하기 위해 호출
    • 전송 방식이 get이면 doGet( ) 메서드를, post면 doPost( ) 메서드를 호출
    • 따라서 service( ) 메서드는 두 가지 전송 방식 모두를 처리할 수 있음
  • destroy()
    • 서블릿이 새롭게 컴파일되거나, 서버가 종료될 때 호출
  • @PreDestroy
    • destroy( ) 메서드가 실행되고 난 후, 컨테이너가 이 서블릿 객체를 제거하는 과정에서 호출
    • @PostConstruct와 동일하게 메서드명은 개발자가 정하면 됨

    예제

  • jsp 파일
    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="UTF-8">
    <title>서블릿 LifeCycle</title>
    </head>
    <body>
    <script type="text/javascript">
    function requestAction(frm, met){
    	if(met == 1){
    		frm.method = 'get';
    	}
    	else{
    		frm.method='post';
    	}
    	frm.submit();
    }
    </script>
    <h2>서블릿 LifeCycle</h2>
    <form action="./LifeCycle.so">
    <input type="button" value="Get방식 요청" onclick="requestAction(this.form, 1);" />
    <input type="button" value="Post방식 요청" onclick="requestAction(this.form, 2);" />
    
    </form>
    </body>
    </html>
  • java 파일
    package servlet;
    
    import java.io.IOException;
    
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    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 LifeCycle
     */
    @WebServlet({ "/LifeCycle", "/12Servlet/LifeCycle.so" })
    public class LifeCycle extends HttpServlet {
    	private static final long serialVersionUID = 1L;
           
        /**
         * @return 
         * @see HttpServlet#HttpServlet()
         */
    	@PostConstruct
        public void myPostConstruct() {
            System.out.println("myPostConstruct()호출");
        }
    
    	@Override
    	public void init(ServletConfig config) throws ServletException {
    		System.out.println("init() 호출 : 난 서블릿이 서브스 되기 전 초기화 셋팅");
    	}
    	
    	@Override
    	protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    		System.out.println("service메소드 호출");
    		super.service(req, resp);
    	}
    	
    	public LifeCycle() {
    		super();
    	}
    
    	/**
    	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		System.out.println("doGet() 호출");
    		request.getRequestDispatcher("/12Servlet/LifeCycle.jsp").forward(request, response);
    	}
    
    	/**
    	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
    	 */
    	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    		System.out.println("doPost() 호출");
    		request.getRequestDispatcher("/12Servlet/LifeCycle.jsp").forward(request, response);
    	}
    
    	@Override
    	public void destroy() {
    		System.out.println("destory()메소드 호출");
    		super.destroy();
    	}
    	
    	@PreDestroy
    	public void myPreDestory() {
    		System.out.println("myPreDestory() 실행");
    	}
    	
    }

회고

오늘은 서블릿의 수명주기와 서블릿 개념에 대해 학습함 writer을 처음에는 이해 못했으나.. 퀴즈때 쓰고 이해하기 시작... 근데 공부 방식을 바꿔야 겠다는 생각을 요즘한다.. 어떻게 공부해야 좀 더 효율적으로 공부할 수 있을까 고민이다..

profile
내 지식을 기록하여, 다른 사람들과 공유하여 함께 발전하는 사람이 되고 싶다. gitbook에도 정리중 ~

0개의 댓글