
웹 서버는 HTTP/HTTPS 프로토콜을 통해 클라이언트(웹 브라우저)로부터 요청을 받고,
미리 만들어진 웹 페이지를 단순히 요청에 따라 정적 컨텐츠를 제공하는 역할을 한다.
정적 컨텐츠 : HTML, CSS, JavaScript, 이미지 파일 등 즉시 응답 가능한 컨텐츠
대표적인 웹 서버 : Apache HTTP Server, Nginx
만약, 문서의 양이 많아짐에 따라 웹 서버의 용량도 많이 필요해진다면?
1,000명의 유저 정보 페이지가 필요하다면 웹 페이지 1,000개가 필요하다.
-사용자의 요청마다 다른 웹 페이지를 모두 개발해야 한다.
만약, 유저 정보 페이지의 템플릿은 동일하고 템플릿의 정보만 변경된다면?
웹 페이지 1개(유저 정보 템플릿)에 1,000명의 유저 정보를 데이터베이스에 저장한다.
반복되는 템플릿과 유저 정보를 분리해 동적 웹 리소스를 반환한다 - WAS 등장
웹 어플리케이션 서버는 웹 어플리케이션을 실행하고 클라이언트의 요청에 따라 동적 컨텐츠를 생성한다.
사용자의 요청에 따라 데이터베이스와 상호작용하고 비지니스 로직을 처리하며
그 결과로 웹 페이지를 클라이언트에게 제공한다.
동적 컨텐츠 : 웹 페이지의 내용이 고정되어 있지 않고,
사용자의 요청이나 데이터베이스 상태에 따라 실시간으로 생성되는 웹 컨텐츠
대표적인 웹 어플리케이션 서버 : Apache Tomcat, Oracle WebLogic
방금 전까진 웹 어플리케이션 서버가 동적 컨텐츠를 생성한다며 ...?
동적 컨텐츠(동적 웹 페이지)는 웹 어플리케이션 서버와 웹 어플리케이션 간의 협력에 의해 생성된다.
서버 사이드 스크립트란,
웹 서버에서 실행되어 동적 웹 컨텐츠를 생성하는 프로그램 코드를 의미한다.
클라이언트가 웹 페이지를 요청하면 서버 사이드 스크립트가 서버에서 실행되고,
결과를 클라이언트에게 전달한다.
공간 효율
수많은 페이지들을 웹 서버가 들고 있을 필요없이 매번 만들어서 반환한다.
실시간성
요청이 들어온 순간의 데이터로 만들기 때문에 데이터 및 웹 페이지의 신선도가 높다.
초기 웹 어플리케이션 서버(WAS)는 웹 서버와 어플리케이션을 CGI 를 통해 연결했다.

웹 서버가 요청을 받으면 어플리케이션에게 동적 웹 페이지 생성 작업을 위임한다.
이때 웹 서버가 요청을 받아 어플리케이션을 실행하고, 페이지 생성을 요청하기 위한 연결고리가 CGI다.
즉 CGI(Common Gateway Interface)는 웹 서버와 어플리케이션을 연결하기위한 기술이다.
처음 CGI가 등장했을 때 어플리케이션은 Java, Python이 아닌 Shell, Bash같은 스크립트 언어였다.
유명한 서버 스크립트 언어는 PHP, Perl, Ruby가 있다.

