[Web] WAS(Web Application Server)

6720·2023년 1월 5일
0

이거 모르겠어요

목록 보기
8/38
post-custom-banner

JSP나 서블렛, 스프링 배웠을 때 들었던 WAS는 무엇일까?

Static Content & Dynamic Content

WAS를 알기 이전에 이 둘을 알아둬야 함.

이름에서 알 수 있듯이 이 둘의 차이점은 컨텐츠가 정적이냐, 동적이냐의 차이임.

  • static content web page: 변하지 않는 컨텐츠
  • dynamic content web page: 동적으로 만들어진 변화하는 컨텐츠

[Static Pages]

① 클라이언트가 서버에게 정적 페이지 요청
이때 파일 경로 이름을 보냄. (GET /path/index.html)
② DB에서 클라이언트가 요청한 페이지 읽어옴.
③ <file contents>: 클라이언트가 요청한 경로와 일치하는 값 반환
④ <file contents> 응답

이러한 과정으로 항상 동일한 페이지를 반환함.
EX) image, HTML, CSS, JS 등 파일과 같이 컴퓨터에 저장되어 있는 파일들

[Dynamic Pages]

클라이언트가 서버에게 동적 페이지 요청
클라이언트가 보낸 인자에 따라 바뀜. (GET /srv/pkg.Servlet?uid=Alice -> doGet(req, res))
DB에서 클라이언트가 요청한 페이지 읽어온 후, 응답
<response Alice>

(GET /srv/pkg.Servlet?uid=Bob -> doGet(req, res))
<response Bob>

인자의 내용에 맞게 동적인 페이지를 반환함.
-> 웹 서버에 의해서 실행되는 프로그램을 통해서 만들어진 결과물: 서블렛(Servlet)
이 서블렛은 WAS 위에서 돌아가는 자바 프로그램임.
이 상황에서 개발자는 서블렛에 doGet()을 구현하면 됨.

Web Server & WAS

Web Server

Send Request to Container / Transfer result to client

EX) Apache Server, Nginx, IIS* 등
*IIS: Windows 전용 Web 서버

소프트웨어(웹 브라우저 클라이언트로부터 HTTP 요청을 받아 정적인 컨텐츠를 제공하는 컨퓨터 프로그램)와 하드웨어(Web Server가 설치되어 있는 컴퓨터)로 구분됨.

HTTP 프로토콜을 기반으로 하여 클라이언트(웹 브라우저 또는 웹 크롤러)의 요청을 서비스 하는 기능을 담당함. 이 요청은 두 가지이며, 정적인 컨텐츠를 제공할 때와 동적인 컨텐츠를 제공할 때로 나뉨.

  • 정적인 컨텐츠 제공
    WAS를 거치지 않고 바로 자원을 제공함.

  • 동적인 컨텐츠 제공

클라이언트의 요청을 WAS에 보내고, WAS가 처리한 결과를 클라이언트에게 응답함.
클라이언트는 일반적으로 웹 브라우저를 의미함.

WAS(Web Application Server)

Web Server + Web Container

EX) Tomcat, JBoss, Jeus, Web Sphere 등

웹 서버의 기능들을 구조적으로 분리하여 처리하고자하는 목적으로 제시됨.
-> 분산 트랜잭션, 보안, 메시징, 스레드 처리 등의 기능을 처리하는 분산 환경에서 사용되며, 주로 DB 서버와 같이 수행됨.
(현재 WAS가 가진 웹 서버도 정적인 컨텐츠를 처리하는 데 있어 성능상 큰 차이는 없음.)

DB 조회나 다양한 로직 처리를 요구하는 동적인 컨텐츠를 제공하기 위해 만들어진 애플리케이션 서버
HTTP를 통해 컴퓨터나 장치에 애플리케이션을 수행해주는 미들웨어(소프트웨어 엔진)*임.

*MiddleWare
비즈니스 로직을 Client와 DBMS 사이의 MiddleWare Server에서 동작하도록 함으로써 Client는 입출력만 담당하게 됨.
Client - MiddleWare Server - DB Server(DBMS*)

[동작 과정]

  • Client -(요청)-> MiddleWare Server
  • MiddleWare Server에서 대부분의 로직이 수행되지만, 데이터를 조작할 일이 있으면 DBMS에 부탁함.
    MiddleWare Server -(로직 결과)-> Client

*DBMS(Database Management System)
다수의 사용자들이 DB 내의 데이터를 접근할 수 있도록 해주는 소프트웨어
DBMS는 보통 Server 형태로 서비스를 제공함.
EX) MySQL, MariaDB, Oracle, PostgreSQL 등

