Servlet
Servlet
Servlet
- JSP가 나오기 전, 자바로 웹 애플리케이션을 개발할 수 있도록 만든 기술
- 서버 단에서 클라이언트의 요청을 받아 처리한 후 응답하는 역할
서블릿 특징
- 클라이언트의 요청에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트
- MVC 모델에서 Controller 역할
- 모든 메서드는 스레드로 동작
- jakarta.servlet.http 패키지의 HttpServlet 클래스를 상속받음
서블릿 컨테이너
- 웹 서버로 HTTP 요청
- 웹서버에서 서블릿 컨테이너로 요청 전달
- 서블릿 컨테이너에서 서블릿 로드 -> 초기화 -> 요청 처리 후 HTTP 응답
현재 톰캣을 컨테이너로 사용
- 서블릿의 수명 주기를 관리
- 요청이 오면 스레드를 생성해 처리
- 클라이언트의 요청을 받아 응답을 보낼 수 있도록 통신 지원
통신 지원
- 클라이언트와 통신하려면 서버는 특정 포트로 소켓을 열고 I/O 스트림을 생성하는 등 복잡한 과정이 필요
- 서블릿 컨테이너는 이 과정을 간단히 해주는 API 제공
수명주기 관리
- 서블릿을 인스턴스화한 후 초기화하고, 요청에 맞는 적절한 메서드를 호출
- 응답한 후에는 가비지 컬렉션을 통해 객체를 소멸
멀티스레딩 관리
- 서블릿 요청들은 스레드를 생성해 처리
- 즉, 멀티스레드 방식으로 여러 요청을 동시에 처리
선언적인 보안 관리 및 JSP 지원
- 서블릿 컨테이너는 보안 기능을 지원하므로 별도로 구현 불필요
서블릿 동작 방식
- 서블릿은 MVC 패턴에서 Controller 역할
- 클라이언트의 요청을 받음
- 분석 후 요청을 처리할 서블릿 찾음
- 서블릿을 통해 비즈니스 서비스 로직을 호출
- 모델로부터 그 결괏값 확보
- request 나 session 영역에 저장한 후 결괏값을 출력할 적절한 뷰를 선택
- 최종적으로 선택된 뷰(jsp page)에 결괏값을 출력한 후 요청한 클라이언트에 응답
서블릿 작성 규칙
- jakarta.servlet, jakarta.servlet.http, java.io 패키지 임포트
- 서블릿 클래스는 반드시 public으로 선언, HttpServlet을 상속받아야 함
- 사용자의 요청을 처리하기 위해 doGet() 메서드나 doPost() 메서드를 반드시 오버라이딩
- doGet() 또는 doPost() 메서드는 ServletException 과 IOException 예외를 던지도록 선언
- doGet() 또는 doPost() 메서드를 호출할 때의 매개변수는 HttpServletRequest와 HttpServletResponse를 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package 패키지명;
import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
public class ServletClassName extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
}
}
서블릿 작성
- 서블릿 작성은 클라이언트의 요청을 전달할 ‘요청명’을 결정하는 일부터 시작
- JSP에서는 클라이언트의 요청을 JSP가 직접 받아 처리하지만, 서블릿은 요청명을 기준으로 이를 처리할 서블릿을 선택
- 요청명과 서블릿을 연결해주는 작업을 mapping 이라고 함
- web.xml에서 기술하는 방법과 @WebServlet 어노테이션을 사용하여 코드에 직접 명시하는 방법이 존재
web.xml에서 매핑
1
2
3
4
5
6
7
8
9
<servlet> <!-- 서블릿 등록 -->
<servlet-name>서블릿명</servlet-name> <!-- 서블릿을 매핑하기 위한 서블릿명 -->
<servlet-class>패키지를 포함한 서블릿 클래스명</servlet-class> <!-- 요청을 처리할 서블릿을 패키지를 포함하여 명시 -->
</servlet>
<servlet-mapping> <!-- 서블릿과 요청명 매핑 -->
<servlet-name>서블릿명</servlet-name>
<url-pattern>클라이언트 요청 URL</url-pattern> <!-- 컨텍스트 루트를 제외한 요청명 기입 -->
</servlet-mapping>
서블릿의 수명주기 메서드
서블릿 수명 주기
- 서블릿은 클라이언트의 요청이 들어오면 가장 먼저 서블릿 객체를 생성하고, 서블릿을 초기화한 후, 요청을 처리
- 마지막으로 서버를 종료할 때 서블릿 객체를 소멸시킴
- 서블릿의 수명 주기 관리는 서블릿 컨테이너가 담당
- 즉, 서블릿 컨테이너는 서블릿 객체를 생성하고 각 단계마다 자동으로 특정 메서드를 호출하여 해당 단계에 필요한 기능을 수행
- 이 때 호출되는 콜백 메서드들을 수명주기 메서드라고 부름
서블릿 객체 생성–>전처리를 위한 @PostConstruct–>init()–>service()
–>doGet(),doPost()–>destroy()–>후처리를 위한 @PreDestroy
@PostConstruct
- 객체 생성 직후, init() 메서드를 호출하기 전에 호출
- 어노테이션을 사용하므로 메서드명은 개발자가 지정
init()
- 서블릿의 초기화 작업을 수행하기 위해 호출
- 최초 요청 시 딱 한 번만 호출
sevice()
- 클라이언트의 요청을 처리하기 위해 호출
- 전송 방식이 get이면 doGet() 메서드를, post면 doPost() 메서드를 호출
- 따라서 두 가지 전송 방식 모두를 처리 가능
destroy()
- 서블릿이 새롭게 컴파일되거나, 서버가 종료될 때 호출
@PreDestroy
- destroy() 메서드가 실행되고 난 후, 컨테이너가 이 서블릿 객체를 제거하는 과정에서 호출
- @PostConstruct와 동일하게 메서드명은 개발자가 지정
이 기사는 저작권자의 CC BY-NC 4.0 라이센스를 따릅니다.