인프런 김영한님의 스프링 MVC 1편 강의 내용을 바탕으로 작성한 글입니다.
웹 서버는 정적인 리소스를 제공한다. 정적인 리소스란, HTML, CSS, JS, 이미지 등 모든 사용자에게 동일하게 전달되는 파일이다.
예를 들자면 이런 이미지가 될 수 있겠다. 한국에 사는 내가 접속하나, 미국에 사는 빌 게이츠가 접속하나 네이버 로고 이미지는 모든 사용자에게 동일하게 보여진다. 이처럼 모든 사용자가 동일하게 전달받는 파일이 바로 정적 리소스이다.
웹 애플리케이션 서버는 애플리케이션 로직을 실행하여 동적 컨텐츠를 반환한다. 동적인 컨텐츠란 사용자에 따라 다르게 보이는 컨텐츠로, 아래와 같은 화면을 말한다.
나는 호로록
이라는 닉네임으로 로그인했기 때문에 호로록님 이라고 뜨지만, 다른 사람이 로그인하면 그 사람의 닉네임이 보일 것이다. 이처럼 WAS는 사용자마다 다른 HTML을 반환해준다.
사실 두 개념은 무 자르듯이 딱 떨어지는 게 아니다. 웹 서버도 프로그램 로직을 실행할 수 있는 경우가 있고, WAS는 이미 웹 서버의 기능을 포함하고 있기 때문이다. 정적 리소스와 동적 리소스의 차이를 구분할 줄 알고, 애플리케이션 로직을 실행하는 데 특화된 것이 WAS라고 알고 있으면 충분하다.
WAS와 DB만 사용한 아주 간단한 구조다. WAS는 웹 서버처럼 정적 리소스를 제공해 줄 수도 있고, 애플리케이션 로직을 실행하여 동적 리소스를 반환할 수도 있다.
하지만 그림만 봐도 WAS의 어깨가 무거워 보인다. HTML, CSS, JS 파일은 물론 이미지도 반환해줘야 하고, 애플리케이션 로직도 실행해줘야 한다. 정적 리소스를 반환하는 업무만으로도 벅찬데 거기에 로직 실행까지 해야 한다니🥲 WAS 하나가 감당하기엔 너무 많은 일이다.
그래서 WAS를 도와줄 웹 서버를 추가했다. 정적 리소스 처리는 웹 서버에게 맡겨버리고, WAS는 애플리케이션 로직만 담당한다. 클라이언트가 웹 서버에게 요청을 보내면, 웹 서버가 WAS의 도움이 필요한 부분만 WAS에게 처리를 위임하는 방식이다.
이런 방식은 리소스를 효율적으로 관리할 수 있다는 장점이 있다. 정적 리소스 요청이 많으면 웹 서버를, 애플리케이션 리소스가 많이 사용되면 WAS를 추가하면 되기 때문이다. 또한 웹 서버는 WAS에 비해 잘 죽지 않기 때문에, WAS나 DB에 문제가 생기면 웹 서버가 클라이언트에게 오류 화면을 반환하도록 할 수도 있다.