본문 바로가기
Dev/network

Web Server와 WAS(Web Application Server)의 차이( feat. 미들웨어)

by RoundRyun 2019. 11. 15.

아래의 두개의 그림은 사실상 같은 그림이다 ㅇㅇ.

 

그림 1

 

그림2

클라이언트 /서버 구조

클라이언트는 서비스를 제공하는 서버에게 정보를 요청하여 응답 받은 결과를 사용한다.

웹서버와 웹브라우저가 대표적으로 서버와 클라이언트의 관계라고 말할 수 있다.

 

DBMS

- 다수의 사용자들이 데이터베이스 내의 데이터를 접근할 수 있도록 해주는 소프트웨어

( Mysql, Oracle등)

 

- DBMS는 보통 서버형태로 서비스를 제공하기 때문에 이러한 DBMS에 접근하여 동작하는 클라이언트 프로그램이 많이 만들어졌다. 그런데 이러한 방식의 문제점은 클라이언트의 로직이 많아지고 클라이언트 프로그램의 크기가 커진다는 문제가 있다.프로그램 로직이 변경이 되면 클라이언트가 매번 배포되어야 한다는 문제가 있었고, 대부분의 로직이 클라이언트에 포함되어 배포가 되기 때문에 보안이 나쁘다는 문제가 있었다.

 

그래서 등장하게 된게

 

미들웨어!

- DBMS를 직접 클라이언트가 연결되어 동작하는 방식이 여러 가지 단점이 있었음을 알게 된 후 이러한 문제점을 해결하기 위해 등장한것이 미들웨어라는 개념이다. 클라이언트와 DBMS사이에 위의 그림과 같이 또 다른 서버를 두는 방식이다. 클라이언트는 단순히 요청만 중앙에 있는 서버에게 보내고, 중앙에 있는 서버(미들웨어)는 대부분의 로직을 수행한다. 이때, 데이터를 조작할 일이 있으면 DBMS에게 부탁한다. 그리고 그 결과를 클라이언트에게 전송하면 클라이언트는 그 결과를 화면에 보여주게 된다. 클라이언트가 해야했던 복잡한로직은 사라지고, 단순히 화면에 그 결과만 보여주고 사용자로부터 값을 입력 받아서 미들웨어에게만 보내는 역할만 수행하면 되기 때문에 크기가 매우 작아지게 됐다.

 

- 프로그램 로직이 변경이 된다 하더라고 모든 클라이언트를 다시 배포할 필요가 없이 중앙의 미들웨어만 변경하면 되는 장점을 가짐.

 

 

WAS( 웹서버+웹컨테이너 Ex. Jeus, Tomcat, Websphere etc..)

최초의 웹이 등장했을 때는 웹 브라우저는 정적인 데이터만 보여주었다. 웹이 널리 사용되면서 사용자들의 요구사항은 점점 커지게 됐고, 웹에서 데이터를 입려하고 조회하는 등의 동적인 기능도 요구됨. 동적인 기능은 프로그래밍을 통해서는 가능함. 웹서버에서 프로그래밍 기능이 들어가는 방식을 CGI라고 불렀었고, CGI는 단순한 프로그래밍에서는 사용시 별 문제가 없었습니다. 그러나 웹은 점점 복잡해졌고 점점 복잡한 프로그래밍적 기능을 요구하게 됨. 보통 이러한 기능들은 DBMS에 연관된 경우가 많았음 브라우저를 클라이언트라고 본다면 브라우저와 DBMS사이에 동작하는 미들웨어가 필요하게됨. WAS도 넓게 보면 미들웨어에 포함된다고 볼수있음

 

WAS 주요기능

  • 프로그래밍 실행환경과 데이버베이스 접속 기능을 제공.
  • 여러개의 트랜잭션을 관리.
  • 업무를 처리하는 비즈니스 로직을 수행

이 외에도  WAS는 기본적으로 웹서버의 기능도 제공한다.

그래서 웹서버 따로 WAS 따로 설치안하고 톰캣이라는 WAS하나만 설치하고 이용이 가능한 이유는 이 WAS, 톰캣이 가지고 있는 웹서버가 충분한 기능을 하고 있기 때문에 굳이 따로 Apache같은 웹서버를 같이 설치 안하고 톰캣만 설치해서 사용하는 것임.

 

 

웹서버는 보통 정적인 콘텐츠를 웹브라우저에게 전송하는 역할을 하고 WAS는 프로그램의 동적인 결과를 웹 브라우저에게 전송하는 역할을 담당함. 즉 WEB서버는 HTML문서와 같은 정적 컨텐츠를 처리하는 것이고(HTTP프로토콜을 통해 읽힐 수 있는 문서, Ex. image, html, css, javascript 파일과 같이 컴퓨터에 저장되어 있는 파일들) WAS는 jsp등의 개발 언어를 읽고 처리하여 동적 컨텐츠, 웹앱서비스(웹 서버에 의해서 실행되는 프로그램을 통해서 만들어진 결과물 * Servlet: WAS 위에서 돌아가는 Java Program)를 처리하는 것이다.

 

