Web

[Web] 웹 서버란 무엇인가?

lnacles 2023. 12. 18. 22:00

머리말

Java 기반의 Spring 프레임워크를 활용하여 서버를 구현하다 보면 Spring과 Spring boot의 차이에 대해 의문을 가졌고, 내장 Tomcat의 유무에 따라 나눠진다고 알고 있습니다.

 

Tomcat은 웹 애플리케이션 서버이며 어떤 역할을 하는지 이 포스트의 끝을 통해 알아보려 합니다. 추가적으로 이 포스트로 웹 서버의 역할에 대해 이해할 수 있습니다.

 


Web Server와 Web Application Server

우선 웹으로 제공하는 서비스가 특별한 사용자를 위한 서비스가 아닌 모두에게 공지하는 문서를 제공하고자 한다면 Spring boot기반 서버가 필요할까요?

 

정답은 없어도 됩니다. 사용자의 데이터를 저장하거나 변경하는 것 없이 웹에 접근하는 누구에게나 똑같은 정보를 제공하려면 동적인 서버가 없어도 됩니다.

 

이와 같은 이유로 서버는 데이터 활용의 유무로 서버를 나눌 수 있을 것입니다. 위와 같이 데이터 활용이 없이 정해진 데이터를 그대로 응답하는 것을 정적(static)이라 하고 요청에 따라 응답이 달라지는 서비스를 동적(dynamic)이라고 합니다.

 

이때 정적인 서비스를 담당하는 서버가 Web Server이고 동적인 서비스를 담당하는 것이 Web Application Server라고 합니다.

Web Application Server

WAS(Web Application Server)는 동적인 서비스를 처리하기 위해 Web Server와 Web Container로 구성됩니다.

 

Spring boot에는 Apache Tomcat이라는 WAS가 내장되어 있습니다. Apache는 Web Server이고, Tomcat은 아파치 재단에서 개발한 WAS로 Web Server(Apache)와 연동하여 실행할 수 있는 자바 환경을 제공해 줍니다.

 

Tomcat의 Web Server Apache 웹 서버와 같은 기능과 성능을 가집니다. WAS 앞의 웹 서버로부터 HTTP 요청을 받아 Web Container로 전달하게 되고, Web Container은 내부 로직을 통해 데이터를 만들어 Web Server로 응답하게 됩니다.

 

Java에서는 HttpRequest에 대한 요청부터 응답까지 Servlet이 처리하게 되는데, 이 과정은 MVC 패턴에서 컨트롤러의 역할을 수행합니다.

 

Web Server

Web Server에 대해 조금 더 알아보려 합니다. 앞선 내용에서는 Web Server는 정적인 서비스를 서비스하기 위함이었지만, 프로젝트에서 부하를 분산하기 위한 로드밸런싱, SSL을 활용한 https 프로토콜, 무중단 배포, 비이상적인 요청에 대한 대응 등등 동적인 서비스를 제외한 모든 것은 Web Server에서 구현이 가능합니다. WAS 내부의 웹 서버는 단순 요청과 응답을 전달하는 역할을 하고 WAS 앞에서는 로드밸런싱, Https 보안 프로토콜, 무중단 배포, 비이상적인 요청 감시 등의 기능을 처리하게 됩니다.

 

흔히 웹 서버에는 Apache HTTP Server와 Nginx가 있습니다. 저는 Https 프로토콜을 적용하기 위해 WAS 앞의 웹 서버를 Nginx로 사용해 본 경험 있습니다. 구글에서 Nginx를 검색해 보면 다양한 예시가 많기 때문에 기능 구현이 수월했습니다. 물론 Nginx 말고 WAS 내부의 Apache 웹 서버에서도 기능을 구현할 수 있습니다.

 

Apache HTTP Server

Spring boot의 Tomcat에서 WebServer 역할을 수행할 때 요청마다 스레드를 늘려서 요청을 처리하게 됩니다. 이유는 Tomcat의 내부에서 Servlet이 요청을 처리하는데 Servlet이 스레드를 늘리면서 동작하기 때문입니다.

 

멀티 스레드 형식으로 안정적이지만  동시에 사용자가 많아지면 CPU에 부하가 쌓이게 되는 단점이 있습니다.

 

Nginx

최근에 많이 사용되는 Web Server Nginx는 요청 작업을 비동기로 처리한다는 Tomcat과 차이점이 있습니다. 이벤트 기반의 형식으로 이벤트 루프를 통해 비동기로 동작하기 때문에  멀티 스레드보다 성능이 좋고 가볍다는 장점이 있습니다.