Servlet
- 서버 쪽에서 실행되면서 클라이언트의 요청에 따라 동적으로 서비스를 제공하는 자바 클래스
- 자바로 작성되었기 때문에 자바의 일반적인 특징을 모두 가짐
- 독자적으로 실행되지 못하고 JSP/Servlet(ex)tomcat) 컨테이너에서 실행되어야 함
- 서버에서 실행되다가 웹 브라우저에서 요청을 하면 해당 기능을 수행한 후 웹 브라우저에 결과를 전송(서버에서 실행되어 보안성도 높음)
사용자 정의 서블릿 클래스 만들기 -> 서블릿 생명주기 메소드 구현 -> 서블릿 매핑 작업 -> 웹 브라우저에서 서블릿 매핑 이름으로 요청하기
한마디로, 서블릿은 spring boot에서의 spring web과 같은 기능인 것이다. 웹 개발에 특화된 클래스라고 생각하면 된다.
Tomcat(톰캣)
- JSP/Servlet 컨테이너
- 자바 기반 오픈 소스로 제공됨
서블릿 특징
- 서버 쪽에서 실행되며 기능을 수행
- 기존의 정적인 웹 프로그램의 문제점을 보완하여 동적인 여러 가지 기능 제공
- 스레드 방식으로 실행됨
- 자바로 만들어져 자바의 특징(객체 지향)을 가짐
- 컨테이너에서 실행됨
- 컨테이너 종류에 상관없이 실행됨(플랫폼 독립적)
- 보안 기능을 적용하기 쉬움
- 웹 브라우저에서 요청 시 기능을 수행함
계층 구조
- 자바로 만들어졌기 때문에 클래스들 간 계층 구조를 가짐

출처
서블릿 생명주기(LifeCycle) 메소드
- 서블릿 실행 단계마다 호출되어 기능을 수행하는 콜백 메소드
|생명주기 단계|호출 메소드|특징|
|-|-|-|
|초기화|init()|서블릿 요청 시 맨 처음 한번만 호출되며, 초기화 작업 수행|
|작업 수행|doGet(), doPost()|서블릿 요청 시 매번 호출되며 실제로 클라이언트가 요청하는 작업 수행|
|종료|destroy()|서블릿이 기능을 수행하고 메모리에서 소멸될 때 호출되며 마무리 작업을 주로 수행
다른 메소드는 필요 없으면 생략해도 되지만, doGet()이나 doPost()와 같이 do로 시작하는 메소드는 서블릿의 핵심 기능을 처리하므로 반드시 구현해야함
사용자 정의 서블릿
- HttpServlet 클래스를 상속받아서 제작
- 이후 init, doGet, destory 메소드를 오버라이딩 해서 기능 구현
톰캣의 servlet-api.jar 클래스 패스 설정
- 서블릿 api들은 톰캣의 servlet-api.jar 라이브러리로 제공되므로 이클립스의 프로젝트에서 서블릿을 사용하려면 반드시 클래스 패스를 설정해야 함
서블릿 매핑
이 때, 톰캣이 로컬 PC에 설치된 경우에는 다음과 같이 입력해도 됨
http://localhost:8000/pro05/first
서블릿 동작 과정
- 클라이언트가 http://localhost:8000/pro05/first로 요청
- FirstServlet이 메모리에 존재하는지 확인 -> 최초의 요청이면 init() 메소드를 호출하여 FirstServlet 인스턴스를 메모리에 로드. 최초의 요청이 아니면 바로 3번으로 이동
- doGet(), doPost() 메소드를 호출하여 서비스를 함
=> 서블릿은 메모리에 존재하는 서블릿을 재사용함으로써 빠르고 효율적으로 동작
어노테이션을 이용한 서블릿 매핑
서블릿의 기본 기능 수행 과정
- 클라이언트로부터 요청을 받아 비즈니스 로직을 처리하고, 그 결과를 다시 클라이언트에 돌려주는 과정
- 클라이언트로부터 요청을 받음
- DB 연동과 같은 비즈니스 로직 처리
- 처리된 결과를 클라이언트에 돌려 줌
- 요청과 관련된 API : javax.servelet.http.HttpServletRequest 클래스
- 응답과 관련된 API : javax.servlet.http.HttpServletResponse 클래스

HttpServletResponse를 이용한 서블릿 응답
- setContentType()을 이용해 MIME-TYPE을 지정
- 데이터를 출력할 PrintWriter 객체 생성
- 출력 데이터를 HTML 형식으로 만듦
- PrintWriter()의 print나 println()을 이용해 데이터를 출력함
이 때, 아래의 두 줄을 추가해 주어야 한글이 깨지지 않고 제대로 출력된다.
req.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");