Servlet & Jsp

[Servlet & 컨테이너] - Head Frist Servlet & Jsp

사과씨앗 2020. 12. 19. 22:51
728x90
반응형

이전 글에서는 Servlet이 웹 통신에서 어떤 역할을 하는지 간략하게 서술하였습니다.

이번 글에서는 Servlet을 관리하여 주는 컨테이너를 알아보겠습니다.

(대표적인 컨테이너는 톰캣이 있다.)

 

1. 컨테이너의 역할

 

웹 서버는 받은 요청을 곧바로 Servlet으로 보내는 것이 아닌 컨테이너로 보낸 후 컨테이너는 Servlet 이 필요로 하는 

HttpServletRequest , HttpSerlvetResponse 객체를 생성하여 넘겨주고 받은 요청에 받게 doGet() , doPost() 메소드를 실행시켜 줍니다. 

 

- 통신지원

컨테이너는 웹 서버와 Servlet이 서로 통신할 수 있는 쉬운 방법들을 제공합니다. 개발자가 직접 ServerSocket을 만들어 특정 포트에 리스닝을 하는 등 이러한 과정들을 해결해 주는 통신 기능을 API로 제공합니다.  

 

- 생명주기 관리

컨테이너는 요청이 들어오면 요청에 맞게 서블릿 클래스를 인스턴스화 하고 서블릿메서드를 호출해 주며 서블릿의 생명이 다한 순간 가비지 컬렉션을 진행 하여 줍니다.

 

- 멀티스레딩 지원

컨테이너는 요청이 들어올 때마다 새로운 자바 스레드를 하나 만듭니다. 클라이언트의 요청에 따라 적절한 메소드를 실행하면 그걸로 스레딩 작업이 끝이 납니다. 이처럼 컨테이너는 개발자가 스레드의 생명주기를 관리할 필요가 없어 조금 더 비즈니스 로직에 집중할 수 있도록 해줍니다.

 

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

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		response.getWriter().append("Served at: ").append(request.getContextPath());
	}

	/**
	 * @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);
	}

 

Servlet 클래스 생성 시 기본적으로 코딩되어 있는 코드를 보면 doGet(HttpServletRequest request, HttpServletResponse response)

HttpServletRequest , HttpServletResponse 이 두 가지 객체를 매개변수로 받아오는 것을 볼 수 있습니다. 

Request 객체는 클라이언트가 웹서버로 보내온 데이터 들을 가지고 있으며, Response 객체는 클라이언트에게 넘겨줄 데이터를 담아서 보내는 역할을 합니다. 이러한 Http 객체를 생성하여 보내주고 do, post 메소드를 요청에 맞게 실행시켜주는 역할을 하는 것이 컨테이너의 역할 중 하나입니다.

 

2. Servlet Mapping

 

Servlet이 여러 개의 클래스가 존재한다면 컨테이너는 어떻게 요청에 맞는 Servlet을 찾아갈 수 있을까요?

컨테이너가 Servlet을 찾아갈 수 있도록 도와주는 역할을 하는 것이 배포 서술자(DD, Deployment Descriptor)입니다. 우리가 흔히 알고 있는 Web.xml 파일이 대표적이죠. DD는 다양한 역할을 하지만 오늘은 Servlet Mapping에 대해서만 간략하게 서술하겠습니다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>sample</display-name>
  
  <servlet>
  <servlet-name>init servlet</servlet-name>
  <servlet-class>sample.servlet1</servlet-class>
  </servlet>
  
  <servlet-mapping>
  <servlet-name>init servlet</servlet-name>
  <url-pattern>test.do</url-pattern>
  </servlet-mapping>
  
  
</web-app>

어떤 서블릿을 사용할 것 인지 정하여 주도록 하겠습니다. 위 코드에서 보면 <servlet></setvlet> 태그는 DD 내부에서 사용할 Servlet의 이름과 해당 서블릿의 위치를 지정하는 역할을 합니다. <servlet-name> 태그 안에다가 사용할 서블릿의 이름을 명명하여 줍니다.(정해진 규칙이 없으면 본인의 편의상)

 

다음으로 <servlet-class> 태그 안에서는 해당 서블릿의 경로를 작성하여 줍니다.

 

<sevlet-mapping> 태그는 위에서 만들어 놓은 <servelt> 태그의 속성들을 사용합니다. <servlet-name> 은 앞서 만들어 놓은 serlvet-name을 작성하여 줍니다. <url-pattern> 은 클라이언트가 사용하는 서블릿명으로  서블릿 클래스 이름을 그대로 사용하여도 괜찮지만 보안상 다른 이름으로 변경하여 맵핑하여 줍니다.

 

* 주의할 점 : DD 내부에서 url-pattern 은 중복되면 컨테이너가 서블릿을 찾아가는 과정에서 오류가 나기 때문에 주의하셔야 합니다.

 

너무 두서없이 글을 쓴거 같내요 ...ㅜㅜ 

 

감사합니다.

 

728x90
반응형