Servlet

코코·2020년 8월 4일
0

Servlet/JSP

목록 보기
1/20

📚 자바 웹을 다루는 기술을 정리한 내용입니다.

Servlet이란?

이전에 정적인 웹을 너머서 동적 웹 프로그래밍을 위한 자바 클래스다.

클라이언트 요청에 따라 서버에서 동적으로 서비스를 제공하는 클래스

서블릿은 일반적인 자바와 달리 톰캣과 같은 JSP/Servlet 컨테이너에서 실행된다.


서블릿의 동작 과정이다.

클라이언트가 요청하면 web server는 WAS에 위임한다. WAS는 각 요청에 해당하는 서블릿을 실행한 다음 결과를 반환하여 클라이언트에게 전송한다.

특징

  • 서버 쪽에서 실행되면서 기능 수행

  • 정적 웹 문제를 보완하여 동적 기능 제공

  • 쓰레드 방식으로 실행

  • 컨테이너에서 실행

    Servlet API 계층 구조

두 인터페이스 Servlet, ServletConfig를 추상클래스 GenericServlet가 구현한다. 그리고 GenericServlet을 상속하는 HttpServlet이 있다.

  • Servlet, ServletConfig
    Servlet관련 추상 메서드가 선언 되어 있다.

  • GenericServlet 클래스
    위의 두 인터페이스를 구현하여 일반적인 서블릿 기능을 구현한 클래스.
    이 클래스를 구현한다면 프로토콜에 따라 service() 오버라이딩 필요

  • HttpServlet 클래스
    HTTP프로토콜을 사용하는 웹브라우저에서 서블릿 기능 수행
    웹 브라우저 기반 서비스를 제공하는 서블릿 만들 때 상속 받아 사용
    요청 시 service()가 호출되면서 방식에 따라 doGet() 혹은 doPost()가 차례로 호출 됨

HttpServlet의 메서드

//삭제 요청 수행
protected doDelete(HttpServletRequest req, HttpServletResponse resp);

//GET 요청 수행
protected doGet(HttpServletRequest req, HttpServletResponse resp);

//HEAD 요청 수행
protected doHead(HttpServletRequest req, HttpServletResponse resp);

//POST 요청 수행
protected doPost(HttpServletRequest req, HttpServletResponse resp);

//표준 HTTP request를 public service()에서 전달 받아 doXXX()호출
protected service(HttpServletRequest req, HttpServletResponse resp);

//클라이언트의 request를 protected service()에게 전달
public service (HttpServletRequest req, HttpServletResponse resp)

과정은 public service() -> protected service() -> doXXX()

서블릿 생명주기Servlet Lifecycle

서블릿도 마찬가지로 초기화를 거쳐 메모리가 인스턴스에 올라가고, 작업을 마치면 소멸한다.
이 단계를 거칠 때마다 서블릿 클래스의 메서드가 호출되어 초기화, DB연동, 마무리 작업을 수행한다. 각 과정에서 호출되어 기능을 수행하는 메서드들이 서블릿 생명주기 메서드다.

말하자면 실행 단계마다 호출되는 (콜백)메서드를 말한다.

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

상황에 따라 destroy()는 생략할 수 있지만, doGet()이나 doPost()는 핵심기능을 처리하므로 반드시 구현해야 한다.

테스트

package com.controller;

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

@WebServlet("/first")
public class FirstServlet extends HttpServlet {
	@Override
	public void init() throws ServletException {
		System.out.println("init.......");
	}

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		System.out.println("doGet().............");
	}
	
}

/*
doGet() 4회 호출

init.......
doGet().............
doGet().............
doGet().............
doGet().............

여러 번 호출해도 init()은 한 번만 실행되는 것을 확인할 수 있다.
*/

0개의 댓글