Web

<Web> WS (Web Server ) & WAS (Web Application Server)

이게왜 2024. 4. 30. 17:11

지난 글에 이어 Web에 대해 작성해 보도록 하겠습니다.

이번 글에서는 WS (Web Server)와 WAS (Web Application Server)에 대해 다루겠습니다.

지난 글을 읽으시면 더욱 좋습니다!!

2024.04.24 - [Web] - 웹의 동작방식

 

<Web> 웹의 동작방식

이번 글에서는 웹의 동작방식 대해 공부한 내용을 작성해 보겠습니다.조금 구구절절할 수 있지만 최대한 정리해 작성해 보겠습니다. 도망친곳에 낙원은 없다 = 도망쳐서 도..

rezerocodinglife.tistory.com

WS / WAS 시작!


WS(Web Sever)

WS(Web Sever)는 클라이언트로부터 HTTP 요청을 받아들이고, 웹 페이지, 이미지, 동영상 등의 정적인 콘텐츠를 제공하는 소프트웨어 시스템입니다. 대표적으로 Apache, Nginx, IIS 등이 있으며, 클라이언트의 요청에 따라 해당하는 파일을 찾아 응답으로 전송합니다.

 

또한, 미리 만들어진 웹 페이지를 단순히 요청에 따라 반환하기 때문에 정적 웹 페이지 라고 합니다.

 

 

초기 웹 환경에서는 주로 정적인 콘텐츠(HTML 파일, 이미지 등)를 제공하는 것이 주목적이었습니다.

이때 사용되는 서버를 Web Server(WS)라고 합니다.

WS는 사용자의 요청에 따라 저장된 파일을 그대로 전달하는 역할을 합니다.

Apache HTTP Server나 Nginx가 이러한 웹 서버의 대표적인 예입니다.


WS의 한계와 동적 콘텐츠의 필요성 증가

WS의 한계

  • 만약, 문서의 양이 많아짐에 따라서 웹 서버의 용량도 많이 필요해진다면?
  • 만약, 유저 정보페이지처럼 반복적인 템플릿에 일부 정보만 변경된다면?

예를 들어, 1000명의 유저가 있는 웹페이지가 존재한다고 가정해 봅시다.

이 웹페이지가 WS를 사용한다면 유저 각각의 웹페이지가 있어야 하며, "유저정보만 다른" 1000개의 웹페이지를 가지고 있어야 합니다.

이러한 한계를 극복하기 위해 WAS(Web Application Sever)가 등장하였습니다.

 

동적 콘텐츠의 필요성 증가

웹이 발전하면서 사용자와 상호작용하는 동적인 웹 페이지의 필요성이 증가했습니다.

사용자의 입력을 받아 실시간으로 데이터를 처리하고 결과를 반환하는 등의 기능이 요구되었습니다.

이러한 동적인 처리를 위해 서버 측에서 프로그래밍이 가능한 환경이 필요하게 되었습니다.

(WS는 동적 처리가 불가능)


WAS (Web Application Server)

동적인 웹 페이지를 처리하기 위해 등장한 것이 Web Application Server(WAS)입니다.

WAS는 사용자의 요청에 따라 서버에서 실행되는 애플리케이션을 통해 요청을 처리하고 결과를 반환합니다.

즉, 클라이언트의 요청에 따라 프로그램을 실행시켜 동적인 콘텐츠를 생성하고 관리할 수 있습니다.

대표적인 WAS로는 Apache Tomcat, JBoss, IBM WebSphere 등이 있습니다.

 

  • 동적 웹 페이지의 장점
    • 공간 효율 : 수많은 페이지들을 웹 서버가 들고 있을 필요 없이 매번 만들어서 반환함으로 공간 효율이 좋다.
    • 실시간성 : 요청이 들어온 순간의 데이터로 만들기 때문에 데이터 및 웹 페이지의 실시간성이 높다.

  • 웹 서버 : (1) 요청 → (2) (페이지) 반환
  • 애플리케이션 : (1) 요청 → (2) 연산 (데이터 CRUD, 변수 설정, 함수 수행 등) → (3) 반환

*자세한 동작방식은 밑에서 다루도록 하겠습니다.


초기 WAS 및 CGI

초기 WAS의 동작 방식

 

요청처리

  • 클라이언트(주로 웹 브라우저)로부터 HTTP 요청이 웹 서버(WEB Server)에 도달합니다.
  • 서버는 정적인 콘텐츠(이미지, CSS 파일, 자바스크립트 파일 ) 직접 처리할 있으나, 동적인 콘텐츠 생성이 필요한 요청은 애플리케이션 서버(WAS) 위임합니다.

동적 콘텐츠 생성

  • WAS는 요청의 세부사항을 분석하여 필요한 처리를 수행합니다. 이때, 데이터베이스(DB)와 통신이 필요한 경우, WAS는 해당 데이터를 조회하기 위해 DB 서버에 요청을 보냅니다.
  • DB 서버로부터 받은 데이터와 서버 내부에 저장되어 있는 HTML 템플릿을 결합하여 최종적인 동적 웹 페이지를 생성합니다.

응답처리

  • 생성된 동적 페이지는 HTTP 응답에 포함되어, 다시 서버를 거쳐 클라이언트로 전송됩니다. 과정에서 서버는 응답 데이터의 종류(Content-Type) 등의 HTTP 헤더를 적절히 설정할 있습니다.

