[ASAC 7기] 웹 서버(WS)와 웹 어플리케이션 서버(WAS)

민준·2024년 12월 14일
0

1.1. 웹 서버(WS) : 정적 웹 리소스 반환

정적 웹 페이지 : 미리 만들어진 웹 페이지를 단순히 요청에 따라 반환
하지만 단점은 1000명의 유저 정보 페이지를 1000개의 웹 페이지로 가지고 있어야 한다...
그래서 방법을 고안하게 된다.

  • 반복되는 템플릿유저 정보를 분리한다면?
  • 동적 웹 리소스 반환웹 어플리케이션 서버 등장

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

동적 웹 페이지 : 이미 만들어진 것을 반환하는게 아니라, 요청에 따라 웹 페이지를 만드는 것

  • 웹 서버가 요청을 받으면, 먼저 동적 웹 페이지 생성을 한 뒤에 결과 웹 페이지를 반환
    • 웹 서버 : (1) 요청 → (2) (페이지) 반환
    • 어플리케이션 : (1) 요청 → (2) 연산 (데이터 CRUD, 변수 설정, 함수 수행 등) → (3) 반환

어플리케이션은 함수와 동일하다고 생각하면된다. 쉬운 예를 들면 계산기도 어플리케이션

  • 동적 웹 페이지를 만드는 주체는 어플리케이션
  • 동적 웹 페이지 의 장점 : 포장 버거가 아닌 수제 버거의 장점
    • 공간 효율 : 수많은 페이지들을 웹 서버가 들고있을 필요없이 매번 만들어서 반환하면 된다는것
    • 실시간성 : 요청이 들어온 순간의 데이터로 만들기 때문에 데이터 및 웹 페이지의 신선도가 높다

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

  • 웹 서버 가 요청을 받으면 어플리케이션 에게 동적 웹 페이지 생성 작업을 위임
    • 웹 서버가 요청을 받아 어플리케이션 을 실행하고 페이지 생성을 요청하기 위한 연결고리 = CGI
    • CGI (Common Gateway Interface) : 웹 서버와 어플리케이션을 연결하기 위한 기술(Was초기에 사용한 모델)
    • 처음 CGI 가 등장했을때 어플리케이션은 지금 우리가 쉽게 생각하는 Java 나 Python 이 아닌 : Shell, Bash 과 같은 스크립트 언어였다. 유명한 서버 스크립트 언어로 PHP, Perl, Ruby
      • PHP (Personal Home Page Tools) : 간단히 홈페이지 제작용 서버 스크립트 언어
        • 나중엔 PHP : Hypertext Preprocessor 라고 재귀약자로 바뀌었음

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

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

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

    • 매번 요청에 따라 프로세스가 실행되고 웹 페이지 만들고 반환하고 죽는다

    • Stateless 비상태성 : 매 요청마다 독립적이고 새로운 프로세스가 생성-실행(반환)-죽음 이기에 요청 간 정보 없음

      • 어제 실행된 프로세스랑 오늘 실행된 프로세스는 독립적
    • 일처리를 하기 위해 프로세스를 실행시키고 종료를 해야 하기때문에 일처리가 무겁다

      손님이 한 명 들어올 때마다 식당 문을 열고, 불을 켜고, 냄비를 꺼내고, 물을 끓이고, 라면을 만들고, 문을 닫는 과정을 매번 반복.

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

    • 매번 요청에 따라 이미 열려있던 프로세스가 웹 페이지 만들고 반환하고, 프로세스는 계속 살아있는다

    • Stateful 상태성 : 아무리 많은 요청이 와도 기존 프로세스가 실행(반환) 만 하기에 요청 간 정보 공유
      - 어제 실행된 프로세스랑 오늘 실행된 프로세스는 같은 프로세스라 같은 정보 공유
      - 쓰레드만 상주시켜 보안성을 높였다.

      식당 문은 항상 열려 있고, 불도 계속 켜져 있음. 손님이 들어오면 바로 냄비 꺼내고 라면만 만들면 됨.
      장점
      반복적으로 문을 열고 닫거나 불을 켜고 끄지 않아도 되니 시간과 에너지 절약.
      기존에 켜져 있던 시스템(상주 프로세스)을 계속 활용
      단점
      항상 문을 열고 불을 켜둬야 하니 보안 문제가 발생. (예: 가게 안이 노출되거나, 악성 손님이 들어올 위험)

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

    • (A) CGI 를 내장하는 방식

      CGI 방식을 그대로 활용해서, 요청마다 PHP가 작동.
      기본적으로 독립적이고 단순하지만 성능이 떨어짐.

    • (B) 어플리케이션을 웹 서버가 내장하고있는 방식 : Tomcat 과 유사

      • 이때부터 ‘어플리케이션을 웹 서버가 내장한 형태’ 등장, 요청을 빠르게 처리.
      • 웹 서버가 어플리케이션을 집어 삼킨 형태 (코끼리를 삼킨 보아뱀)

      라면 식당에서 라면 요리 기계를 식당 안에 설치해서 버튼만 누르면 라면이 나옴.
      이 과정에서 어플리케이션과 웹 서버가 합쳐져서 빠르고 간단해짐.

      • 하다보니 PHP 는 딸랑 홈페이지를 제작하기 위한 언어, 스크립트 언어이기에 절차적 프로그래밍
      • PHP 언어적 한계 → 객체지향 프로그램 언어 Java 의 등장으로 어플리케이션 개발 패러다임이 이동
        • JSP, Servlet 등의 자바 기반 웹 어플리케이션 서버(WAS) 근간 기술이 폭발

    PHP는 간단한 웹사이트 개발로 시작했지만,
    복잡한 프로그램 개발의 요구를 충족하기엔 한계가 있었음.

    Java의 등장
    Java는 객체지향 프로그래밍을 기반으로 개발된 언어로, 복잡하고 확장 가능한 프로그램을 만드는 데 강점이 있음.
    웹 어플리케이션 개발에서 Java는 큰 인기를 끌며 WAS(Web Application Server) 기술의 핵심이 됨.


    JSP와 Servlet의 역할

    JSP (Java Server Pages):
    PHP처럼 HTML에 Java 코드를 삽입해 웹페이지를 동적으로 생성.
    비유: 요리의 플레이팅 과정을 담당.

    Servlet:
    서버에서 비즈니스 로직을 처리하고 데이터를 관리.
    비유: 요리 재료를 준비하고 조리하는 메인 셰프.

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

  • 1 요청 : 1 스레드 = 상주 프로세스의 Stateful 장점과 비상주 Stateless 의 장점을 스레드를 통해 얻어냄

    • 하나의 요청이 들어오면, 하나의 스레드가 해당 요청에 생성 및 할당 (Thread는 실제 요청 처리를 실행하는 작업 단위)
      • ‘생성’을 취소선 한 이유
        : 매번 요청마다 스레드를 만들기보다 미리 만들어놓고, 필요에 따라 할당만 하자
        • 스레드 풀 (Thread Pool) : 몇개의 스레드를 만들어놓고 대기시킬지 개수를 지정해놓는다(쓰레드를 효율적으로 관리하기 위한 풀)
          • 할당 → 수행 → 반환
            • 스레드는 자기가 맡은 일을 수행하고, 스레드 풀 (Thread Pool) 에 반환된다
    • Servlet 서블릿 : 1 요청에 대해 할당되는 1 자바 스레드(WAS)는 서블릿이라 불린다(요청을 처리하는 핵심)
    • Servlet Container 서블릿 컨테이너 : 요청이 오면 갖고있는 스레드를 할당하고, 완료 뒤 회수하는 주체(요청을 서블릿에 배정하고 관리하는 관리자)
      • Servlet Container 서블릿 컨테이너 = Servlet 관리자
      • Servlet 서블릿과 컨테이너

    요소 간 관계 정리

    클라이언트가 요청 → Servlet Container가 요청을 받음.
    Servlet Container는 Thread Pool에서 스레드 하나를 꺼내서 요청을 처리할 Servlet에 배정.
    Servlet이 요청을 처리하고 응답 생성.
    스레드는 작업 완료 후 Thread Pool로 반환.


    비유로 다시 정리

    요청(클라이언트, 손님): 식당에 들어온 손님.
    Thread(스레드): 요리사가 라면을 만들 때 실제로 사용하는 손.
    Servlet(서블릿): 손님의 주문을 받고 라면을 만들어주는 요리사.
    Thread Pool(스레드 풀): 요리사가 대기 중인 대기실.
    Servlet Container(서블릿 컨테이너): 요리사들에게 손님을 배정하고, 요리가 끝나면 대기실로 돌려보내는 매니저.

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

동적 웹 페이지를 만들기 위해서는 2개가 필요 = 반복적인 템플릿 + 데이터

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

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

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

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

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

0개의 댓글