Web Server와 Servlet, 그리고 WAS
Web Server
클라이언트에게 정적인 컨텐츠(정적 웹 페이지)를 제공한다.
또한, 동적 웹 페이지를 제공하기 위해 클라이언트의 요청을 웹 어플리케이션에 전달하고, 그 결과를 받아 동적인 컨텐츠를 제공하기도 한다.
CGI (Common Gateway Interface)
동적 웹 페이지를 만들기 위해 웹 서버와 웹 어플리케이션이 데이터 (요청과 응답)를 주고 받기 위한 규약이다.
인터페이스이기 때문에, 과거에는 Perl이나 C 등의 언어로 구현한 CGI 프로그램을 웹 어플리케이션처럼 사용했다.
CGI의 문제점
매번 request가 들어올 때마다 프로세스를 생성하고, 요청이 끝날 때 프로세스가 종료되어 자원이 반환된다.
⇨ 단시간에 많은 요청이 오면, 서버가 죽는다.
⇨ 같은 요청도 서로 다른 프로세스를 생성하여 처리하기 때문에 비효율적이다.
Servlet
CGI의 문제점을 개선하기 위해 개발된 자바 프로그램(클래스)이다.
서블릿은 하나의 프로세스를 유지하며, 요청이 들어올 때마다 쓰레드를 생성하여 처리한다.
Servlet의 생명 주기
1. init()
- 서블릿 객체를 초기화하며, 맨 처음 한 번만 호출된다.
2. service(req, res)
- 서블릿이 수신한 모든 request에 대해 service 메소드가 호출된다.
- service 메소드는 request의 type(HTTP 메소드)에 따라 적절한 처리 메소드(doGet, doPost, doPut 등…)를 호출한다.
3. destroy()
- 서블릿 객체를 제거하며, 웹 어플리케이션이 갱신되거나 종료될 때 호출된다.
Servlet Container
컨테이너 혹은 웹 컨테이너라고도 불린다.
서블릿의 생명 주기를 관리하고 요청을 처리하는 컨테이너이다.
요청을 처리할 때, 서블릿 객체가 이미 존재하면 init 메소드를 호출하지 않고, service를 처리하게 해준다.
또한, 서블릿과 웹 서버가 통신을 위해 소켓을 만들고 listen 등의 통신 과정이 있어야 하지만, 이러한 기능을 API로 제공해서 쉽게 통신할 수 있게 해준다.
Servlet Container의 주요 기능
1. 통신
- 서블릿과 웹 서버가 통신을 위해 소켓을 만들고 특정 포트에 대한 listen 등의 통신 과정이 있어야 하지만, 이러한 기능을 API로 제공해서 쉽게 통신할 수 있게 해준다.
2. 멀티 쓰레드 관리
- 원래 직접 쓰레드를 관리해야 하지만, 서블릿 컨테이너가 쓰레드를 생성, 운영해준다.
- 요청이 올 때마다 쓰레드를 생성하고, 처리가 완료되면 쓰레드를 제거한다.
3. 생명 주기 관리
- 요청이 왔을 때 그에 적합한 서블릿을 찾고, 서블릿이 service를 처리하게 한다.
- 만약 서블릿 객체가 없다면, init 메소드를 호출하여 서블릿 객체를 만들고 service를 처리하게 한다.
4. JSP 지원
- 요즘은 잘 사용하지는 않지만, JSP를 지원한다.
JSP (Java Server Page)란?
HTML 코드 안에<% %>
등의 태그를 사용해서 자바 코드를 사용해 동적 웹페이지를 생성할 수 있게 하는 자바 기반의 기술이다.
JSP를 사용하기 위해서는 추가적인 설정이 필요하기도 하고 thymeleaf와 같은 다른 템플릿 엔진이 편의성 등의 부분에서 장점이 많기 때문에, 최근 스프링 부트에서 JSP를 권장하지 않는다.
WAS (Web Application Server)
DB 조회 등 다양한 로직을 처리해 동적인 컨텐츠를 제공하는 서버이다.
즉, Web Server + Web Container의 역할을 한다.
왜 WAS를 사용할까?
웹 서버 + CGI로도 동적인 컨텐츠를 제공할 수 있지만, CGI 방식이 비효율적이기 때문에 쓰레드 기반의 서블릿을 사용하는 WAS가 효율적이다.
웹 서버 + WAS의 장점
1. 확장성 및 부하 분산
- 단순한 정적 컨텐츠는 웹 서버에서 제공하게 하고, 동적 컨텐츠 관련 처리는 WAS에서 담당하게 하는 방식으로 부하를 분산시킬 수 있다.
- Load Balancing을 통해 여러 대의 WAS를 사용할 수도 있다. (자세한 내용은 웹 서비스 아키텍처 학습)
2. 보안 강화
- 웹 서버가 앞단에서 방화벽이나 리버스 프록시의 역할을 수행할 경우, 트레픽을 필터링하는 등 보안을 강화할 수 있다.
- WAS가 내부망에 있을 때 SSL 암복호화 처리를 웹 서버에서 하게 되면 WAS는 HTTP로 통신할 수 있어 WAS의 부담을 줄일 수도 있다.