DBMS Server에 직접 접속해서 동작하는 Client의 문제점

  • Client에 로직이 많아지고 이에 따라 Client의 크기가 커짐.
  • 로직이 변경될 때마다 매번 배포가 되어야 하며, Client에 대부분의 로직이 포함되어 배포가 되기 때문에 보안에 취약함.

-> 그래서 Client와 DBMS 사이에 MiddleWare Server를 두어 비즈니스 로직이 이곳에서 동작하도록 함.

웹 컨테이너(Web Container) 혹은 서블릿 컨테이너(Servlet Container)라고도 불림.

  • Container: JSP, Servlet을 실행시킬 수 있는 소프트웨어
    -> WAS는 JSP, Servlet 구동 환경을 제공함.

주로 3가지 기능을 제공함

  • 프로그램 실행 환경과 DB 접속 기능 제공
  • 여러 개의 트랜잭션(논리적인 작업 단위) 관리 기능
  • 업무를 처리하는 비즈니스 로직 수행

Web Server와 WAS를 구분하는 이유

Web Server가 필요한 이유

이미지 파일과 같은 정적인 파일들은 웹 문서가 클라이언트로 보내질 때 함께 가는 것이 아닌, 클라이언트가 웹 문서를 먼저 받은 후 그에 맞게 필요한 이미지 파일들을 다시 서버로 요청하면 그때 이미지 파일을 받아옴.
-> Web Server를 통해 정적인 파일들을 Application Server까지 가지 않고 앞단에서 빠르게 보내줄 수 있음.
정적 컨텐츠만 처리하도록 기능을 분배하여 서버의 부담을 줄일 수 있음.

WAS가 필요한 이유

사용자의 요청에 맞게 적절한 동적 컨텐츠를 만들어서 제공할 때, Web Server만을 이용한다면 사용자가 원하는 요청에 대한 결과값을 모두 미리 만들어 놓고 서비스해야 함. -> 자원 부족
-> WAS를 통해 요청에 맞는 데이터를 DB에서 가져와서 비즈니스 로직에 맞게 그때마다 결과를 만들어서 제공함으로써 자원을 효율적으로 사용할 수 있음.

WAS가 Web Server의 기능도 모두 수행하도록 설계하지 않은 이유

자원 이용의 효율성 및 장애 극복, 배포 및 유지보수의 편의성을 위해 Web Server와 WAS를 분리함.
+) Web Server를 WAS 앞에 두고 필요한 WAS들을 Web Server에 플러그인 형태로 설정하면 더욱 효율적인 분산 처리가 가능함.

  • 기능을 분리하여 서부 부하 방지
    만약 정적 컨텐츠 요청까지 WAS가 처리한다면 이로 인해 부하가 커지게 되고, 동적 컨텐츠의 처리가 지연됨에 따라 수행 속도가 느려짐.
  • 물리적으로 분리하여 보안 강화
    SSL에 대한 암복호화 처리에 Web Server를 사용함.
  • 여러 대의 WAS 연결 가능
    EX) 이중화 등의 보안
    • Load Balancing 을 위해 Web Server를 사용함. 이는 fail over(장애 극복)와 fail back 처리에 유리함.
    • 대용량 웹 어플리케이션의 경우 (=여러 개의 서버 사용 시) Web Server와 WAS를 분리하여 무중단 운영 을 위한 장애 극복에 쉽게 대응할 수 있음.
  • 여러 웹 어플리케이션 서비스 가능
    EX) 하나의 서버에서 PHP Application과 Java Application을 함께 사용하는 경우
  • 접근 허용 IP 관리, 2대 이상의 서버에서의 세션 관리 등도 Web Server에서 처리하면서 효율적임.

Web Service Architecture

  • Client -> Web Server -> DB
  • Client -> WAS -> DB

  • Client -> Web Server -> WAS -> DB
    • 클라이언트 -(요청)-> Web Server -(요청)-> WAS
    • WAS - 메모리에 관련 Servlet 올림.
    • WAS - web.xml 참조 후 해당 Servlet에 대한 Thread 생성함. (Thread Pool 이용)
    • HttpServletRequest와 HttpServletResponse 객체 생성 후 Servlet에 전달함.
      • Thread는 Servlet의 service() 메소드 호출함.
      • service() 메소드는 요청에 맞게 doGet() 또는 doPost() 메소드 호출함.
        protected doGet(HttpServletRequest request, HttpServletResponse response)
    • doGet() 또는 doPost() 메소드 -(인자에 맞게 생성된 적절한 동적 페이지를 Response 객체에 담음)-> WAS
    • WAS -(Response -> HttpResponse)-> WebServer
    • 생성된 스레드 종료, HttpServletRequest와 HttpServletResponse 객체 제거함.

참고 자료

Heee's Development Blog

profile
뭐라도 하자
post-custom-banner

0개의 댓글