자카르타 서블릿(Jakarta Servlet, 구 Java Servlet)은 Jakarta EE에 포함된 소프트웨어 스펙 중 하나로 자바에서 HTTP 요청과 응답을 처리하기 위한 내용을 담고 있다. 단순하게 서버가 가지고 있는 HTML, 이미지, 영상 등의 파일을 제공하는 것을 넘어, 필요한 정보들을 가공하고, 저장하는 등 복잡한 동작들을 수행할 수 있도록 자바에서는 필요한 기능들을 제공하고 있다.
서블릿의 동작 원리를 이해하기 위해서는 서블릿 컨테이너(Servlet Container)에 대해서 알 필요가 있다. 서블릿 컨테이너는 서블릿을 담고 관리해주는 일종의 컨트롤타워 내지 저장 유닛을 의미한다. 서블릿 생명주기 관리, 통신 지원, 멀티스레딩 관리, 선언적인 보안관리 등을 들 수 있다. 이 모두를 조합하여 서블릿 컨테이너는 통신을 통해 들어오는 사용자의 request를 받고 그에 따라 요구되는 서블릿들이 존재하는 지를 탐색하며, 해당 서블릿 인스턴스가 이미 생성되어 있다면 필요한 일련의 동작들을 실행시키고, 서블릿 자체는 있되 서블릿 인스턴스가 존재하지 않는다면, 인스턴스를 생성하고 동작을 수행하게 된다. 또한 경우에 따라서 동시다발적인 일들을 수행할 수 있도록 하는 멀티스레딩(Multi-Threading) 기능을 제공하고 있다.
서블릿은 자신만의 생명주기를 가진다. 생명주기는 초기화(Initialize), 서비스(Service), 소멸(Destroy)의 3 가지의 단계로 구분된다. 초기화 단계에서는 로드한 서블릿의 인스턴스를 생성하고, 리소스를 로드하는 등의 클래스 생성자의 비슷한 역할을 수행한다. 일반적으로 초기화 단계는 보통 서버가 시작할 때 수행되고, 객체가 만들어질 때 한 번만 수행된다. 서비스 단계에서는 클라이언트의 요청에 따라 호출할 메서드를 결정한다. 마지막으로 소멸 단계에서는 서블릿이 언로드 된다. 언로드는 런타임 오류가 발생하거나 서블릿 컨테이너가 종료되었을 때 수행된다. 다음은 서블릿의 생명주기를 그림으로 나타낸 것이다.
서블릿 클래스를 작성하는 방법은 간단하다. @WebServlet 어노테이션을 달아주고, HttpServlet 클래스를 상속 받아주기만 하면 절반은 온 것이다. 본래는 @WebServlet을 사용하지 않고 web.xml에서 매핑하여 사용하였으나, 최근 트렌드에 맞추어 바로 어노테이션을 통해 매핑하는 방식을 지원하고 있다.
package servlet_tutorial;
import java.io.IOException;
import jakarta.servlet.ServletConfig;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
@WebServlet(name = "servlet-name", urlPatterns = {"/url-1", "/url-2", ...})
public class HelloServlet extends HttpServlet{
@Override
public void init(ServletConfig config) throws ServletException {
// TODO Auto-generated method stub
super.init(config);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// TODO Auto-generated method stub
super.doPost(req, resp);
}
}
HttpServlet 클래스는 서블릿이 기본적으로 제공해야 되는 메서드들을 가지고 있다. 프로그래머는 해당 메서드들을 오버라이드(Override)하여 사용하기만 하면 된다.
HttpServletRequest는 요청에 대한 정보를 가지고 있고, HttpServletResponse는 브라우저에서 정보를 표현하기 위해 사용된다. 즉 전자는 입력에 대한 정보를 가지고 있는 클래스이고, 후자는 출력을 위해 필요한 정보를 가지고 있는 클래스이다. GET 요청처리와 POST 요청처리를 하는 방법을 아는 것은 웹 프로그래밍에서 가장 기본적인 부분 중 하나이다. 두 요청의 차이에 대해서 논하자면 data의 흐름 방향을 들 수 있을 것 같다. GET의 경우 서버에서 클라이언트로 필요한 데이터를 전송하는 데 특화되어 있다. 물론 GET의 경우에도 어느정도 쿼리를 이용하여 서버로 정보를 전달할 수 있으나, 쿼리의 길이가 한정되어 있고, 외부로 그대로 노출된다. POST 방식은 GET 방식과 다르게 데이터 전송에 특화되어 있다고 볼 수 있다. 텍스트는 물론 그림, 영상 등 다양한 형태의 파일을 전송할 수 있도록 지원하고 있으며, 보내는 내용 자체도 일단 url에 직접적으로 들어나지 않아 최소한의 보안 역할을 하기도 한다.
이 글에서 다루는 내용은 Servlet의 아주 겉면에 해당하는 내용이다. 책에도 Servlet 예제가 있지만 개인적으로는 조금 부족한 면이 없잖아 있다. 차라리 웹에 대한 개념도 잡을 겸, 간단한 서블릿 프로그램을 만들어보는 것도 괜찮을 것 같다. 개인적으로 이메일 기능을 구현하는 것도 나쁘지 않겠다는 생각이 든다. 이 것으로 글을 마치도록 한다. 앞으로의 글은 실습을 진행하면서 필요한 지식들을 정리하는 식으로 진행할 것 같다.
출처 : 스프링 부트로 배우는 자바 웹 개발(제이펍, 윤석진), 코딩팩토리 : https://coding-factory.tistory.com/742
[Web] 서블릿(Servlet)이란 무엇인가? 서블릿 총정리
서블릿(Servlet)이란? 서블릿이란 Dynamic Web Page를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술입니다. 웹을 만들때는 다양한 요청(Request)과 응답(Response)이 있기 마련이고 이 요
coding-factory.tistory.com
'컴퓨터 과학 > Web' 카테고리의 다른 글
이클립스 쓰면서 발생한 문제들에 대한 간단한 tips (0) | 2023.04.21 |
---|---|
Spring : DI, IoC, Bean 등록 관련 사용 (0) | 2023.03.27 |
1. 스프링 부트로 배우는 자바 웹 개발 : 개발 환경의 변화(웹 서비스 구조 등 간단한 설명) (0) | 2023.02.01 |
5. Spring/Spring Boot를 이용한 로그인 페이지 만들기 : 테스트 (0) | 2023.01.27 |
4. Spring/Spring Boot를 이용한 로그인 페이지 만들기 : 임시 저장소 및 서비스 구현, 테스트 (0) | 2023.01.27 |