기타/기타

[Web] 웹 서버, WAS, 서블릿에 대하여..

lazy man 2023. 3. 27. 11:23

웹 애플리케이션은 일반적으로 웹 서버 + WAS + Database의 구조로 되어있으며 개발하면서 많이 접하게 되는 웹 서버, WAS, 서블릿에 대하여 정리하려고 합니다. 기술이 발전하면서 웹 서버와 WAS의 개념이 모호해지고 있지만 각 서버를 이해하고 구분지어 운영하는 이유에 대해 알아보겠습니다.

 

 

 

웹 서버와 WAS(Web Application Server)


웹 서버와 WAS 모두 HTTP 프로토콜을 기반으로 동작하며 웹 서버는 일반적으로 정적 리소스(html, css, js, 이미지, 영상) 등을 제공하는 서버이고 WAS는 동적 html, Servlet 등 프로그램 코드를 실행해서 애플리케이션 로직을 수행할 수 있는 서버입니다. 웹 서버에는 Ngnix, Apache 등이 있고 WAS에는 Tomcat, Jetty, Undertow 등이 있습니다.

 

 

- 웹 서버와 WAS의 분리

사실 웹 서버에서도 프로그램을 수행할 수 있는 방법이 있고, WAS 에서도 정적 리소스를 제공할 수 있기 때문에 사실 두 서버의 경계는 모호한 부분이 있습니다. 그렇다면 WAS 하나만 있어도 웹 애플리케이션을 개발할 수 있지만 굳이 두 서버를 분리하여 사용하는 이유는 무엇일까요?

 

  • WAS에서 정적 리소스를 제공하고 애플리케이션 로직을 수행한다면 너무 많은 역할과 책임을 가지게 됩니다. 예를 들어 애플리케이션 로직 등의 이유로 서버가 다운되었을 때 오류 페이지 등의 리소스를 제공할 수 없는 상황이 만들어질 수 있습니다. 
  • 일반적으로 정적 리소스보다는 애플리케이션의 로직을 수행하는데 더 큰 비용이 발생합니다. 정적 리소스를 많이 지원해야 한다면 웹 서버를 증설하고, 애플리케이션 로직을 수행하는 게 중요하다면 WAS를 증설할 수 있기 때문에 효율적인 리소스 관리가 가능합니다.

쉽게 정리하자면 웹 서버는 정적 리소스를 관리하는데 특화되어 있고, WAS는 애플리케이션 코드를 실행하는데 특화된 서버라고 할 수 있습니다. 클라이언트가 정적 리소스를 요청한다면 웹 서버에서 처리하고, 동적 페이지를 요청한다면 WAS에서 처리할 수 있도록 요청을 위임합니다.

 

 

서블릿


서블릿은 동적 웹 페이지를 만들기 위한 기술로 웹 애플리케이션을 개발할 때 클라이언트와의 통신, HTTP 메세지 파싱, 요청 정보를 사용할 수 있는 HttpServletRequest, 응답 정보를 사용할 수 있는 HttpServletResponse 등 개발자가 Http 스펙을 편리하게 사용할 수 있도록 도와줍니다.

 

 

클라이언트(브라우저)로부터 http 요청이 오면 WAS에서는 request 객체와 response 객체를 생성하여 서블릿 컨테이너의 서블릿 객체를 호출합니다. 서블릿 객체는 개발자가 구현하는 부분이며 개발자는 생성된 request 객체를 이용하여 필요한 정보를 취득한 후 로직을 수행하고 수행 결과를 response에 저장한 후 서블릿 객체는 종료됩니다. 서블릿 객체가 종료되면 WAS에서는 response에 담겨있는 내용으로 http 응답 정보를 생성한 후 클라이언트(브라우저)에게 전달합니다.

 

 

서블릿 컨테이너란?


서블릿을 지원하는 WAS를 서블릿 컨테이너라고 하며 서블릿 컨테이너는 서블릿 객체의 생명주기(생성, 초기화, 호출, 종료)를 관리하고 서블릿 객체를 싱글톤으로 관리합니다. 서블릿 객체는 쓰레드에 의해 호출되며 서블릿 컨테이너는 멀티 쓰레드를 지원합니다. 즉 싱글톤 객체인데 멀티 쓰레드 환경이기 때문에 서블릿 객체 내부에서 공유할 수 있는 변수를 사용하는 것은 매우 위험합니다.

 

 

쓰레드

쓰레드는 실제로 작업을 수행하는 주체입니다. 클라이언트가 요청을 보냈을 때 쓰레드가 할당되며 서블릿 객체가 실행되는데 만일 쓰레드가 1개 뿐이라면(단일 쓰레드) 앞선 요청을 처리하지 못했을 때 다음 요청은 대기 상태가 됩니다. 만일 클라이언트가 요청하는대로 쓰레드를 생성한다면 동시성 처리는 좋을 수 있지만 서버의 스펙을 넘어가거나, 잦은 쓰레드 생성으로 응답이 느려질 수 있습니다. 이러한 문제점을 해결하기 위해 쓰레드 풀을 사용하고 있습니다.

 

 

 

 

쓰레드풀

쓰레드 풀이란 적정량의 쓰레드를 미리 생성한 후 담아놓는 공간입니다. 클라이언트의 요청이 있을 경우 미리 생성했던 쓰레드를 할당하고 사용이 완료되면 쓰레드 풀에 반납합니다. 쓰레드 생성은 자원이 많이 드는 행동인데 쓰레드 풀을 이용한다면 이러한 문제점을 개선할 수 있습니다.

 

 

참고


https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., -

www.inflearn.com