Servlet
자바 서블릿
자바를 사용하여 웹 페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양을 말하며, 흔히 서블릿이라 불린다.
서블릿은 자바 코드안에 HTML을 포함하고 있다.
서블릿은 웹에 다양한 기능이 요구되면서 정적인 자료 뿐 아니라 동적인 페이지들을 만들 필요가 생겼기 때문에 만들어졌다. 서블릿은 클라이언트의 요청에 맞춰 동적인 결과를 만들어 주는 자바 웹 프로그래밍 기술이며, 서블릿은 WAS의 서블릿 컨테이너 안에서 동작하게 된다.
특징
1. 클라이언트의 요청에 동적으로 응답하는 웹 어플리케이션 요소(Component)
2. HTML을 사용하여 응답
3. JAVA의 Thread 이용
4. MVC 패턴의 Controller 역할을 함
5. HTTP 프로토콜 서비스를 지원하는 javax.servlet.http.HttpServlet클래스를 상속받는다
6. UDP보다 처리 속도가 느림
7. HTML변경 시 서블릿을 재컴파일해야 한다.
서블릿(웹) 컨테이너
서블릿 컨테이너는 서블릿을 담고 관리해주는 컨테이너다. 서블릿 클래스의 규칙에 맞게 서블릿을 관리하며, 클라이언트의 요청을 받으면 HttpServletRequest와 HttpServletResponse 객체를 생성하여 post, get에 따라 동적인 페이지를 생성하여 응답한다.
1. 서블릿 생명주기 관리
서블릿의 생명주기를 관리한다. 서블릿 클래스를 로딩하여 인스턴스화하고 초기화 메서드를 호출하고, 요청이 들어오면 적절한 서블릿 메서드를 찾아서 동작한다. 또한 서블릿의 생명이 다하면 가비지 컬렉션을 통해 메모리에서 제거한다.
2. 통신 지원
웹 서버와 소켓을 만들어서 클라이언트의 요청을 받고 응답할 수 있는 통신을 지원해 준다. 통신을 하기 위한 listen, accept등의 과정을 API로 제공하여 복잡한 과정을 생략해주기 때문에 개발자가 비즈니스 로직 개발에 집중할 수 있게 도와준다.
3. 멀티쓰레드 지원 및 관리
클라이언트의 요청을 받을 때마다 새로운 자바 스레드를 생성한다. 그래서 동시에 여러 요청이 들어와도 멀티쓰레딩 환경에서 동시다발적 작업을 관리할 수 있다.
4. 보안 관리
보안 관련 기능을 제공하기 때문에 개발자는 서블릿에 보안 관련 메서드를 구현하지 않아도 된다.
서블릿의 동작 과정
1. 클라이언트의 요청
2. HttpServletRequest, HttpServletResponse 객체 생성
3. Web.xml이 어느 서블릿에 대해 요청한 것인지 탐색
4. 해당하는 서블릿에서 service()메서드 호출
5. doGet()또는 doPost()호출
6. 동적 페이지 생성 후 ServletResponse 객체에 응답 전송
7. HttpServletRequest, HttpServletResponse 소멸
서블릿의 생명 주기
서블릿 생명주기 메서드
init() / 초기화
서블릿 요청 시 맨 처음 한번만 호출됨
doGet(), doPost() / 작업 메서드
서블릿 요청 시 매번 호출되며, 클라이언트가 요청한 것에 맞춰 실행됨
destroy() / 종료
메모리에서 소멸될 때 호출된다.
1. 서블릿 객체 생성
최초 호출 시 Tomcat(WAS)에서 서블릿 파일을 불러와 컴파일한 후 메모리에 로드한다.
Tomcat은 서블릿 파일이 변경되는게 아니라면 서버 종료 전까지 해당 객체를 계속 재활용한다.
JSP파일이나 서블릿파일이 수정된다면 서블릿 자원을 해제시킨 뒤 새로운 객체를 생성해서 메모리에 로드하는 형식이다.
2. 선처리 작업 수행(객체 생성 시 최초 1회 수행)
서블릿에서 메서드를 임의로 작성하고 @PostConstruct 어노테이션을 부여하여 가장 먼저 해당 메서드를 실행한다.
서블릿 객체가 생성될 때 먼저 처리하고 싶은 로직이 있다면 만들어준다.
init()메서드로 수행해도 큰 문제는 없으나, 성격이 다른 로직이라면 별도로 분리해서 작성 가능하다.
@PostConstruct
의존성 주입이 이루어진 후 초기화를 수행하며, service 로직을 수행하기 전에 발생한다.
3. init() 실행
GenericServlet 클래스에서 정의하는 메서드
서블릿 객체 생성 시 초기화 작업을 수행하는 역할
Tomcat 서버 환경설정 파일인 web.xml의 내용을 불러와 ServletConfig 객체로 생성해준다.
오버로딩 구조로 되어있고 Tomcat에서 ServletConfig객체를 파라미터로 넣어 실행하며, init()메서드를 오버라이딩하지 않으면 아무것도 실행시키지 않는다.
4. Service() : 자원 해제 전까지 요청이 올때마다 반복 실행
클라이언트에서 요청이 오면, 요청에 맞춰 GET, POST등이 실행된다.
5. destroy() : 소멸
컨테이너가 서블릿에 종료 요청 시 실행되며, 종료시에 처리해야할 작업들은 destroy() 메서드를 오버라이딩하여 구현한다.
서블릿 작성 예시
위의 그림처럼, 프로젝트 선택 후 New - Servlet을 선택하여 생성하고, 패키지명, 클래스명과 URL 매핑, 메서드를 선택하여 만들면 되는데, 자세한 사항은 해당 블로그를 참조하자. (링크)
package com.java.example;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* Servlet implementation class gunchim
*/
@WebServlet("/gunchim")
public class gunchim extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public gunchim() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
response.setContentType("text/html;charset=euc-kr");
PrintWriter out=response.getWriter();
out.println("<html>"+"<body>"+"<h1>서블릿이다 </h1> "+"</body>"+"</html>");
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
doGet(request, response);
}
}
/main으로 요청 시 com.java.example.gumchim라는 서블릿으로 연결해서 보여줄 수 있도록 web.xml의 하단에 설정 코드를 추가해준다.
<?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>Servlet</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<servlet>
<servlet-name>Name</servlet-name>
<servlet-class>com.java.example.gunchim</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Name</servlet-name>
<url-pattern>/class</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>ServletTest</servlet-name>
<servlet-class>com.java.example.gunchim</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ServletTest</servlet-name>
<url-pattern>/main</url-pattern>
</servlet-mapping>
</web-app>
참조
https://ko.wikipedia.org/wiki/%EC%9E%90%EB%B0%94_%EC%84%9C%EB%B8%94%EB%A6%BF
https://code-lab1.tistory.com/210
https://velog.io/@falling_star3/Tomcat-%EC%84%9C%EB%B8%94%EB%A6%BFServlet%EC%9D%B4%EB%9E%80
2023.04 ~ 백엔드 개발자의 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!