5장 서블릿 이해하기
1. 서블릿이란
- 서블릿 : 서버 쪽에서 실행되면서 클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바 클래스를 의미함.
(서블릿은 동적인 웹 페이지를 생성하기 위해 Java 코드를 사용하여 HTML을 생성하거나, 다른 서버 컴포넌트와 상호작용하여 데이터를 처리하고 결과를 반환할 수 있습니다. 이렇게 생성된 HTML은 서블릿을 통해 클라이언트에게 전달되어 웹 페이지로 표시됨)
- 동작 과정 : 웹 애플리케이션 서버(WAS)이 서블릿을 호출해서 요청을 수행한다음 결과를 WAS에 보냄.
- 특징 : 스레드 방식으로 실행됨. (일단 메모리에 로드해야 함) -> 한 클라이언트에서 init한 번 해서 메모리에 로드되면 이 생성된 객체에 접근해서 메서드 호출함. 따라서 새롭게 init 안 함.(같은 서블릿에 대해서)
2. 서블릿 API 계층 구조와 기능
- 서블릿 클래스 계층 구조 : GenericServlet 추상 클래스는 Servlet과 ServletConfig 인터페이스를 상속받고, 이 GenericServlet을 상속받는게 HttpServlet임. 이때 GenericServlet은 인터페이스의 기능을 구현함.
- 서블릿 API 구성 요소 특징
Servlet) javax.servlet 패키지에 선언되어 있음. init(), service(), destroy(), getServletInfo(), getServletConfig() 선언함.
ServletConfig) javax.servlet 패키지에 선언되어 있음. getInitParameter(), getInitParameterNames(), getServletContext(), getServletName() 선언함.
GenericServlet) javax.servlet 패키지에 선언되어 있음. 인터페이스를 구현함. GenericServlet을 상속받아 구현한 사용자 서블릿은 사용되는 프로토콜에 따라 각각 service()를 오버라이딩해서 구현해야함.
HttpServlet) javax.servlet.http 패키지에 선언되어 있음. GenericServlet을 상속받아 HTTP 프로토콜을 사용하는 웹 브라우저에서 서블릿 기능을 수행함. 따라서 웹 브라우저 기반 서비스를 제공하는 서블릿을 만들 때는 이 클래스를 상속받으면 됨. 요청 시 service()가 호출되면서 요청 방식에 따라 doGet()이나 doPost()가 차례대로 호출됨.
-HttpServlet 클래스의 작동 방식 : 클라이언트 요청 -> public service() 호출 -> protected service() 호출 -> doXXX() 호출
(실질적으로 서블릿이 XXX request를 수행하기 위해 service()를 통해서 doXXX() 호출됨)
(XXX에는 delete, get, head, post가 존재함)
(즉, public servie()가 클라이언트의 요청을 protected service()로 보냄)
3. 서블릿 생명주기 메서드 :
-init()) 서블릿 요청 시 맨 처음 한 번만 호출됨.
-doGet(), doPost()) 서블릿 요청 시 매번 호출됨. 클라이언트가 요청하는 작업을 실질적으로 수행함.
-destroy()) 서블릿이 기능을 수행하고 메모리에서 소멸될 때 호출됨.
(init()과 destroy()는 생략가능하나 doXXX() 메서드는 반드시 구현해야함)
- 서블릿 생성 과정 :
1)사용자 정의 서블릿 클래스 만들기 - HttpServlet 클래스를 상속받아야함. 이때 java resource의 src에서 만들어야함.
(톰캣의 servlet-api.jar 클래스 패스 설정해야함-서블릿 API는 톰캣의 servlet-api.jar 라이브러리로 제공되므로 | Dynamic web project 생성 후 해당 프로젝트를 우 클릭 후 Build path 선택후 configure build path 클릭 후 classpath -> add external jar 누르고 lib에 servlet-api.jar 선택함 classpath를 설정하는 이유는 관련 클래스를 import하기 위해서)
2)서블릿 생명주기 메서드 구현 - init()과 destroy()는 public, doXXX은 protected임.
3)서블릿 매핑 작업 - http://주소:포트번호/프로젝트명/패키지명이 포함된 클래스명 | 서블릿 클래스에 대응하는 서블릿 매핑이름으로 요청함. => web.xml에서 설정함. <servlet> 태그 먼저 모두 정의하고 <servlet-mapping> 태그 모두 정의함.
servlet-name태그로 설정해서 같은 것끼리 매핑이됨. url-pattern이 매핑 이름임.
(클래스 이름이 길어지면 불편하고 보안에도 안 좋음)
4)웹 브라우저에서 서블릿 매핑이름으로 요청
6. 애너테이션을 이용한 서블릿 매핑
- 애너테이션을 사용하여 서블릿을 설정하면 가독성이 좋아짐.
- @WebServlet("/서블릿매핑이름")와 같이 선언하면 됨.
- 이클립스 패키지에서 클래스 대신 Servlet으로 바로 생성할 수 있고 매핑이름을 바로 설정할 수 있음.
- 애너테이션 설정한 것은 web.xml에 없음. 따라서 web.xml에 있는 것과 같은 것으로 설정하는 실수 안해야 함.
7. 이클립스로 기존 프로젝트 import
- File -> Import -> General -> Existing Projects into Workspace 순으로 진행하면 됨.