Servlet (서블릿) 이해하기
Servlet을 이해하기전 왜 Servlet이 나타나게 되었는지 등장배경을 이해하면 쉽게 이해할 수 있다.
1. Web Server
web Server는 웹페이지를 사용자에게 전송하는 서버이다.
- 웹 서버란 HTTP 프로토콜을 기반으로 클라이언트가 웹 브라우저에서 어떠한 요청을 하면 그 요청을 받아 정적 컨텐츠를 제공하는 서버이다.
- 정적 콘텐츠 : 즉시 응답 가능한 컨텐츠 CSS, IMAGE, FILE 등
- Apache가 여기 해당한다.
Q) 만약 로그인 기능을 구현한다고 하면 정적 컨텐츠 만으로 저리가 가능한가?
불가능하다. 그렇기 때문에 동적 처리가 가능한 무언가가 필요하다.
2. CGI (Common Gateway Interface)
CGI는 정적 콘텐츠가 아닌 동적 콘텐츠를 만들어 주는 외부 프로그램을 실행할 수 있도록 해주는 인터페이스이다.
- 외부 프로그램 : 동적 웹 콘텐츠를 생성하는 프로그램
- 실행속도나 텍스트 처리의 용이함 등의 이유로 Python, ruby 등 스크립트 언러를 주로 사용한다.
CGI 장점:
- 스펙만 준수한다면 언어, 플랫폼을 독립적으로 하여도 된다.
- 재사용성이 높다
CGI 단점:
- 요청이 올때마다 새로운 DB 컨넥터를 열어야 하기 때문에 속도가 느리다.
- HTTP 요청마다 스레드를 생성하기 때문에 메모리 문제가 발생한다.
위와같은 문제점을 해결하기 위해 Servlet이 등장한다.
3. Servlet
서블릿은 Java를 사용하여 동적 웹 콘텐츠를 생성하는 서버측 프로그램이다.
- 간단하게 말해서 Java 로 만든 단점을 해결한 CGI
Servlet 특징
- 앞서 말했던 동적으로 작동하는 웹 어플리케이션 컴포넌트
- Java의 Thread를 이용하여 동작
- 사용할 때 HttpServlet을 상속하여 사용
Servlet 메서드
서블릿은 javax.servlet 패키지에 정의된 인터페이스이다.
servlet 인터페이스를 들어가게 되면 서블릿 생명주기에 대한 세 가지 필수 메서드가 있다.
1
2
3
4
5
6
public interface Servlet {
void init(ServletConfig var1) throws ServletException;
void service(ServletRequest var1, ServletResponse var2)
throws ServletException, IOException;
void destroy();
}
- init() method
- Servlet을 생성한 후 초기화 작업을 수행하기 위해 호출한다.
- 데이터베이스 접속, 외부 스토리지 연결, 프로퍼팅 로딩등 Client의 요청을 처리하기전 준비 작업이 있는 경우 여기서 처리한다.
- service() method
- 초기화 후 각 요청마다 호출되고 각 요청은 별도의 자체 스레드에서 처리된다.
- 구현이 필요한 doXXX() 메서드를 override 하여 구현한다.
- destroy() method
- 서버가 종료되거나 해당 서블릿을 비활성화시킬 때 호출한다.
- 데이터베이스 연결 종료와 같은 자원 해체, 저장 마무리 작업을 할때 여기서 처리한다.
위의 생명주기는 Servlet이 직접하지 않고 Servlet을 관리하는 Servlet Container(Web Container)가 하게 된다.
4. Servlet Container
Servlet Container는 말그대로 Servlet의 생명 주기를 관리하고 요청에 따른 스레드를 생성한다.
- Java를 사용하여 서버 측에서 웹 페이즈를 동적으로 생성하기 위함이다.
- web.xml 파일을 이용하여 웹 애플리케이션의 구성 정보를 읽고 처리한다.
- web.xml : 웹 어플리케이션의 배치 서술자로서, 웹 어플리케이션의 구성 정보를 포함하고 있다.
- 자주 사용하는 tomcat이 여기에 해당한다.
- 요청
- 요청이 들어오면 Servlet 클래스가 로딩되어 요청에 대한 Servlet객체가 생성된다.
- init()
- 요청이후 Servlet Contatiner 에서 init()메소드를 호출 초기화하고 쓰레드를 생성한다.
- service()
- 생성된 쓰레드에서 service() 메소드를 통해 요청을 처리하도록 한다.
- 요청정보(GET, POST)에 따라 doGet() , doPost()을 호출하여 처리한다.
- destroy()
- 처리가 완료되면 destroy()를 호출하여 Servlet을 제거한다.
5. WAS (Web Application Server)
- DB조회나 다양한 로직 처리를 요구하는 동적인 컨텐츠를 제공하기 위해 만들어진 Application Server 이다.
- WAS = Web Server + Web Container
마무리
- 동작 방식:
- Web Server는 request를 Servlet Container 에게 위임한다.
- web.xml 설정에서 어떤 URL 과 매핑되어 있는지 확인
- 클라이언트의 요청 URL을 보고 적잘한 Servlet 을 실행
- Web Container는 service() 메서드를 호출하기 전에 Servlet 객체를 메모리에 올린다.
- Web Container는 적절한 Servlet 파일을 컴파일(.class 파일 생성)한다.
- .class 파일을 메모리에 올려 Servlet 객체를 만든다.
- 메모리에 로드될 때 Servlet 객체를 초기화하는 init() 메서드가 실행된다.
- Web Containter는 Request가 올 때 마다 Thread를 생성하여 처리한다.
- 각 thread는 Servlet의 단일 객체에 대한 service() 메서드를 실행한다.
- Web Server는 request를 Servlet Container 에게 위임한다.