[JSP&Servlet] 서블릿의 주요 객체와 서블릿 실행 해보기

Re_Go·2024년 7월 22일
0

JSP&Servlet

목록 보기
3/19
post-thumbnail

1. 메인 서블릿 객체들

서블릿을 사용하려면 크게 세 가지 객체들이 필요한데요. Servlet, GenericServlet, HttpServlet 이 바로 그 객체들이 입니다. 그 중 Servlet과 GenericServlet은 각각 인터페이스와 추상 클래스이고, HttpServlet이 메인 클래스가 되는데요.

그 중 유저는 HttpServlet을 상속 받아 필요한 서비스를 상속 받은 메서드를 재정의 함으로서 구현하게 되는거죠.

(자료 출처 : https://dotnettutorials.net/lesson/generic-servlet/)

그럼 각각 이들 하나 하나의 역할과 기능에 대해서 살펴보도록 할까요?

Servlet 인터페이스

HttpServlet의 조상 격이자 서블릿의 핵심 인터페이스로 모든 서블릿들이 구현해야 할 메서드를 정의하고 있는 인터페이스입니다. 주 메서드는 init, service, destroy, getServletConfig, getServletInfo 이렇게 다섯가지로 구성이 되어 있습니다.

GenericServlet 추상 클래스

GenericServlet 클래스는 Servlet 인터페이스의 메서드를 서버측에 적절히 필요한 기능으로 구현하는 클래스로 , servlet으로부터 상속 받은 메서드와 log, getServletContext, getServletName 등의 자체 메서드를 재정의 할 수 있습니다.

HttpServlet 클래스

HttpServlet 클래스는 GenericServlet을 상속 받아 재정의 함으로서 Http 프로토콜에 알맞은 동작을 수행하도록 구현한 클래스라고 합니다. 즉 GenericServlet은 비단 HttpServlet 뿐만 아니라 EmailServlet, ImageServlet 등 다른 서블렛들도 GenericServlet을 상속 받아 해당 서블릿의 목적에 맞게 상속 받은 메서드를 재정의 할 수 있음을 나타낸다는 것이죠.

아무튼 HttpServlet도 그 중 하나로서, 클라이언트 측으로부터 온 요청을 받고, 처리해서 응답하는 주 기능을 구현하는데요. 요청 방식(Get, Post)에 따라 어떻게 처리할지에 대한 코드를 해당 메서드에 정의하여 처리하는 방식이 주를 이룹니다.

2. 서블릿 작성해보기

파일 생성

우선 서블릿을 작성하기 위해선 생성한 프로젝트 내에 src 폴더에 클래스 파일을 생성해야 합니다.

서블릿 작성

그 다음 아래의 코드와 같이 서블릿(HttpServlet)을 상속 받아주는데요.

package com.practice.test;

import javax.servlet.http.HttpServlet;

public class MyServlet extends HttpServlet {

}

상속을 받은 사용자 정의 서블릿(이하 MyServlet 이라고 하겠습니다.) 에서는 보통 HttpServlet으로부터 상속 받은 메서드 중 init(), service(), destroy()를 재정의 해줍니다.

package com.practice.test;

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

public class MyServlet extends HttpServlet {

    @Override
    public void init() throws ServletException {
        // 서블릿 초기화 시 실행할 코드 작성
    	// // 예: 데이터베이스 연결 초기화 등
        System.out.println("서블릿 초기화");
    }

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse res)
            throws ServletException, IOException {
        // 클라이언트 요청을 처리하는 메서드
        // 요청 메서드에 따라 doGet(), doPost() 등으로 분기됨
        System.out.println("서비스 실행");
    }

    @Override
    public void destroy() {
        // 서블릿이 종료될 때 실행할 코드 작성
        // 예: 데이터베이스 연결 해제 등
        System.out.println("서블릿 종료");
    }
}

이렇게 정의된 메서드 중 서버가 실행될 때 init 메서드가 최초로, service 메서드가 사용자 요청이 있을 때마다, 서버 종료 및 서블릿 객체 삭제 및 해제에 destroy가 호출됩니다.

web.xml 설정과 WebServlet 어노테이션

이제 우리는 해당 서블릿을 서버와 연결하기 위해 web.xml 파일에 설정을 해줘야 하는데요. 아래의 사진 상의 경로대로 파일을 여시면 되는데, 참고로 파일을 여실 때는 그냥 파일을 열게 되면 xml Editor로 열리기 때문에 open with에서 text file로 열어주시면 됩니다.

xml파일이 열렸다면 이제 톰캣에게 해당 서블릿의 경로를 알려주는 서블릿 태그와, JSP 페이지에서 클라이언트의 요청을 해당 서블릿에게 라우팅 해주기 위한 url 정보를 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">
  <display-name>practice</display-name>
  <servlet>
  	<servlet-name>myServlet</servlet-name>
    <!-- 아래에 해당 서블릿의 위치를 작성해 줍니다. -->
  	<servlet-class>com.practice.test.MyServlet</servlet-class>
  </servlet>
  <servlet-mapping>
  	<servlet-name>myServlet</servlet-name>
    <!-- 클라이언트가 서블릿에게 요청할 수 있는 경로를 지정합니다. -->
<url-pattern>/myServlet</url-pattern>
  </servlet-mapping>
</web-app>

물론 위의 맵핑 작업 대신 어노테이션을 이용해 서블릿 정보를 톰캣에게 제공해 줄 수도 있습니다.

import javax.servlet.annotation.WebServlet;

@WebServlet("/myServlet")
public class MyServlet extends HttpServlet {

서버 실행

작성이 끝났다면 서블릿으로 다시 돌아와 우클릭으로 Run As -> Run on Server를 클릭 해주어 서버를 실행해 주면 됩니다.

이때 8080 오류가 발생했다면 이 곳을 참조하시고, failed to start 오류가 발생했다면 이 곳을 참조하시기 바랍니다.

해당 오류까지 해결하고 서버를 다시 돌리면 다음과 같이 init 메서드와 service 메서드가 실행되는 모습을 확인하실 수 있으실 겁니다.

profile
인생은 본인의 삶을 곱씹어보는 R과 타인의 삶을 배워 나아가는 L의 연속이다.

0개의 댓글