웹 서버(WS)와 웹 어플리케이션 서버(WAS)

 

 

01. 웹서버 : 정적 웹 리소스 반환

웹서버는 외부에 제공하고자 하는 논문, 연구 결과 등을 웹페이지 형태로 한데 모아 요청에 따라 반환한다.

정적 웹페이지는 미리 만들어진 HTML, CSS 파일 같은 웹페이지를 말하는데, 이 파일들은 변하지 않는 고정된 콘텐츠를 가지고 있다.

웹 서버는 사용자로부터 요청을 받으면, 미리 만들어진 정적 파일을 찾아 그대로 반환한다. 이 과정은 마치 이미 만들어진 포장된 햄버거를 요청에 따라 그대로 내어주는 것과 같으며, 추가적인 처리가 필요하지 않고 그대로 반환해준다.

 

하지만, 만약 문서의 양이 많아지면 웹 서버의 용량이 많이 필요하다.

예를 들어, 1000명의 유저 정보 페이지를 만들려고 하면, 1000개의 개별적인 HTML 파일을 만들어야 한다.

유저 정보 페이지처럼 반복되는 템플릿에 일부 정보만 변경되는 경우, 모든 페이지를 미리 만들어 저장하는 것 보다는 반복되는 템플릿과 유저 정보를 분리해 관리하는 것이 효율적이다.

 

이런 방식은 동적 웹페이지를 생성하는 방법으로 웹 서버에서의 단순 반환이 아닌 웹 어플리케이션 서버가 동작하여 요청 시점에 콘텐츠 등을 동적을 생성하게 된다.

 

 

 

 

02. 웹 어플리케이션 서버(WAS) : 정적 + 동적 웹 리소스 반환

웹 어플리케이션 서버는 이미 만들어진것을 반환하는 것이 아닌, 요청에 따라 웹 페이지를 만드는 동적 웹페이지 방식으로, 요청을 받으면 동적 웹페이지를 생성하고 그 결과를 사용자에게 반환한다. 정적 웹페이지는 이미 만들어진 포장된 버거처럼 요청시 바로 제공되지만, 동적 웹페이지는 주문에 따라 수제로 만들어지는 버거처럼 그 자리에서 만들어서 제공된다.

 

💡 동적 웹페이지의 장점

  • 공간 효율: 수많은 페이지들을 웹 서버가 들고있을 필요 없이 매번 만들어서 반환하므로, 서버 공간을 절약
  • 실시간성: 요청이 들어온 순간의 데이터로 만들기 때문에 데이터 및 웹페이지의 신선도가 높음

 

 

#1. 초기 웹 어플리케이션 서버 : 웹 서버 + 어플리케이션 - CGI 를 통한 연결

웹 서버는 기본적으로 정적 리소스를 반환하지만, 동적 리소스를 제공하려면 어플리케이션이 필요하다.

웹 서버가 요청을 받아 어플리케이션을 실행하고 페이지 생성을 요청하기 위해서는 CGI가 필요하다.

 

💡 CGI(Common Gateway Interface)

: 웹 서버와 어플리케이션을 연결하기 위한 기술로

: 웹 서버가 받은 요청을 어플리케이션에 전달하고, 어플리케이션이 생성한 동적 콘텐츠를 클라이언트에게 반환할 수 있게 해주는 역할 수행

 

처음 어플리케이션은 스크립트 언어(PHP, Perl, Ruby)로 작성되었다.
PHP는 특히 간단한 웹페이지 제작용으로 많이 사용된 서버 스크립트 언어이다.

 

 

 

 

#2. 프로그램, 프로세스, 스레드

💡 프로세스

프로세스는 프로그램이 실행되는 단위이다.

각 프로세스는 독립적인 실행 환경을 가지고, 메모리와 자원도 독립적으로 할당된다.

프로세스는 실행 단위가 크고, 한 개의 프로그램에 한 개의 프로세스만 존재한다.

ex) 웹 브라우저가 열릴 때마다 새로운 프로세스가 실행된다.

 

💡 스레드

스레드는 프로세스 내에서 실행되는 작은 실행 단위이다.

스레드의 실행 단위는 작고, 하나의 프로세스 내에 여러 스레드가 존재할 수 있다.

