Web : Servlet

박준서·2024년 9월 25일
13

Web

목록 보기
1/16
post-thumbnail

Servlet ?

  • Java Servlet은 자바를 사용하여 웹 페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양. 흔히 Servlet이라고 부른다.
  • Java Servlet은 웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일종이다.

❗JSP와 Servlet의 차이는 ?

  • JSP : HTML 안에 자바 코드를 포함한다.
  • Servlet : 자바 코드 안에 HTML을 포함한다.

Servlet의 주요 특징

  • 클라이언트의 Request에 대해 동적으로 작동하는 웹 어플리케이션 컴포넌트
    • 컴포넌트 ? 재사용이 가능한 각각의 독립된 모듈. 웹 사이트에는 여러 반복적인 요소들이 있다. 이런 반복적인 요소들을 일일히 입력하지 않고, 이미 만들어진 컴포넌트들을 조합하여 화면을 구성할 수 있다.
  • 기존의 정적 웹 프로그램의 문제점을 보완하여 동적인 여러 기능을 제공한다.
  • JAVA의 스레드를 이용하여 동작한다.
  • MVC 패턴에서 컨트롤러로 이용된다.
  • Container에서 실행한다.

Servlet 객체의 상속 구조

  • 서블릿을 구현할 때는 반드시 javax.servlet.http 패키지에 있는 HttpServlet 클래스를 상속해야 한다.
  • HttpServlet은 웹 상에서 클라이언트의 요청이 있을 때 해당 서블릿을 실행하는 모든 조건이 포함되어 있다.
  • 따라서, 모든 서블릿은 반드시 HttpServlet을 상속받아야 한다.
  • HttpServlet을 상속받지 않는 클래스는 서블릿이라고 할 수 없고, 따라서 클라이언트가 요청해도 실행되지 않는다.

사진 출처 : https://woojong92.tistory.com/entry/Servlet구조와-HttpServlet-클래스

  • Servlet 인터페이스의 경우 서블릿 프로그램 개발 시 반드시 구현해야 하는 메서드를 선언한다.
    • init()
    • service()
    • destroy()
    • getServletConfig()
    • getServletInfo()
  • GenericServlet
    • 클라이언트 - 서버 환경에서 서버단의 애플리케이션으로서 필요한 기능을 구현한 추상 클래스이다.
  • HttpServlet
    • GenericServlet 클래스를 상속하여 service() 메소드를 재정의함으로써, HTTP 프로토콜에 알맞은 동작을 수행하도록 구현한 클래스
    • HTTP 프로토콜 기반으로 브라우저로부터 요청을 전달받아서 처리하도록 하는 클래스
    • service() 메서드에는 요청 방식에 따라, doGet(), doPost() 등의 메서드가 구현되어 있다.

Servlet의 동작 과정

  • 클라이언트가 웹 서버에 요청하면, 웹 서버는 그 요청을 WAS에 요청한다.
  • WAS는 각 요청에 해당하는 Servlet을 실행한다.
  • Servlet은 요청에 대한 기능을 수행 후, 결과를 반환하여 클라이언트에 전송한다.
  1. 클라이언트의 요청이 들어온다
  2. HttpServletRequest, HttpServletResponse 객체가 생성된다.
  3. Web.xml이 어느 Servlet에 대한 요청인지 탐색한다.
  4. 해당하는 Servlet에서 service() 메서드를 호출한다.
  5. doGet() 혹은 doPost() 메서드가 호출된다
  6. 동적 페이지 생성 후, ServletResponse 객체에 응답을 전송한다
  7. HttpServletRequest, HttpServletResponse 객체가 소멸한다.
  • WAS?

    • 웹 서버와 웹 컨테이너가 합쳐진 형태로서, 웹 서버 단독으로는 처리할 수 없는 DB의 조회나 다양한 로직 처리가 필요한 동적 컨텐츠를 제공한다.
    • JSP, Servlet 구동환경을 제공해주기 때문에 웹 컨테이너 혹은 서블릿 컨테이너 라고도 불린다.
    • 대표적인 WAS로는 Tomcat이 있다.
    • WAS의 내부에는 여러개의 Context가 있다.
      • Context? 내가 만든 어플리케이션
  • web.xml

    • 서블릿을 작성했다면 해당 서블릿을 사용자가 요청한 경로와 매핑 시켜야 WAS에서 매핑된 정보를 읽어서, 브라우저에서 해당 URL로 HTTP 요청 시 해당 서블릿으로 요청을 전달해 줄 수 있다.

    • 톰캣을 예로 들면, 웹 어플리케이션 서비스 처리에 대해 정의된 환경 설정 파일이 server directory의 web.xml에 있다.

      <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://jakarta.ee/xml/ns/jakartaee" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd" version="6.0">
        <servlet>
          <description></description>
          <display-name>HelloServlet</display-name>
          <servlet-name>basic</servlet-name>
          <servlet-class>com.basic.HelloServlet</servlet-class>
        </servlet>
        <servlet-mapping>
          <servlet-name>basic</servlet-name>
          <url-pattern>/hello</url-pattern>
        </servlet-mapping>
    • Servlet과 Servlet mapping은 하나의 세트이다. Servlet name을 꼭 맞춰주어야 한다. 이를 입력하면 WAS가 자동으로 매핑해준다.

