bdfgdfg

서블릿(Servlet) 기초 본문

웹프로그래밍/JSP_Servlet

서블릿(Servlet) 기초

marmelo12 2023. 8. 7. 15:03
반응형

동적인 웹페이지를 구현하는 방법은 앞서 JSP라고 헀지만 앞서 나온 방식이 서블릿이다.

 -> 계속해서 쓰이고 있는 방식임. JSP는 서브릸의 문제를 보완하여 나온것.

 

서블릿이란?

서블릿은 서버쪽에서 실행되어 클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바 클래스.

 -> 서블릿은 독자적인 실행은 불가능하고 톰캣과 같은 JSP/Servlet 컨테이너에서 실행된다.

https://doozi316.github.io/%EC%B1%85%20%EC%9A%94%EC%95%BD/2020/10/20/BOOK2/

서블릿은 다음과 같은 특징이 있다.

 - 서버쪽에서 실행되며 기능을 수행

 - 스레드 방식으로 실행된다.

 - 컨테이너에서 실행됨.

 

서블릿의 계층구조는 다음과 같다.

 

https://doozi316.github.io/%EC%B1%85%20%EC%9A%94%EC%95%BD/2020/10/20/BOOK2/

 

HttpServlet클래스는 요청이 들어올 시 service 메소드가 호출되면서 요청 방식에 따라 doGet이나 doPost등이 차례대로 호출된다.