ex) 웹 브라우저 내에서 여러 탭이 동시에 열려 있는 상황에서 각 탭이 하나의 스레드로 처리될 수 있다.

 

 

 

 

#3. 스레드의 장점 : 다중 작업

  • 한 프로레스 내에서 여러 스레드가 동시에 작업을 처리할 수 있으므로, 여러 작업을 변렬로 수행할 수 있다.
  • 스레드는 프로세스보다 실행 단위가 작아졌기 때문에 다중 작업을 수행할 때 시스템 자원을 더 효율적으로 사용할 수 있다.

 

 

 

#4. 현대 웹 어플리케이션 서버 : Tomcat 의 예

  • 과거: 웹 어플리케이션 서버는 웹 서버와 어플리케이션을 연결하는 CGI를 포함한 구조
  • 현재: 웹 어플리케이션 서버는 더 발전하여 Tomcat과 같은 WAS는 자체적으로 어플리케이션을 포함하고 동적 웹페이지를 생성.

 

 

 

03. 웹 서버에서 웹 어플리케이션 서버로의 변천사

#1. Web Server 웹 서버, WS (Apache, Nginx 등)

◼︎ CGI 초기 = 1요청 : 1비상주 프로세스

요청이 들어올 때마다 새로운 프로세스가 생성되어 웹 페이지를 처리하고 반환한 후 종료된다.

매 요청마다 새로운 프로세스가 생성-실행-종료 이기 때문에 각 요청 간에 상태 정보를 유지하지 않으므로, 요청 간 정보가 공유되지 않는다.

즉, 어제 실행된 프로세스와 오늘 실행된 프로세스가 독립적이다.

 

 

◼︎ FCGI = 1요청 : 1상주 프로세스

매번 요청에 따라 이미 열려있던 프로세스가 웹 페이지를 만들고 반환한다.

즉, 프로세스가 항상 열려있어 요청이 들어오면 기존 프로세스가 웹 페이지를 처리해 반환한다.

프로레스가 계속 상주해있기 때문에 CGI 초기보다 매 프로세스 준비기간이 줄어든다.

 

아무리 많은 요청이 와도 기존 프로세스가 실행(반환)만 하기 때문에 요청 간 정보가 공유된다.

다시 말해 동일한 프로세스가 여러 요청을 처리하므로, 요청 간에 정보를 공유할 수 있는 것이며, 어제 실행된 프로세스랑 오늘 실행된 프로세스는 같은 프로세스이기 때문에 같은 정보를 공유한다.

 

 

◼︎ PHP

PHP = CGI를 내장하는 방식의 PHP + 어플리케이션을 웹 서버가 내장하고 있는 방식의 PHP 5.4+

 

초기 PHP는 CGI를 내장하는 방식을 통해 웹 서버와 연결되어 사용되었다. 이는 CGI와 유사한 방식으로 요청할 때마다 새로운 프로세스가 실행되었다. PHP 5.4이후부터 웹 서버가 PHP 어플리케이션을 내장하는 방식으로 변화하였다. 즉 웹 서버와 PHP 어플리케이션이 결합된 형태로, PHP와 웹서버가 통합되어 운영되며 웹 서버가 PHP 어플리케이션을 내장하여 함께 동작한다.

 

PHP는 홈페이지를 제작하기 위한 언어, 스크립트 언어이기에 절차적 프로그래밍 언어로, 코드가 순차적으로 실행되는 방식이다.

PHP의 한계를 넘어서기 위해 객체지향 프로그래밍을 지원하는 자바 기반의 기술이 등장하였다.

Java의 등장으로 어플리케이션 개발 패러다임이 이동하였고, JSP, Servlet 등의 자바 기반 웹 어플리케이션 서버 근간 기술이 폭발하였다.

 

프로그래밍 패러다임
- 절차적 프로그래밍: 코드가 순차적으로 실행되는 방식
- 객체지향 프로그래밍: 코드의 재사용성, 유지보수성을 높이기 위해 도입. 자바와 같은 언어들이 객체지향 프로그래밍 지원
- 함수형 프로그래밍: 수학적 함수의 개념을 바탕

 

 

 

#2. Web Application Server 웹 어플리케이션 서버, WAS (Tomcat, Netty 등)