개선 및 추가 사항:

  • 애플리케이션과 WS 사이의 커뮤니케이션은 패턴(예: MVC)에 따라 다소 복잡할 수 있으며, 복잡한 로직을 처리하기 위해 배치 작업이나 메시지 큐 등의 다른 컴포넌트와도 상호작용할 수 있습니다.
  • 초기의 WAS 주로 CGI(Common Gateway Interface) 구현되었습니다만, CGI 요청마다 새로운 프로세스를 생성하는 방식으로 실행되었기 때문에 성능 문제가 있었습니다. 이후 성능 개선을 위해 서블릿, JSP(JavaServer Pages) 같은 기술이 도입되었습니다. 이런 기술들은 요청을 효율적으로 처리하기 위해 스레드 등을 사용하여 시스템 자원의 낭비를 줄였습니다.


그렇다면, CGI는 무엇인가?

CGI(Common Gateway Interface)

CGI 서버와 외부 프로그램 사이의 정보를 주고받기 위한 표준 방법을 제공합니다.

클라이언트로부터의 요청을 받은 서버는 CGI 규약에 따라 외부 프로그램(: Perl, C, Python 작성된 프로그램) 실행하고, 프로그램은 요청된 작업을 수행한 결과를 서버에게 반환합니다.

서버는 결과를 클라이언트에게 전달합니다. CGI 통해 페이지는 실시간으로 사용자의 요청에 따라 변경되는 내용을 제공할 있게 되었습니다.

 

CGI, FCGI

  • CGI 초기 = 1 요청 : 1 비상주 프로세스
    • 매번 요청에 따라 프로세스가 실행되고 웹 페이지 만들고 반환하고 죽는다.
    • Stateless(비상태성) : 매 요청마다 새로운 프로세스가 생성-실행(반환)-죽음, 따라서 요청 간 정보가 유지되지 않는다.
  • FCGI = 1 요청 : 1 상주 프로세스
    • 매번 요청에 따라 이미 열려있던 프로세스가 웹 페이지 만들고 반환하고, 프로세스는 계속 살아있다
      • 프로세스가 계속 상주해 있기 때문에 CGI보다 매 프로세스 준비기간은 줄어듭니다.
    • Stateful(상태성) : 아무리 많은 요청이 와도 기존 프로세스가 실행(반환)만 하기에 요청 간 정보 공유

CGI : 각각의 요청이 독립적으로 처리되는 경우 서버가 사용자의 상태 정보를 유지할 필요가 없는 경우에 사용 (Stateless)

FCGI(FastCGI) : 사용자의 세션 정보나 다른 상태 정보를 지속적으로 유지해야 하는 경우에 사용 (stateful)


CGI의 한계와 WAS의 발전

CGI 동적 페이지를 제공하는 역할을 했지만, 프로세스 생성 비용이 높고 확장성에 한계가 있다 단점이 있습니다. 각 요청마다 새로운 프로세스를 생성해야 하므로, 동시에 많은 요청이 발생할 경우 서버에 부담을 주게 됩니다. 이러한 한계를 극복하기 위해 WAS 멀티스레드, 풀링 기법 등을 도입하여 더효율적으로 동적인 콘텐츠를 제공할 수 있게 발전했습니다.


현대 WAS

현대 WAS는 초기 WAS의 한계를 극복하기 위해 스레드(Thread)를 사용하기 시작하였습니다.

  • 멀티스레드의 사용: 현대의 WAS는 멀티스레드를 사용하여 많은 요청을 동시에 처리할 수 있습니다.
  • 비동기 처리: 비동기 처리를 통해 I/O 작업이나 처리 시간이 필요한 요청을 별도의 스레드에서 실행하여, 스레드가 블로킹되지 않고 다른 요청을 계속 처리할 있게 하였습니다.

또한, Application을 WAS내부에 구현하여 가용성을 높였습니다.

  • 애플리케이션을 서버 내부에 통합 구현 :
    • 전반적인 가용성과 관리의 용이성을 높였습니다.
    • 애플리케이션과 서버가 밀접하게 연동되어 동작함으로써, 배포, 환경 설정, 세션 관리 등의 관점에서 효율적인 관리와 운영을 가능하게 합니다.


WAS 웹 애플리케이션 서버 내 템플릿 엔진

동적 웹 페이지를 만들기 위해서는 2개가 필요합니다

  1. 반복적인 템플릿
  2. 데이터

예) 1000 명의 유저 정보 페이지 = 웹페이지 1000 내

  • 1 개의 유저 정보 페이지 템플릿 = 웹페이지 1 개 + 1000명 유저 정보 데이터베이스에 저장
  • 반복되는 템플릿과 유저 정보를 분리한다면? 동적 웹 리소스 반환 → 웹 애플리케이션 서버 등장

반복적인 템플릿 = ViewTemplate

데이터 = Model

동적 웹 페이지 = View (HTML)


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

  • Controller : 요청을 받고, 그에 따른 "연산(로직)"을 시작시키고, 그 결과를 반환
    • 애플리케이션과 웹 서버의 관계에서, 웹 서버 가 Controller와 비슷하다.
      • 요청 - 연산(로직) - 반환
    • 요청을 받고, 결과를 반환하기에 URI 가 정의되어 있다. 엔드포인트 (관문)
  • Model : 데이터에 대한 조회, 조작
  • View : Model(데이터)를 기반으로 만들어진 웹 페이지 + 유저의 동작을 받아 Controller에게 요청 전달
    • 유저가 보는 것 : 웹 페이지 → Controller 가 반환해 준 것
    • 유저가 하는 것 : 자바스크립트 인터렉션 → Controller 호출
      • 예) Model(데이터)를 바꿔달라는 요청을 View의 자바스크립트를 통해 Controller 호출