서버개발의 기초적인 개념이라고 하지만, web server에 대한 개념도 얼마전에 이해한 나에게 WAS의 등장은 또 다른 의미로 충격적...
사전적인 정의로는 web server와 WAS를 설명할 수 있다 치더라도 이에 대해 내가 완전히 이해하고 있는 지에 대해 의문이 들어서 다시 한 번 쭉 정리해보려 한다.
*우아한 테크톡의 유튜브 영상을 참고했다.
Web Server
웹서버에 대해서는 이미 배포할 때 다뤄본 개념이다. (개념, 설치 및 사용하기)
다시 정리 해보자면, 아래와 같은 한 문 장으로 Web server를 정의할 수 있다.
웹 브라우저 클라이언트로부터 HTTP 요청을 받아들이고 HTML 문서와 같은 웹 페이지를 반환하는 컴퓨터 프로그램
여기서 "HTML 문서와 같은 웹페이지" 라는 설명에 주목할 필요가 있다. 이 부분이 Web Server와 곧 설명할 WAS간의 개념적 차이와 관련이 있다. 그렇다면 Web Server(웹 서버)에 대해 좀 더 자세하게 설명해 보겠다.
웹 서버란 클라이언트가 브라우저에서 어떠한 요청을 하면, 그 요청을 받아서 정적 컨텐츠를 제공하는 서버이다. 그렇다. 웹서버는 웹에서 브라우저의 요청을 받아들여 처리하는 통신적 역할을 하지만 정적 컨텐츠를 "제공"하는 서버인 것이다.
그렇다면 동적 컨텐츠는? 웹 서버는 동적 컨텐츠에 대한 요청은 무시 하는 것일까? 그렇지 않다. 웹서버는 동적 컨텐츠에 대해서는 해당 요청을 받으면 WAS에 넘겨주고, WAS에서 이에 대해 처리한 결과를 클라이언트에게 전달하는 역할을 한다.
태초에는(비유적 표현) 웹서버만이 존재했고, 이 때 클라이언트의 요청에 따라서 정적인 컨텐츠를 제공했을 것이다. 그런데 통신이 점점 복잡해지고, 동적이게 되면서 클라이언트의 요청에 대해 동적으로 "처리" 즉 계산하여 그 결과를 넘겨주는 행위가 필요했을 것이다.
내가 참고한 영상에서는 구구단을 비유로 들었는데, 이해가 잘 되어서 여기서도 예시로 언급해 보도록 하겠다.
만약에 웹서버로 정적인 컨텐츠만을 제공할 때, 구구단에 대한 요청을 처리하려면, 1X1 = 1 , 1X2 = 2 .... 이 모든 것을 다 하드코딩으로 일일이 입력해서 전달해야 한다. 그냥 프로그래밍 언어로 for 문을 돌리면 금방 처리할 수 있을 텐데 말이다.
그런데 웹서버가 제공하는 정적 컨텐츠인 HTML은 프로그래밍 언어가 아니다.
따라서, 클라이언트의 요청 중, 동적인 요청 즉 프로그래밍 처리가 필요한 것에 대해서 처리를 해줄, 프로그래밍 언어가 탑재된(적절한 용어가 아닐수도있다 비유적으로 이해하자)웹서버가 필요했고, 이것이 WAS 이다.
웹 서버 기능
Http 프로토콜을 기반으로, 클라이언트의 요청을 서비스하는 기능을 담당
- 정적 컨텐츠 제공: WAS를 거치지 않고 바로 자원 제공
- 동적 컨텐츠 제공을 위한 요청 전달 : 클라이언트 요청을 WAS에 보내고, WAS에서 처리한 결과를 클라이언트에게 전달
웹 서버 종류 : Apache, Nginx, IIS 등
여기서 정적 콘텐츠와 동적 컨텐츠에 대해 정리해 보려 한다.
정적 콘텐츠(static)는 변화가 없는 콘텐츠를 말한다. 보통 HTML, CSS, JS와 같이 미리 서버에 저장해두고 서버가 요청을 받으면 그저 응답만 해주면 되는 것들로 구성되어 있다. 이것은 곧 어느 사용자에게든지 동일하게 결과값을 보여주게 된다.
동적 콘텐츠(dynamic)는 누가, 언제, 어떻게 서버에 요청했는지에 따라 결과값을 다르게 보여주는 형식이다. 즉, 사용자가 맞춤형 콘텐츠를 제공할 수 있게 되는 것이다. 예를 들면 유투브의 추천 영상이라던지, 이 콘텐츠를 제일 잘 활용하는 웹 서비스는 넷플릭스이다.
WAS(Web Application Server)
위의 웹서버에 대한 설명에서 이제 WAS가 웹서버와 가지는 차이점을 유추할 수 있다.
"인터넷 상에서 HTTP 프로토콜을 통해 사용자 컴퓨터나 장치에 애플리케이션을 수행해주는 미들웨어로서, 주로 동적 서버 컨텐츠를 수행하는 것으로 웹 서버와 구별이 되며, 주로 데이터베이스 서버와 같이 수행"
즉 WAS는 데이터베이스의 조회나 다양한 로직처리가 필요한 동적 컨텐츠를 제공한다.(최근 대부분의 요청은 동적 컨텐츠라고 유추 가능할 것이다. 웹서버 뿐 아니라 WAS또한 필수적인 개념인 것이다.) 동적인 컨텐츠를 처리하고 제공한다는 의미에서, 웹서버와 가장 큰 차이점은 상황에 따라 변하는 정보를 제공할 수 있다고 정리할 수 있다. 실질적으로 WAS는 웹서버와 웹컨테이너가 합쳐진 개념이다.
WAS는 웹 컨테이너 혹은 서블릿 컨테이너라고도 불린다.
여기서 웹 컨테이너란 JSP, Servlet을 실행시킬 수 있는 소프트웨어. 즉, WAS는 JSP, Servlet 구동 환경을 제공해줌
WAS의 기능
- WAS = 웹 서버 + 웹 컨테이너
- 웹 서버의 기능들을 구조적으로 분리하여 처리하는 역할
- 보안, 스레드 처리, 분산 트랜잭션 등 분산 환경에서 사용됨 ( 주로 DB 서버와 함께 사용 )
- 프로그램 실행 환경 및 DB 접속 기능 제공
- 업무 처리하는 비즈니스 로직 수행
- 동적인 페이지를 생성할 수 있는 서버
WAS 종류 : Tomcat, JBoss 등
Web Server와 WAS를 구분하는 이유
웹 서버가 필요한 이유
웹 서버는 정적 컨텐츠만 처리하도록 기능을 분배하여 서버 부담을 줄일 수 있다.
클라이언트가 이미지 파일(정적 컨텐츠)를 보낼 때 / 웹 문서(html 문서)가 클라이언트로 보내질 때 이미지 파일과 같은 정적 파일은 함께 보내지지 않는데, 이 때 먼저 html 문서를 받고, 이에 필요한 이미지 파일들을 다시 서버로 요청해서 받아오는 것이다. 따라서 웹 서버를 통해서 정적인 파일을 애플리케이션 서버까지 가지 않고 앞단에 빠르게 주고 받을 수 있게 된다.
WAS가 필요한 이유
WAS를 통해 요청에 맞는 데이터를 DB에서 가져와 비즈니스 로직에 맞게 그때마다 결과를 만들고 제공하면서 자원을 효율적으로 사용할 수 있다. 동적인 컨텐츠를 제공해야 할때. 웹 서버만으로는 사용자가 원하는 요청에 대한 결과값을 모두 미리 만들어놓고 서비스하기에는 자원이 절대적으로 부족함 따라서 WAS를 통해 요청이 들어올 때마다 DB와 비즈니스 로직을 통해 결과물을 만들어 제공하게 되는 것이다.
이 때 WAS는 DB 조회, 다양한 로직을 처리하는 데 집중해야 하므로 단순한 정적 컨텐츠는 웹 서버에게 맡기며 기능을 분리시켜 서버 부하를 방지하게 된다. 만약 WAS가 정적 컨텐츠 요청까지 처리하면, 부하가 커지고 동적 컨텐츠 처리가 지연되면서 수행 속도가 느려지면서 페이지 노출 시간 늘어나는 문제 발생한다.
또한, 여러 대의 WAS를 연결지어 사용이 가능하다. 웹 서버를 앞 단에 두고, WAS에 오류가 발생하면 사용자가 이용하지 못하게 막아둔 뒤 재시작하여 해결할 수 있다. (사용자는 오류를 느끼지 못하고 이용 가능)
결론적으로 자원 이용의 효율성 및 장애 극복, 배포 및 유지 보수의 편의성 때문에 웹 서버와 WAS를 분리해서 사용하는 것이다.
웹 서버를 WAS 앞에 두고, 필요한 WAS들을 웹 서버에 플러그인 형태로 설정하면 효율적인 분산 처리가 가능하다.
대표적으로 apache에서는 WAS로 Tomcat을 제공한다. 이는 실제로 apache tomcat이라고 불리는데, 그 이유는 2008년에 릴리즈 된 Tomcat 5.5 버전부터 정적 컨텐츠를 처리하는 기능이 추가되었는데, 이 기능이 순수 Apache를 사용하는 것에 비해 성능적 차이가 전혀 없으며 Tomcat이 Apache의 기능을 포함하고 있기 때문데 Apache Tomcat이라고 부르고 있는 것이다.
Web Service Architecture
웹 어플리케이션은 요청 처리 방식에 따라 다양한 구조를 가질 수 있다.
- 클라이언트(사용자) → Web Server → DB
- 클라이언트(사용자) → WAS → DB
- 클라이언트(사용자) → Web Server → WAS → DB
‼ [ 클라이언트(사용자) → Web Server → WAS → DB ] 구조의 동작 과정 ‼
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() 메서드를 호출한다.
6. protected doGet(HttpServletRequest request, HttpServletResponse response)
7. doGet() 또는 doPost() 메서드는 인자에 맞게 생성된 적절한 동적 페이지를 Response 객체에 담아 WAS에 전달한다.
8. WAS는 Response 객체를 HttpResponse 형태로 바꾸어 Web Server에 전달한다.
9. 생성된 Thread를 종료하고, HttpServletRequest와 HttpServletResponse 객체를 제거한다.
** Servlet, JSP는 동적 페이지의 종류들이다. 이에 대해서는 별도로 정리한 해당 링크를 참고
'SW Engineering > Dev' 카테고리의 다른 글
"객체 지향 언어(OOP)"에 대해서 다시 정리해보기 (0) | 2021.01.26 |
---|---|
Web Architecture 개념 이해하기 (1) | 2021.01.26 |
What is HTTPS? (0) | 2021.01.17 |
HTTP의 구조에 대해 이해하기(특히 Header 구조 파악하기) (0) | 2021.01.17 |
What is HTTP? (0) | 2021.01.16 |