Servlet 동작 순서
- 웹 브라우저
- 웹 서버
- 웹 어플리케이션 서버
- 서블릿 컨테이너(스레드 생성 -> servlet 객체 생성)
Servlet 기술: CGI를 대신할 수 있는 Java 기술
CGI의 차이점
1)
기존 CGI
- 로딩과 초기화 작업을 진행하기 때문에 서버에 대한 오버헤드가 크다.
서블릿
- 한번 메모리에 로딩되어 수행되면 작업이 모두 수행되어 끝나더라도 메모리에서 해제되지 않는다(재활용).
- 계속적인 수행 요청이 들어와도 메모리 로딩이나 초기화 처리하지 않는다.
- 모든 서블릿은 한번만 메모리에 로딩 되어진다.
2) 특정 웹 서버에 비의존적이다.
- Java 언어로 구현되는 프로그램이기 때문에 플랫폼(운영체제)과는 무관한 실행 파일을 만들 수 있다.
- 기존의 CGI는 성능향상을 위해 추가적인 API가 필요했던 것에 비해서, Servlet API를 활용해서 개발하면 된다. Servlet 엔진만 활용해도 된다.
3) 서블릿은 멀티 스레드로 동작한다.
- Servlet은 CGI처럼 웹 브라우저로부터의 요청에 대해 각각의 프로세스를 생성하지 않는다.
- 각 요청에 대해서 스레드로 동작
Servlet의 생명주기(Life Cycle)
1. Servlet 객체 생성 - 최초 한 번
2. init() 호출 - 최초 한 번
3. service(), doGet(), doPost() 호출 - 요청될 때마다
4. destroy() 호출 - 마지막 한 번
Servlet 선처리, 후처리
객체 생성 -> init() -> service() -> destroy()
선처리: init() 전 - 의존하는 객체를 설정한 이후에 초기화 작업을 수행할 메서드에 적용
후처리: destroy() 후 - 컨테이너에서 객체를 제거하기 전에 호출된 메서드에 적용
@PostConstruct: 선처리를 위한 어노테이션
@PreDestroy: 후처리를 위한 어노테이션
한글 처리
톰캣 서버의 default 문자 처리 방식은 ISO-8859-1 방식이다.
따라서 별도의 한글 인코딩을 하지 않으면 한글이 깨질 수 있다.
get과 post의 한글처리가 다르다.
- get - Servers/Tomcat 폴더 내에 있는 server.xml에서 에 URIEncoding="EUC-KR" 속성 추가
- post - doPost 메서드 내에서 설정한다. request.setCharacterEncoding("EUC-KR")