CGI 란?
CGI란 웹 서버와 외부프로그램 간의 통신을 위한 인터페이스로, 클라이언트의 동적 자원 요청을 처리하기 위해 사용됩니다.
여기서 외부 프로그램(CGI 프로그램) 은 Python, C, PHP 등 여러 언어에서 CGI 인터페이스를 기반으로 구현하고, 웹 서버는 동적인 자원에 대해 요청이 발생하면 해당 CGI 프로그램을 호출한 뒤 결과를 클라이언트에게 반환합니다.
이 CGI는 클라이언트의 요청이 발생할 때 마다 매번 프로세스를 생성해서 시스템 자원을 비효율적으로 사용한다는 단점이 있는데, Java에서는 이런 단점을 보완하기 위해 CGI 대신 Servlet 기술을 사용합니다.
Servlet 이란?
Servlet은 자바 언어에서 CGI의 단점을 보완하며 동적으로 클라이언트의 요청을 처리하기 위해 제공되는 웹 프로그래밍 기술로 멀티 스레드 기반으로 동작합니다.
Servlet 특징
1. Java Thread를 사용해서 클라이언트 요청을 동적으로 처리한다
- 매번 요청이 들어올 때 마다 새로운 스레드를 생성해서 service() 메서드를 실행한다.
2. 서블릿 컨테이너 (또는 웹 컨테이너)에 의해 생명주기가 관리된다.
- 서블릿 컨테이너는 서블릿의 생명주기를 관리하고 클라이언트의 요청을 받아서 처리한 뒤 응답한다
3. 자바로 구현되어 플랫폼 독립성을 제공한다
- 서블릿 컨테이너는 서블릿의 생명주기를 관리하고 클라이언트의 요청을 받아서 처리한 뒤 응답한다
Servlet 계층 구조
1. Servlet
가장 최상위 인터페이스로 init(), service(), destroy()와 같은 핵심 기능을 정의해놓은 인터페이스 입니다.
init()
- 서블릿(웹) 컨테이너에 의해 호출되어 서블릿을 초기화 하는 메서드로 단 한번만 호출된다.
service()
- 실질적인 클라이언트의 요청을 처리하도록 하는 메서드
- ServletRequest 객체를 전달 받으면 doGet, doPost와 같은 메서드를 호출해서 웹 요청을 처리한다.
- 클라이언트 요청이 들어올 때 마다 새로운 thread를 생성해서 수행한다.
destroy
- 서블릿 소멸할 때 호출되는 메서드로 init() 과 동일하게 단 한번만 호출된다
getServletConfig()
- 서블릿 초기화를 위한 정보를 가지고 있는 ServletConfig의 객체를 반환한다.
- 해당 객체는 init() 메서드에 전달된 객체이다.
getServletInfo()
- 서블릿에 대한 정보(버전, 작성자 등)를 반환한다.
2. ServletConfig
Servlet 초기화 시 Servlet Name, Servlet Context 객체와 같이 필요한 정보를 전달하기 위한 인터페이스입니다.
3. GenericServlet
GenericServlet은 Servlet 구현을 위해 필요한 필수 메서드만 구현하도록 정의한 추상 클래스 입니다.
Servlet, ServletConfig 인터페이스를 상속 받아서 공통적으로 사용되는 메서드는 간단하게 구현해놓고, 필수로 구현해야 하는 service() 메서드만 추상 메서드로 정의합니다.
4. HttpServlet
HttpServlet은 HTTP 웹 요청을 처리하기 위해 구현 된추상클래스로, GenericServlet을 상속 받고 웹 요청을 처리하기 위한 거의 모든 메서드를 내부에 구현 해놓았습니다. (서블릿을 실행하기 위한 service() 메서드 까지 구현되어 있습니다)
HTTP 프로토콜에 한정적이어서 다른 프로토콜을 사용할 때는 사용할 수 없지만 doGet() / doPost()와 같은 HTTP 통신을 위한 다양한 메서드가 제공돼서 웹 애플리케이션 개발 시 주로 사용되는 클래스입니다. (GenericServlet의 경우 다양한 프로토콜에 대응이 가능합니다.)
Servlet의 동작 방식
- 클라이언트가 웹 서버에 HTTP 요청한다.
- 정적 자원에 대한 요청이라면 WEB 서버가 바로 처리하고, 동적 자원에 대한 요청이라면 서블릿 컨테이너(WAS)에게 보낸다.
- 서블릿 컨테이너는 HTTP 요청 정보를 담는 HttpServletRequest와 그에 대응하는 HttpServletResponse 객체를 생성한다.
- Web.xml 또는 @WebServlet 어노테이션과 같은 설정 정보를 통해 요청을 처리할 서블릿을 조회한다
- 처리할 서블릿이 메모리에 올라와 있는지 확인하고, 없을 경우 init() 메서드로 초기화해서 인스턴스를 생성한다.
- 생성된 인스턴스의 service() 메서드를 호출한다. 이 때 요청 메서드 별로 doGet(), doPost() 등 메서드로 분기된다
- service() 메서드를 수행 한 뒤 결과를 HttpServletResponse를 통해 반환한다.
- 컨테이너가 서블릿이 더이상 사용하지 않는다 판단되거나 서버가 종료할 때 destroy() 메서드를 실행해서 servlet을 제거한다
참고
https://sgcomputer.tistory.com/226
https://velog.io/@falling_star3/Tomcat-%EC%84%9C%EB%B8%94%EB%A6%BFServlet%EC%9D%B4%EB%9E%80
'Study > Java' 카테고리의 다른 글
[Java] Collection Framework 의 개념과 Collection 종류 (0) | 2024.01.17 |
---|---|
[Java] JVM의 개념과 구조 (0) | 2024.01.16 |
[Java] Entity, DTO, VO 개념과 차이 (0) | 2023.10.31 |
[Java] 객체 지향 설계의 5가지 원칙 (SOLID) (0) | 2023.10.02 |
[Java] OOP와 4가지 특징 (0) | 2023.10.02 |