CGI (Common Gateway Interface)
웹 서버와 프로그램 사이의 데이터를 주고 받는 규칙.
웹 브라우저 <-> 웹 서버 <-> 프로그램
- CGI 프로그램은 C나 C+, Java와 같은 컴파일 언어로 작성할 수 있으며, Perl, PHP, Python 등 스크립트 언어로도 작성 가능.
컴파일 방식은 기계어로 번역된 코드를 바로 실행하기 때문에 실행 속도가 빠르지만, 변경 사항이 발생할 때 마다 다시 컴파일하고 재배포해야 하는 문제가 있음. 웹 서버 -> (실행) -> C/C++ 프로그램(기계어)
- 스크립트 방식은 소스 코드의 문법을 검증하고 해석해야 하기 때문에 실행속도가 느림. 하지만 변경 사항이 발생하면 소스코드만 수정하면 되기 때문에 편리.
웹 서버 -> (실행) -> 스크립트 엔진 -> (해석) -> .php, .pl, .psp(소스)
서블릿
자바 CGI 프로그램은 C/C++ 처럼 컴파일 방식. 자바로 만든 CGI 프로그램을 서블릿이라고 부름. 서블릿이 다른 CGI와 다른 점은, 웹 서버와 직접 데이터를 주고 받지 않으며, 전문 프로그램에 의해 관리된다는 것. ‘클라이언트에게 서비스를 제공하는 작은 단위의 서버 프로그램’
서블릿 컨테이너
서블릿의 생성과 실행, 소멸 등 생명주기를 관리하는 프로그램. 서블릿을 대신하여 CGI 규칙에 따라 웹 서버와 데이터 통신을 함. 즉 개발자가 CGI규칙 알 필요 없음. 대신 서블릿컨테이너와 서블릿 사이의 규칙을 알아야 함.
웹 서버 <-> 서블릿 컨테이너 <-> 서블릿
WAS의 이해
서블릿과 서블릿 컨테이너의 서블릿 컨테이너와 같이 웹 기술을 기반으로 동작되는 애플리케이션 서비를 WAS라 부름. Java에서 말하는 WAS는 Java EE 기술 사양을 준수하며 만든 서버를 말함. (ex. JEUS , WEB Logic, JBoss, Geronimo 등)
서블릿 컨테이너 (웹 컨테이너)
Java EE 기술 중에서 서블릿, JSP등 웹 관련 부분만 구현한 서버 ex) 톰캣, Jetty 등
서블릿의 생명주기와 관련된 메소드 : init(), service(), destroy()
init() : 서블릿 컨테이너가 서블릿을 생성한 후에 초기화 작업을 수행하는 메소드. 주로 DB 연결. service() : 클라이언트가 요청할 때마다 호출되는 메소드. 실질적 서비스 작업 수행. destory() : 서블릿 컨테이너가 종료되거나 웹 앱을 멈출 때, 서블릿 비활성화 시킬 때 호출되는 메소드. 자원 해제.
서블릿 인터페이스 기타 메소드 : getServletConfig(), getServletInfo() getServletConfig() : 서블릿 정보를 다루는 ServletConfig 객체를 반환. getServletInfo() :서블릿을 작성한 사람에 대한 정보, 서블릿 버전, 권리 등을 담은 문자열 반환.
배치 기술서 web.xml (Depoyment Descriptor)
웹 애프리케이션의 배치 정보를 담고 있는 파일. 따라서 서블릿을 만들었으면 DD 파일에 배치 정보를 등록해야 함.
서블릿 구동 절차
- 요청
- 서블릿 인스턴스가 없다면 클래스로딩
- 인스턴스 생성
- 생성자 호출
- init() 호출
- service() 호출
- 응답
- 컨테이너 종료
- destory() 호출
GenericServlet
servce()말고 init(), destory(), getServletConfig(), getServletInfo()는 상황에 따라 구현하지 않아도 돼. 그래서 등장한게 GenericServlet. 서블릿을 만들 때 GenericServlet을 상속받는다면 Servlet 인터페이스의 메소드 중에서 service()만 구현하면 됨. (service()를 제외한 나머지 메서드는 모두 구현 되어짐)