Back-end/JSP

Servlet 이란?

메델 2023. 1. 20. 11:59

5장 서블릿 이해하기 

동적 웹 페이지를 처음 구현한 것은 Servlet이므로 JSP에 대해 공부하기 이전에 Servlet 부터 이해하자.

 

(1)  Servlet이란?

 

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

서블릿은 java로 이루어져있지만 독자적으로 실행되지 못하고 JSP/Servlet 컨테이너에서 실행된다.

 

Servlet 동작 과정

Servlet 특징

  • 자바로 이루어져있어 자바의 특징을 가진다.
  • 서버 쪽에서 실행되면서 기능을 수행 
  • 스레드 방식으로 실행
  • 동적인 여러가지 기능을 제공
  • 컨테이너에서 실행
  • 플랫폼이 독립적으므로 컨테이너 종류에 상관없이 실행된다
  • 보안 기능을 적용하기 쉽다
  • 웹 브라우저에서 요청시 기능을 수행

 

(2)  Servlet API 계층 구조와 기능

 

  1. Servlet API는 Servlet과 ServletConfig 인터페이스를 구현해 제공
  2. GenericServlet 추상클래스는 두 인터페이스의 추상 메소드 구현
  3. GenericServlet은 다시 HttpServlet이 상속 받음

 

Servlet API 구성요소 특징

서블릿 구성 요소  기능
Servlet 인터페이스  javax.servlet 패키지에 선언
Servlet 관련 추상 메서드를 선언
init(), service(), destroy(), getServletInfo(), getServletConfig() 선언
ServletConfig 인터페이스 javax.servlet 패키지에 선언
Servlet 관련 추상 메서드를 선언
getInitParameter(), getInitParameterNames(), getServletContext(), getServletName() 선언
GenericServlet 클래스  javax.servlet 패키지에 선언
상위 두 인터페이스를 구현하여 일반적인 서블릿 기능을 구현한 클래스
HttpServlet 클래스 javax.servlet.http 패키지에 선언되어 있다.
GenericServlet을 상속 받아 http 프로토콜을 사용하는 웹 브라우저서 서블릿 기능 수행
웹 브라우저 기반 서비스를 제공하는 서블릿을 만들 때 상속받아 사용
요청시 service()가 호출되면서 요청 방식에 따라 doGet()이나 doPost()가 차례대로 호출 

 

HttpServlet의 여러가지 메서드 기능 

메서드 기능
protected doDelete(HttpServletRequest req, HttpServletReponse resp) 서블릿이 DELETE request를 수행하기 위해 service()를 통해 호출
protected doGet(HttpServletRequest req, HttpServletReponse resp) 서블릿이 GET request를 수행하기 위해 service()를 통해 호출
protected doHead(HttpServletRequest req, HttpServletReponse resp) 서블릿이 HEAD request를 수행하기 위해 service()를 통해 호출
protected doPost(HttpServletRequest req, HttpServletReponse resp) 서블릿이 POST request를 수행하기 위해 service()를 통해 호출
protected service(HttpServletRequest req, HttpServletReponse resp) request를 public service()에서 전달받아 doXXX()메서드를 호출
public service(HttpServletRequest req, HttpServletReponse resp) 클라이언트의 request를 protected service()에게 전달

 

(3)  Servlet의 생명주기 메서드 

: Servlet 실행 단계마다 호출되어 기능을 수행하는 콜백 매서드

 

Servlet은 자바 클래스이므로 실행시 초기화 → 메모리에 인스턴스 생성 소멸이 일어난다

Servlet의 생명주기 메서드 기능

생명주기 단계 호출 메서드 특징
초기화 init() Servlet 요청 시에 맨 처음 한번만 호출
Servlet 생성 시에는 초기화 작업 주로 수행 
실행 초기에 Servlet 기능 수행과 관련된 기능을 설정하는 용도로 사용
작업 수행 doGet(), doPost() do로 시작하는 메서드는 Servlet의 핵심 기능을 처리하므로 반드시 구현해야한다.
Servlet 요청시 매번 호출
클라이언트가 요청하는 작업을 수행

종료 destory() Servlet이 기능을 수행하고 메모리에서 소멸될 때 호출
필요 없으면 생략 가능하다
Servlet의 마무리 작업 주로 수행

 

(4)  Servlet의 동작 과정

client 1이 요청하면

  1. FirstServlet이 메모리에 load 되어 있는 지 확인한다.
  2. 최초 요청이므로 init() 메서드를 호출하여 FirstServlet 인스턴스를 메모리에 load한다.
  3. doGet()이나 doPost() 메서드를 호출하여 서비스를 제공

 

client 2가 client 1과 동일한 Servlet을 요청하면

  1. 톰캣은 FirstServlet이 메모리에 load 되어 있는지 확인
  2. 메모리 있음이 확인 되어 init()를 호출하지 않고 바로 doGet()이나 doPost() 메서드를 호출하여 서비스를 제공

→ Servlet은 메모리에 존재하는 Servlet을 재사용하여 빠르고 효율적으로 동작한다.

 

 

 

(5)  매핑

(intellij ultimate servlet 프로젝트 생성은 https://youtu.be/OSted-Bf98k  이 영상을 참고했다)

 

1. web.xml을 이용한 매핑

<servlet>태그와 <servlet-mapping> 태그를 이용 

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

 

아래의 코드를 보게 되면  <servlet-name> 태그의 값을 같은 값으로 설정해 <servlet>과 <servlet-mapping>을 연결해주었다. 

 

 

이제 /first 웹 브라우저에 요청하게 되면 각각의 메서드가 호출되어 메시지가 출력된다.

 

 

* 만약 톰캣 로그창에 한글이 깨져 나온다면 VM options에 -Dfile.encoding=UTF-8 -Duser.language=en -Duser.region=en 을 추가 해주자

 

 

여러개의 서블릿을 web.xml에 매핑하기 위해서는 <servlet>태그와 <servlet-mapping> 태그를 분리한 후 <servlet-name> 태그의 값을 다른 값으로 설정해야한다.

 

 

FirstServlet, SecondServlet의 각각 메서드가 잘 출력된는 것을 확인할 수 있다.

 

 

2.  Annotation을 이용한 Servlet 매핑

: 여러 개의 Servlet을 web.xml을 통해 매핑하게 되면 복잡해진다는 단점이 존재한다. 따라서 각 Servlet 클래스에 Annotation을 이용하여 매핑하여 가독성을 높인다.

 

* annotation이란? 소스 코드에 직접 기능을 설정하는 방법을 말한다.

 

  • annotation을 이용하여 Servlet 매핑을 하기 위해서는 @ WebServlet을 이용해야한다. 
  • annotation을 이용하여 만드는 Servlet 클래스는 반드시 HttpServlet을 상속 받아야 한다.
  • annotation을 사용할 때 매핑 이름이 다른 매핑 이름과 중복 되지 않게 조심하자.

 

(참고: 자바 웹을 다루는 기술)

'Back-end > JSP' 카테고리의 다른 글

Servlet 비즈니스 로직 처리  (0) 2023.01.24
Servlet 기초  (0) 2023.01.21
웹 애플리케이션  (0) 2023.01.19
프로그램의 발전 과정, 웹 프로그래밍과 JSP  (0) 2023.01.19