protected doDelete(HttpServletRequest req, HttpServletResponse resp)  ->서블릿이 DELETE request를 수행하기 위해 service()를 통해서 호출됨
protected doGet(HttpServletRequest req, HttpServletResponse resp 서블릿이 GET request를 수행하기 위해 service()를 통해서 호출됨
protected doHead(HttpSErvletRequest req, HttpSErvletResponse resp 서블릿이 HEAD request를 수행하기 위해 service()를 통해서 호출됨
protected doPost(HttpServletRequest req, HttpSErvletResponse resq) 서블릿이 POST request를 수행하기 위해 service()를 통해서 호출됨
protected service(HttpServletRequest req, HttpServletResponse resq) 표준 HTTP request를 public service()에서 전달받아 doXXX() 메서드를 호출함
public service(HttpServletRequest req, HttpServletResponse resp) 클라이언트 request를 protected service()에게 전달한다

 

서블릿의 생명주기 메소드는 다음과 같다.

생명주기 단계 호출 메소드 특징
초기화 init() 서블릿 요청시 딱한번 호출
서블릿 생성시 초기화 작업을 주로 수행
작업 수행 doGet()
doPost()
서블릿 요청시 매번 호출
클라이언트의 요청을 처리하는 메소드
종료 destroy() 서블릿이 기능을 수행하고 메모리에서 소멸할 때 호출
서블릿의 마무리 작업을 주로 수행

 

이제 실제로 이클립스에서 서블릿을 만들어 실습해보자.

 -> 그전에 서블릿을 사용하기 위해 해당 라이브러리를 포함해주어야한다.(톰캣의 lib에 servlet-api.jar)

 

package sec01.ex01;

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

public class FirstServlet extends HttpServlet  {
	@Override
	public void init() throws ServletException
	{
		System.out.println("init");
	}
	
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp)
	{
		System.out.println("doGet");
	}
	
	@Override
	public void destroy()
	{
		System.out.println("destroy");
	}
}

HttpServlet 클래스를 상속받고 각 메소드들을 오버라이딩 해준다. 

해당 서블릿을 브라우저에서 요청하는 방법은 다음과 같다.

 - localhost:8090/pro05/sec01.ex01.FirstServlet

이 방법은 패키지명.클래스명으로 서블릿에 접근하는 방식. 위 방식은 불편함 및 보안성문제로 안쓰이고

서블릿 매핑으로 실제 서블릿을 요청하는 방식을 많이쓴다.

 

서블릿 매핑방법은 다음과 같다.

1. 각 프로젝트에 있는 web.xml에 설정한다

2. <servlet>태그와 <servlet-mapping> 태그를 이용한다.

3. 여러개의 서블릿 매핑시 servlet태그를 정의하고 <servlet-mapping> 태그를 정의한다.

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
	<servlet> <!-- 서블릿 클래스를 설정하는 태그 -->
		<servlet-name>Anything Name</servlet-name>
		<servlet-class>sec01.ex01.FirstServlet</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>Anything Name</servlet-name>
		<url-pattern>/first</url-pattern>
	</servlet-mapping>
</web-app>

 

위에서 우리가 작성한 FirstServlet클래스를 위와 같이 매핑 시킨 것. 서블릿의 이름은 Anything Name이며, url로 접근할 땐 /first로 접근하면 된다.

 

실제로 호출해보면 다음과 같이 콘솔로그가 남는다.

여러개의 서블릿이 매핑될때는 <servlet>태그와 <servlet-mapping> 태그를 각각 분리해서 작성한다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" id="WebApp_ID" version="4.0">
	<servlet> <!-- 서블릿 클래스를 설정하는 태그 -->
		<servlet-name>Anything Name</servlet-name>
		<servlet-class>sec01.ex01.FirstServlet</servlet-class>
	</servlet>
	<servlet> <!-- 서블릿 클래스를 설정하는 태그 -->
		<servlet-name>Anything Name2</servlet-name>
		<servlet-class>sec01.ex01.SecondServlet</servlet-class>
	</servlet>
	
	<servlet-mapping>
		<servlet-name>Anything Name</servlet-name>
		<url-pattern>/first</url-pattern>
	</servlet-mapping>
	
	<servlet-mapping>
		<servlet-name>Anything Name2</servlet-name>
		<url-pattern>/second</url-pattern>
	</servlet-mapping>
</web-app>

 

서블릿의 상세한 동작과정은 다음과 같다.

서블릿 동작 과정

  1. 클라이언트 1: Request -> 서버
  2. 톰캣 컨테이너(WAS): 서블릿(예, FirstServlet)이 메모리에 로드되어 있는지 확인
  3. 톰캣 컨테이너(WAS): 최초의 요청인 경우 init() 메서드를 호출하여 FirstServlet 인스턴스를 메모리에 로드
  4. 톰캣 컨테이너(WAS): doGet() 이나 doPost() 메서드를 호출하여 서비스
  5. 클라이언트 2: 동일한 Request
  6. 톰캣 컨테이너(WAS): 서블릿(예, FirstServlet)이 메모리에 로드되어 있는지 확인
  7. 톰캣 컨테이너(WAS): 메모리에 있으므로 따로 메모리에 로드하지 않고 doGet()이나 doPost

여기서 서블릿이 스레드 방식으로 동작한다는것을 알 수 있음.

 -> 매번 프로세스를 생성했다면, 매번 init이 호출되어야함.

 

 

그 다음은 web.xml에 서블릿 태그를 작성하는 방식이 아닌 애너테이션을 이용한 서블릿 매핑도 있다.

 -> 훨씬편함

 

애너테이션을 이용해 서블릿 매핑을 하려면 @WebServlet을 이용해야 한다.

 -> 또한 해당 애너테이션을 받는 클래스는 반드시 HttpServlet 클래스를 상속받아야함.

package sec01.ex01;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;

@WebServlet("/thrid")
public class ThirdServlet extends HttpServlet{

}

기본적인 WebServlet 애너테이션이 적용된 클래스 작성법.

 

다만 매번 작성하는게 귀찮으니 클래스로 생성하지말고 Servlet으로 생성하면 편하다.

테스트 하는 방법은 동일하다.

 

 

반응형

'웹프로그래밍 > JSP_Servlet' 카테고리의 다른 글

JSP - 2  (0) 2023.08.11
JSP  (0) 2023.08.11
서블릿에서의 쿠키와 세션  (0) 2023.08.10
서블릿(Servlet) - 2  (0) 2023.08.07
웹 어플리케이션의 기본구조 및 학습  (0) 2023.08.07
Comments