이번 포스팅에서는 웹 서버와 웹 어플리케이션 서버에 대해 공부하려 한다.
보통 Springboot를 사용하게 되면 내장된 Tomcat을 사용하게 된다.
SpringSpringboot의 가장 큰 차이 또한, Tomcat이 내장 된다는 것이다.
TomcatWAS라는 사실은 알지만, 이에 대해 조금 더 자세히 알아보자.

Web Server?

먼저 WAS 이전에 WS(Web Server)에 대해 먼저 알아보도록 하자.
우리가 어떤 웹에 요청을 보내면, 화면을 받아봐야 한다.
그 때 단순히 정적인 페이지만을 제공해줄 수 있는 서버라고 생각하면 된다.
동적인 기능 없이, Cache로서 보통 사용하게 되는 서버이다.

Web Application Server?

WAS는 그럼 어떤 동작을 수행하는 서버일까?
물론 WS가 제공했듯이, 정적인 페이지도 제공을 해줄 수 있다.
하지만 WS가 할 수 없는 보다 더 고도화 된, 동적인 페이지를 제공한다.

WAS는 아래와 같은 구조로 구성된다고 생각하면 된다.

제목 없는 다이어그램 drawio

앞서 예시로 들었던 Tomcat의 구조를 간단히 도식화 한 것이다.
WAS내의 WS가 요청을 받아, 정적인 경우에는 직접 처리를 한다.
하지만 동적인 요청이 들어온다면, Web Container에게 그 요청을 넘기게 된다.
흔히 얘기하는 Servlet Container에게 요청을 넘기게 되는 것이다.

그럼 요청을 넘겨받은 Web Container는 다양한 동적인 동작이 가능하다.
HttpServletRequest, HttpServletResponse 객체와 함께 요청과 응답을 처리하게 되는 것이다.

Web Server의 활용

하지만 최근에는 특정한 용도를 위해 앞단에 WS를 두기도 한다.
예를 들어, Netflix가 대표적으로 WS를 앞단에 두고 있는 서비스라고 한다.
WS 중 하나인 nginx를 사용하고 있다고 한다.

WASWS를 포함하는데, 왜 굳이 WS를 사용하는 것일까?
아래로 두 가지의 이유를 설명하도록 하겠다.

Reverse Proxy

먼저, 보안에 주안점을 둔 기능인 Reverse Proxy이다.
흔히 Proxy라고 하면, 사용자의 정체를 숨기고 서비스를 사용하도록 하는 것이다.
사용자의 IP와 같은 정보들이 숨겨지기 때문에, 안전한 서비스 이용이 가능하다.

위에서 설명한 기능은 Forward Proxy이다.
하지만 Reverse Proxy의 경우는 이름처럼 반대로 작동하게 된다.
사용자에 대해 서버의 정보를 숨기게 되는 것이다.
Proxy Server를 가운데에 두고, 일종의 응접실로 사용하며 서버의 위치를 숨긴다.

이렇게 이용을 하게 되면 서버의 보안을 견고히 할 수 있게 된다.
또한 Cache로서의 기능이 가능하기 때문에 성능의 향상 또한 기대할 수 있다.

Load Balancing

서버의 안정성에 주안점을 둔 기능인 Load Balancing이다.
흔히 네트워크에서 얘기하는 로드 밸런싱과 동일한 개념이다.
서버에 많은 요청이 들어왔을 때, 서버에 부하가 걸리지 않도록 요청을 분산하는 것이다.
이런 기능을 WS를 앞단에 둠으로써 구현할 수 있다.

로드밸런싱 drawio

위에서 설명했던 nginx의 경우, 위와 같이 로드 밸런싱 기능을 제공한다.

실제 활용 가능한 구조

실제로 CSR(Client Side Rendering) 방식으로, 아래와 같이 서버를 구성할 수 있을 것이다.

서ㅓ북조 drawio

동일한 클라우드 내에, 서로 다른 포트로 Frontend, Backend를 배포하도록 한다.
단 협업의 효율성을 높이기 위해 Docker Image로 저장해 실행을 시키도록 한다.
이 때, Frontend3000번 포트, Backend8080번 포트를 사용한다면?
동일한 클라우드 주소로 접근했을 때, 둘 중 어떤 포트로 요청이 가야할까?

이 때 nginx가 앞단에서 교통 정리를 해줄 수 있다.
그냥 / 경로로 들어오는 요청은, 모두 3000번 포트로 연결시킨다.
/api가 붙어서 오는 요청은, 모두 8080번 포트로 연결을 시킨다.
이렇게 실제 서버를 구성할 때에도 WS를 활용할 수 있다!

프로젝트들을 관찰하다 보면, /api가 경로에 붙은 경우를 볼 수 있다.
아마 모두 위와 같은 구조로 구성을 하기 위해 그렇게 사용을 하는 것 같다.

프로젝트로의 적용

이번엔 내가 실제로 혼자서 개발중인 프로젝트에 적용을 해보려고 한다.
간단히 nginx를 통해서 CSR 구조의 프로젝트를 구성해보도록 하자.