CGI와FCGI는 웹 서버와 서버 사이드 어플리케이션 간의 인터페이스를 정의하는 기술이다.
서버 사이드 스크립트를 실행하여 동적 웹 컨텐츠를 생성하는 방법을 제공한다.
CGI는 웹 서버와 웹 어플리케이션간의 통신을 위한 표준 인터페이스로,
CGI프로그램은 웹 서버의 요청을 받아 실행되며, 실행 결과를 웹 서버를 통해 클라이언트에게 반환한다.
CGI는 클라이언트의 매 요청마다 웹 서버가 새로운 프로세스를 생성한다.
CGI는 Stateless(비상태성)하다.
FCGI는 CGI의 성능 문제를 해결하기 위해 개발됐으며, CGI의 기본 아이디어를 유지며 성능을 개선한다.
FCGI는 지속적인 프로세스를 사용하여 요청을 처리하며, 성능을 향상시키고 자원을 절약한다.
FCGI는 웹 서버와 별도로 지속적으로 실행되는 프로세스다.
요청이 들어오면 웹 서버는 FCGI 프로세스와 연결하여 요청을 전달한다.
FCGI프로세스는 요청을 처리한 후 결과를 웹 서버로 반환한다.
FCGI는 요청 처리가 완료된 후에도 프로세스를 유지하므로,
동일한 프로세스가 여러 요청을 처리한다.
매번 요청에 따라 이미 열려있던 프로세스가 웹 페이지를 만들고 반환하고,
프로세스는 계속 살아있는다. - 상주 프로세스
FCGI는 Stateful(상태성)하다.

웹 애플리케이션 서버(WAS)는 사용자 요청을 처리하는 데 적절한 어플리케이션을 호출하고, 그 애플리케이션 내에서 서버 사이드 스크립트를 실행하여,
웹 서버(WS)가 단독으로 처리할 수 없는 데이터베이스 조회나 다양한 로직 처리 필요한
동적 콘텐츠를 생성한다. 이 동적 콘텐츠는 사용자의 요청에 따라 실시간으로 생성되며,
그 결과를 클라이언트(브라우저)로 전달한다.
WAS는 위에서 살펴본 초기 WAS에서 CGI 비상주 프로세스의 Stateless한 장점과
FCGI 상주 프로세스의 Stateful한 장점을 Thread를 통해 얻어냈다.
하나의 요청이 들어오면, 하나의 스레드가 해당 요청에 대해 할당된다.
스레드 풀(Thread Pool)에 개수를 지정해 미리 만들어놓고1요청 : 1스레드의 관계를 가진다.
1요청에 대해 할당되는 1자바 스레드는 서블릿(Servelt)이라 불린다.
서블릿 컨테이너(Servelt Container)는 요청이 오면 스레드를 할당하고,
완료 뒤 회수하는 주체로 서블릿의 생명주기를 관리한다.
템플릿 엔진(Template Engine)은 웹 어플리케이션 개발에서
동적 웹 페이지를 생성하기 위해 사용되는 도구 또는 라이브러리다.
HTML파일에 템플릿 문법을 사용해 동적으로 내용을 삽입하거나 변경할 수 있도록 한다.
만약, 유저 정보 페이지의 템플릿은 동일하고 템플릿의 정보만 변경된다면?
웹 페이지 1개(유저 정보 템플릿)에 1,000명의 유저 정보를 데이터베이스에 저장한다.
반복되는 템플릿과 유저 정보를 분리해 동적 웹 리소스를 반환한다
ViewTemplateModelView(HTML)
WAS에서 많이 사용되는 아키텍처 중 하나가 MVC패턴이다.
MVC패턴은 Model-View-Controller의 약자로, 어플리케이션을 세 가지 주요 구성요소로 나누어 관리하는 디자인 패턴이다.
데이터베이스에서 Model(데이터)를 조회하여 그걸 기반으로 View(웹 페이지)를 만들어 Controller가 반환한다.
Controller가 호출하면 데이터베이스와 연동해 데이터를 조회/조작한다.Model을 기반으로 만들어진 웹 페이지
User의 요청을 받아 Controller는 응답으로 View를 반환한다.
View) - Controller가 반환해준 것Model을 바꿔달라는 요청을 View의 자바스크립트를 통해 Controller 호출사용자 요청을 받아 처리하고, 적절한 모델(Model)을 호출해 데이터를 가져와
그 데이터를 뷰(View)에 전달하는 역할을 한다.
URI가 정의되어 있다.(엔드포인트)1. 사용자의 요청(Request)
사용자가 브라우저에서 특정 URL을 입력하거나 버튼을 클릭해 요청을 보낸다.
이 요청은 웹 서버를 WAS로 전달된다.
2. Controller의 요청 처리
3. Model의 데이터 처리
4. View의 생성과 템플릿 엔진의 역할
5. 사용자에게 응답(Response)
https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html