이 글은 공부를 하면서 알게 된 내용들을 기록하는 글 입니다. 오류나 고쳐야 할 사항들이 있다면 지적 부탁드립니다!
Spring 프레임워크를 공부하다보면 Apache(아파치), Tomcat(톰캣)과 더불어 `웹 서버`, `WAS(와스)`라는 단어도 많이 접하게 된다.
이 둘의 차이점은 무엇이며, 어떤 식으로 흐름이 이어지는지 확인해보자.
✅ Web server
Web server는 보통 `HTTP server`를 의미한다.
`HTTP server`는 소프트웨어, 하드웨어 2개의 관점으로 나눠 볼 수 있다.
먼저 소프트웨어 관점에서의 웹 서버는 Client(웹 브라우저)로부터 HTTP Request(요청)을 받아 정적인 컨텐츠(.html, .jpeg, .css 등)을 제공하며,
하드웨어 관점에서의 웹 서버는 위와 같은 기능을 제공하는 컴퓨터 프로그램을 실행하는 하나의 컴퓨터로 본다.
`Web server`의 주 기능은 Client로부터 Request를 전달받았을 때 `정적 컨텐츠(.html, .jpeg, .css 등)을 반환`하는 것이다.
위 그림에서 볼 수 있듯이 Request를 가장 먼저 받는 곳이며,
1) 정적 컨텐츠 요청이 들어온 경우 Web server에서 자체 처리가 가능하지만,
2) 동적 컨텐츠라면 WAS에게 Request를 전달한다.
Web server의 예시로 `Apache(아파치)`, `Nginx` 등을 들 수 있다.
✅ WAS (Web Application Server)
Web Application Server의 약자이며, 동적 컨텐츠를 제공하는 서버이다.
동적 컨텐츠란 request의 내용에 따라 DB 조회, 비지니스 로직 처리 등, 말 그대로 동적으로 유연하게 대처할 수 있는 것을 말한다.
WAS는 Web server처럼 HTTP 프로토콜을 기반으로 동작하며, Web server의 기능(정적 컨텐츠 제공)도 포함하며, `동적 컨텐츠를 제공`할 수 있는 서버이다.
어떻게 가능한걸까?
WAS는 `Web server + Web container(Servlet container)`로 이루어져 있다.
그래서 정적 컨텐츠를 제공(Web server)하면서도, Web container(Servlet container)를 통해 동적 컨텐츠를 제공할 수 있는 것이다.
🔥 WAS와 Servlet container의 관계
WAS는 Web container 혹은 Servlet container라고도 불린다.
그럼 servlet container와 WAS는 다른건가? Tomcat은 Servlet container인가? WAS인가?
너무나 헷갈린다.
결론 먼저 이야기하자면, WAS는 Servlet container를 포함하는 큰 개념이다.
WAS 중에서 `Java servlet`을 지원하는 서버를 `Servlet container`라고 부르는 것이다.
그림으로 표현하자면 밑과 같다.
🔥 Web container와 Servlet container의 차이
그렇다면 Web container와 Servlet container는 무슨 차이가 있는 것일까?
Web container와 Servlet container를 굳이 분리해서 지칭하지 않지만, 아주 살짝 다른 의미를 가지고 있다.
`Web container`는 runtime에 web application들을 관리하는 역할을 한다.
API들을 제공하고, HTTP request들을 처리하며, web components(ex: sevlets, JSPs, filters, listeners...)들의 생명주기(life cycle)을 관리한다.
`Servlet container`는 `Java servlet`관리에 특화된 `Web container`의 한 종류이다.
Java Servlet의 스펙에 따라 구현하여 Java servlet들을 관리하고, HTTP 요청(request)과 응답(response)를 처리하는
Tomcat, Jetty 같은 소프트웨어를 `Servlet container`라고 부른다.
🔥 그럼 WAS만 사용해도 되는거 아닐까?
WAS가 Web server의 기능(정적 컨텐츠 제공)도 가지고 있기 때문에 WAS만 사용해도 되는게 아닐까?
그런데 우리는 왜 Nginx, Apache와 같은 Web server는 사용하는 걸까?
1. WAS의 과부하를 막기 위해서
WAS가 모든 일(정적 컨텐츠, 동적 컨텐츠 제공)을 할 수 있지만, 트래픽이 많아지면 자연스레 과부하가 올 수 밖에 없다.
정적 리소스를 응답하느라, 어플리케이션 로직의 실행이 늦어져 정상적인 서비스 제공이 이루어지지 않을 수 있다.
WAS의 앞단에 Web server를 두어 정적 컨텐츠를 처리해준다면 WAS까지 가지 않고도 요청을 처리할 수 있을 것이고,
자연스레 WAS쪽에는 부담이 줄어들어 동적 컨텐츠 제공에만 신경쓸 수 있을 것 이다.
2. WAS 서버가 다운되었을 경우 사용성을 조금이나마 높여주기 위해
Web server가 정적 리소스를 제공해준다면, 트래픽 과부하와 같이 모종의 이유로 WAS가 다운되었을 경우에 사용성을 조금이나마 높여줄 수 있다.
만일 WAS가 정적 & 동적 리소스 처리를 모두 맡는다면 WAS가 다운되었을 경우에도 웹 페이지에 적어도 정적 리소스는 보여주어 사용성을 조금이나마 높여줄 수 있다.
이 외에도 WAS의 환경설정 파일을 외부에 노출시키지 않기 위해 사용하기도 하고, Load balancing, SSL에 대한 암호화 & 복호화 작업 등 보안을 위해서도 사용된다.
✅ 참고 자료 & 링크
- web server란?
https://developer.mozilla.org/ko/docs/Learn/Common_questions/Web_mechanics/What_is_a_web_server
- WAS와 web server
- Servlet container와 WAS의 차이
https://m.blog.naver.com/mrsuper/222100137204
- WEB, WAS, Web Container
https://velog.io/@zeesoo/WS-WAS
- Web container와 Servlet container의 차이
- web server와 was의 차이 & 웹 서비스 구조
https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html
- Apache HTTP server? Apache Tomcat? 서버 바로 알기
https://tecoble.techcourse.co.kr/post/2021-05-24-apache-tomcat/