
Servlet = Server + Applet
Java로 작성된 서버 측 동적 웹 컴포넌트. 클라이언트 요청을 받아 처리하고 응답을 생성. 톰캣 같은 Servlet 컨테이너가 생명주기를 관리.
| 구분 | 한 줄 요약 | 키워드 |
|---|---|---|
| Servlet | 요청 처리 클래스 | HttpServlet, doGet/doPost, service |
| 컨테이너 | 서블릿 관리자 | 생명주기(init→service→destroy), 스레드, 풀 |
| 배포 기술서 | 앱 전역 설정 | WEB-INF/web.xml, 매핑/필터/보안 |
| 매핑 | URL ↔ 서블릿 연결 | web.xml, @WebServlet |
| 초기값 | 환경 설정 주입 | ServletConfig(개별), ServletContext(전역) |
@WebServlet 등 애노테이션 설정 도입javax.* → jakarta.* 네임스페이스 전환최신 프레임워크/서버는
jakarta.servlet.*네임스페이스를 사용.
javax.servlet.Servlet 계열 규약을 따름HttpServlet 상속 사용ServletException 활용web.xml(DD) 또는 애노테이션으로 처리WEB-INF/web.xml)자주 쓰는 태그만 기억:
<servlet>, <servlet-mapping><context-param>(앱 전역 파라미터)<filter>, <error-page>, <welcome-file-list>, <session-config>web.xml 매핑<servlet>
<servlet-name>xmlmapping</servlet-name>
<servlet-class>com.example.LifeCycleTestServlet</servlet-class>
<load-on-startup>1</load-on-startup> <!-- 서버 구동 시 로드 -->
</servlet>
<servlet-mapping>
<servlet-name>xmlmapping</servlet-name>
<url-pattern>/xml-lifecycle</url-pattern>
</servlet-mapping>
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
@WebServlet(value = "/annotation-lifecycle", loadOnStartup = 1)
public class LifeCycleTestServlet extends HttpServlet {
// doGet/doPost ...
}
주의: 매핑 중복/누락은 서버 부팅 실패 원인.
ServletConfig (개별 서블릿용)<servlet>
<servlet-name>conf</servlet-name>
<servlet-class>com.example.ConfigServlet</servlet-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</servlet>
String enc = getServletConfig().getInitParameter("encoding");
ServletContext (앱 전역)<context-param>
<param-name>cdnBaseUrl</param-name>
<param-value>https://cdn.example.com</param-value>
</context-param>
String cdn = getServletContext().getInitParameter("cdnBaseUrl");
http://localhost:{PORT}/{프로젝트별칭}/{서블릿매핑}server.xml 의 <Context> 설정을 따름예) http://localhost:8800/first/test1.do
load-on-startup)doGet()/doPost() 분기첫 요청 지연을 줄이려면
load-on-startup로 미리 로딩.
@WebServlet("/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/plain;charset=UTF-8");
resp.getWriter().println("Hello, Servlet!");
}
}
init에서 무거운 자원 생성, destroy에서 안전하게 반납javax.* / jakarta.* 네임스페이스 혼용 주의“서블릿은 컨테이너가 관리하는 요청 핸들러”.
URL 매핑과 생명주기만 확실히 잡으면, 나머지는 DD(또는 애노테이션) + HttpServlet 오버라이드로 깔끔하게 정리 가능.