Servlet 형식

public class FirstServlet extends HttpServlet {
	@Override
    public void init() {
    ...
	}
    
    @Override
    public void doGet(HttpServletRequest req, HttpServletResponse resp) {
    ...
    }
    
    @Override
    public void destroy() {
    ...
    }

Servlet Life Cycle

  • 기존의 Java SE 환경에서, 우리는 Main 메서드를 활용해 객체를 만들고, 실행했다.
  • Servlet class는 java SE에서의 class와는 다르게, Main이 존재하지 않는다.
    • 사실 있다. Main은 Tomcat (WAS) 이다.
  • 즉. 객체의 생성부터 사용의 주체가 사용자가 아닌 Servlet Container에 있다.
    • Client가 요청을 하게 되면 Servlet Container는 Servlet 객체를 생성(한번만)하고, 초기화(한번만) 하며 요청에 대한 처리 (요청시마다 반복)를 하게 된다.
    • 또한 Servlet 객체가 필요 없게 되면 제거하는 것 까지 Container가 담당한다.

  • 빨간색 : 최초 요청시 한번만 실행

  • 파란색 : 요청 시 마다 반복 실행

  • init()

    • 서블릿이 메모리에 로드 될 때 한번 호출
    • 코드 수정으로 인해 다시 로드 되면 다시 호출
    • init()이 완료되지 않으면 어떤 사용자 요청도 처리되지 않는다.
  • doGet()

    • GET 방식으로 data 전송 시 호출
  • doPost()

    • POST 방식으로 data 전송 시 호출
  • service()

    • 모든 요청은 service()를 통해 doXXX() 메서드로 이동
  • destroy()

    • 서블릿이 메모리에서 해제되면 호출
    • 코드가 수정되면 호출

Container, Context ?

  • Container
    • WAS를 말한다. 여러 웹 애플리케이션을 포함해서 동작한다.
  • Context
    • Container 내부의 각각의 Application

위 두가지 개념이 나오면서, 두 개의 절대 경로가 등장한다.

❗ Servlet에서는 자바 코드를 이용한 business logic과 html을 이용한 presentation logic이 섞여서 등장한다.

  • 코드 가독성도 떨어지고, 한땀 한땀 치기 매우 불편
  • 이를 개선하기 위해서 사용하는 것이 JSP 이다.

@WebServlet

  • Servlet에 대한 설정을 위한 애너테이션이다. web.xml에 관련 설정을 하는 것을 대체한다.
  • 최근에는 @WebServlet을 이용하는 방식이 주로 사용된다.

package com.edu.first;

import java.io.IOException;

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

@WebServlet("/hi")
public class HiServlet extends HttpServlet {
	
	public void init(ServletConfig config) throws ServletException {
		System.out.println("init() 실행");
	}

	public void service(ServletRequest arg0, ServletResponse arg1) throws ServletException, IOException {
		System.out.println("service() 실행");
	}
}

출처를 남긴 이미지 외의 이미지들은 직접 만든 이미지 입니다 ! 무단 복제 X

profile
Back-End Developer

4개의 댓글

comment-user-thumbnail
2024년 9월 25일

이 글을 읽고 SSAFY 월말 평가 100점 맞았습니다. 감사합니다!

답글 달기
comment-user-thumbnail
2024년 9월 25일

이 글을 읽고 백엔드 프로젝트 경험 없이 백엔드 취뽀 했습니다. 감사합니다!

답글 달기
comment-user-thumbnail
2024년 9월 25일

무단 복제하면 안된다니 지당하신 말씀입니다.

답글 달기
comment-user-thumbnail
2024년 9월 25일

팬이에요

답글 달기

관련 채용 정보