앞에서 WAS가 제공하는 웹서버의 기능도 웹서버가 제공하는 기능에 비해서 성능이 떨어지지는 않음. 그렇다면 웹서버는 안필요한 걸까?.... 사실 웹서버 없이 WAS만 있어도 정적인 콘텐츠와 동적인 콘텐츠를 모두 제공할 수 있음. 

WAS 등장이 초창기였을 때에는 WAS에 내장된 웹서버가 성능이 좀 떨어졌음. 그랬기 때문에 초창기에는 웹어플리케이션을 실행할 때, Apache와 톰캣을 같이 설치해서 실행을 했어야 됐는데, 이게 계속 발전하면서 웹 서버의 역할도 충분히 해주고 있기 때문에 웹 서버를 따로 설치하지 않아도 충분히 동작하는 경우들이 굉장히 많아짐.

 

그럼에도 불구하고 웹서버가 WAS 앞단에 있으면 좋은 이유는 있음. 

웹서버는 상대적으로 WAS보다 간단한 구조로 만들어져 있음. 사람들이 많이 접속하는 대용량 웹어플리케이션의 경우에는 서버의 수가 여러대 일수 있음. 가끔 프로그램이 혼자 종료되는 경우 있지않음? WAS에서 동작하도록 개발자가 만든 프로그램이 오작동이 발생해서 WAS 자체에 문제가 발생하는 경우도 있음. 이 경우, WAS를 재시작해야 하는 경우가 생기는데, 문제가 있는 WAS를 재 시작할 때 앞단의 쉡서버에서 먼저 해당 WAS를 이용하지 못하도록 하고 WAS를 재시작한다면 해당 웹 애플리케이션을 사용하는 사람은 WAS의 문제가 발생한지 모르고 이용할 수 있을 것임. 이러한 처리를 장애극복기능 이라고 함.

 

대용량 웹애플리케이션에는 무중단으로 운영하기 위해서 상당히 중요한기능임. 이러한 기능 때문에 보통 웹서버가 WAS앞단에 동작하도록 하는 경우가 많음.

 

즉 정리하자면,

  • 규모가 커질수록 웹 서버와 WAS를 분리합니다.
  • 자원 이용의 효율성 및 장애 극복, 배포 및 유지보수의 편의성을 위해 웹서버와 WAS를 대체로 분리합니다.

컨테이너(Containner)

  •  -JSP와 서블릿을 이용하는 웹 응용 프로그램은 자바 언어를 이용해서 작성할 수 있는데, JSP와 서블릿을 실행시킬 수 있는 소프트웨어를 웹 컨테이너(Web Container) 혹은 서블릿 컨테이너(Servlet Container)라고 한다.
  • Servlet 컨테이너, JSP 컨테이너, EJB 컨테이너 등의 종류가 있으며, 대표적인 웹 컨테이너로는 자카르타 톰캣(JSP), RESIN, Web Logic, WebtoB 등이 있다.
  • 웹 서버에서 JSP를 요청하면 톰캣에서는 JSP 파일을 서블릿으로 변환하여 컴파일을 수행하고, 서블릿의 수행결과를 웹 서버에서 전달하게 된다. 

Web Service Architecture

웹서비스 아키텍쳐는 그래서 다양한 구조를 가질 수 있다.

  1. Client -> Web Server -> DB
  2. Client -> WAS -> DB
  3. Client -> Web Server -> WAS -> DB

3번 구조의 동작과정은 아래와 같다.

1. Web Server는 웹 브라우저 클라이언트로부터 HTTP 요청을 받는다.
2.Web Server는 클라이언트의 요청(Request)을 WAS에 보낸다.
3. WAS는 관련된 Servlet을 메모리에 올린다.
4. WAS는 web.xml을 참조하여 해당 Servlet에 대한 Thread를 생성한다. (Thread Pool 이용)
5. HttpServletRequest와 HttpServletResponse 객체를 생성하여 Servlet에 전달한다.
5-1. Thread는 Servlet의 service() 메서드를 호출한다.
5-2. service() 메서드는 요청에 맞게 doGet() 또는 doPost() 메서드를 호출한다.
5-3. protected doGet(HttpServletRequest request, HttpServletResponse response)
6. doGet() 또는 doPost() 메서드는 인자에 맞게 생성된 적절한 동적 페이지를 Response 객체에 담아 WAS에 전달한다.
7. WAS는 Response 객체를 HttpResponse 형태로 바꾸어 Web Server에 전달한다.
8. 생성된 Thread를 종료하고, HttpServletRequest와 HttpServletResponse 객체를 제거한다.

 

 

 

 

 

References

https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html 
https://www.edwith.org/boostcourse-web/lecture/16666/
https://unabated.tistory.com/entry/WAS와-웹서버Web-Server-의-차이 [랄라라]