어제에 이어서 servlet을 더 살펴보자.
사용자(클라이언트)가 URL(Uniform Resource Locator)을 클릭하면 HTTP Request(요청)를 Servlet Container로 전송한다.
Http Request를 전송 받은 Servlet Container는 아래의 두 객체를 생성한다.
-> HttpServletRequest(요청 관련 내용이 저장된 객체)
-> HttpServletReponse(응답 관련 내용이 저장된 객체)
DD(배포서술자, Deployment Descriptor) = web.xml은 사용자가 요청한 URL을 분석하여 어떤 서블릿 클래스에 요청 내용을 전달할지 찾는다.
해당 Servlet에서 init() 메서드를 먼저 호출한 뒤 service() 메서드를 호출하여 클라이언트로부터 전송 받은 방식인 GET, POST 여부에 따라서 해당 메서드(doGet() / doPost())를 호출한다.
doGet() / doPost() 메서드는 동적 페이지를 생성 후 HttpServletResponse 객체에 응답을 보낸다.
응답 종료 시 HttpServletRequest, HttpServletReponse 객체가 소멸된다.
- 배포를 위한 포트 연결, 웹 서버 통신을 위한 소켓, 입/출력 스트림을 생성하는 역할을 한다.
-> WAS(Web Application Server)가 Servlet Container에 해당하면 대표적으로 Tomcat이 있다.- Servlet : 어떤 역할을 수행하는 정의서
- Servlet Container : 정의된 servlet을 보고 수행
- 클라이언트의 요청을 받을 때 마다 새로운 자바 스레드(Thread)를 만들어 요청을 처리하고 응답을 해준다.
웹 서버와의 통신을 지원한다.
-> 서블릿과 웹 서버가 손쉽게 통신할 수 있게 해준다.
-> 일반적으로 소켓을 만들고 listen, accept등을 해야 하지만 서블릿 컨테이너는 이러한 기능을 API로 제공해 복잡한 과정을 생략해준다.
서블릿 생명주기(Life Cycle) 관리
-> 서블릿 클래스를 로딩하여 인스턴스화 하고, 초기화 메서드를 호출하고, 요청이 들어오면 적절한 서블릿 메서드를 호출한다.
-> 서블릿이 생명을 다 한 순간에는 적절하게 가비지 컬렉션을 진행하여 편의를 제공한다.
멀티쓰레드 지원 및 관리
-> 서블릿 컨테이너는 요청이 올 때마다 새로운 자바 스레드를 생성하는데 http 서비스 메서드를 실행하고 나면 스레드는 자동으로 사라진다.
-> 원래는 스레드를 관리해야 하지만 서버가 다중 스레드를 생성/운영을 해주기 때문에 스레드의 안정성에 대해서는 걱정을 하지 않아도 된다.
선언적인 보안 관리
-> 서블릿 컨테이너를 사용하면 개발자는 보안에 관련된 내용을 서블릿 또는 자바 클래스에 구현하지 않아도 된다.
-> 일반적으로 보안관리는 xml배포 서술자(DD (web.xml))에다가 기록하기 때문에 보안에 대해 수정할 일이 생겨도 자바 소스 코드를 수정하여 다시 컴파일하지 않아도 보안관리가 가능하다.
클라이언트 플랫폼 정보 및 브라우저 정보 : String request.getHeader("User-Agent")
Request 관련 쿠키 : Cookies[] cookies = request.getCookies();
클라이언트 세션 정보 : HttpSession session = request.getSession();
HTTP 메소드 : String method = request.getMethod();
출력스트림(PrintWriter, ServletOutputStream)을 이용하여 HTML 등을 작성하고 클라이언트에게 돌려보낼 setContentType()을 정한다.
그 밖에 헤더정보 설정, 오류를 발생시키거나 쿠키를 추가