WAS는 1요청: 1스레드로 상주 프로세스의 Stateful 장점과 비상주 Stateless 의 장점을 스레드를 통해 얻어내어, 요청이 들어올 때마다 새로운 스레드를 매번 생성하는 대신, 미리 생성해 놓은 스레드들 중에서 하나를 할당한다. 이 스레드들은 작업을 끝낸 후 다시 스레드풀(Thread Pool)에 반환된다.

 

💡 스레드 풀(Thread Pool)

스레드 풀은 몇 개의 스레드를 만들어놓고 대기시킬지 개수를 지정해놓으며, 미리 정해진 수의 스레드를 준비해놓고, 요청에 따라 이 스레드들을 할당해서 작업을 처리한다. 요청을 처리한 후, 스레드는 다시 스레드 풀로 돌아가서 다음 요청을 기다린다.

매번 요청마다 스레드를 만들기보다 미리 만들어놓고 필요에 따라 할당만 한다.

 

💡 서블릿(Servlet)

1요청에 대해 할당되는 1자바 스레드를 서블릿이라 부른다.

즉, 자바에서 각 요청을 처리하는 스레드를 서블릿이라 부르며, 서블릿은 요청을 받고 처리한 후 결과를 반환한다.

 

💡 서블릿 컨테이너(Servlet Container)

요청이 오면 갖고있는 스레드를 할당하고, 완료 뒤 회수하는 주체이다.

서블릿을 관리하고, 요청이 오면 적절한 스레드를 할당하고, 작업이 끝나면 스레드를 다시 회수하는 역할을 한다.

서블릿 컨테이너는 서블릿 관리자라고도 할 수 있다.

 

 

#3. WAS 웹 어플리케이션 서버 내 템플릿 엔진

동적 웹페이지를 만들기 위해서는 반복적인 템플릿 & 데이터가 필요하다.

반복적인 템플릿은 동적 웹 페이지를 생성할 때, 동일한 형식의 페이지를 여러 개 만들기 위해 사용하는 템플릿을 말하며, 데이터는 웹페이지에 표시할 실제 정보를 말한다.

 

  • ViewTemplate = 반복적인 템플릿
  • Model = 데이터
  • View(HTML) = 동적 웹 페이지

 

 

 

#4. 템플릿 엔진 동작 원리로 이해하는 WAS 의 MVC (Model - View - Controller)

데이터베이스에서 Model(데이터)를 조회하여 그걸 기반으로 View(웹 페이지)를 만들어 Controller 가 반환한다.

 

◼︎ Controller

Controller는 사용자의 요청을 받고 해당 요청에 따라 필요한 연산(작업, 로직)을 수행한 후 결과를 반환한다.

예를 들어, 웹 페이지에서 버튼을 클릭하는 등의 이벤트가 수행되면, 이 요청이 Controller로 전달되어 해당 요청에 맞는 작업을 수행하게 된다. 요청을 받고 결과를 반환하기 위해 URI가 정의되어 있으며, 각 URI는 특정 Controller 기능과 연결되어 있다.

 

◼︎ Model

Model은 데이터를 조회하거나 수정하는 역할을 수행한다.

 

◼︎ View

View는 사용자에게 보여질 웹페이지를 생성하여 반환한다.

 

View는 Model에서 가져온 데이터를 사용하여 웹 페이지를 생성한다. 이 데이터를 기반으로 HTML을 생성하여 사용자에게 보여줄 웹 페이지를 만들게 되는 것이다. 사용자가 웹 페이지에서 어떤 이벤트를 수행하면 이 요청을 Controller로 전달되며, Controller는 이 요청을 처리하고 필요한 로직을 수행한 후 그 결과를 View에 전달한다. View는 처리된 데이터를 사용자에게 보여주게 되는 것이다.

 

사용자는 웹페이지에서 자바스크립트를 통해 다양한 상호작용을 할 수 있다.

자바스크립트는 Controller를 호출하여 특정 요청을 보내고, Controller는 이 요청을 받아서 데이터를 업데이트하고, 업데이트된 데이터를 다시 View에 반영되게 된다.

다시 말해, Model(데이터)를 바꿔달라는 요청을 View의 자바스크립트를 통해 Controller를 호출하고, Controller는 이 요청을 받아 데이터를 업데이트하며, 업데이트된 데이터를 View에서 다시 반영되어 사용자가 볼 수 있게 되는 것이다.

 

 

 

 

 

반응형