이번 포스팅에서는 웹 서버와 웹 어플리케이션 서버에 대해 공부하려 한다.
보통 Springboot
를 사용하게 되면 내장된 Tomcat
을 사용하게 된다.
Spring
과 Springboot
의 가장 큰 차이 또한, Tomcat
이 내장 된다는 것이다.
Tomcat
이 WAS
라는 사실은 알지만, 이에 대해 조금 더 자세히 알아보자.
Web Server?
먼저 WAS
이전에 WS(Web Server)
에 대해 먼저 알아보도록 하자.
우리가 어떤 웹에 요청을 보내면, 화면을 받아봐야 한다.
그 때 단순히 정적인 페이지만을 제공해줄 수 있는 서버라고 생각하면 된다.
동적인 기능 없이, Cache
로서 보통 사용하게 되는 서버이다.
Web Application Server?
WAS
는 그럼 어떤 동작을 수행하는 서버일까?
물론 WS
가 제공했듯이, 정적인 페이지도 제공을 해줄 수 있다.
하지만 WS
가 할 수 없는 보다 더 고도화 된, 동적인 페이지를 제공한다.
WAS
는 아래와 같은 구조로 구성된다고 생각하면 된다.
앞서 예시로 들었던 Tomcat
의 구조를 간단히 도식화 한 것이다.
WAS
내의 WS
가 요청을 받아, 정적인 경우에는 직접 처리를 한다.
하지만 동적인 요청이 들어온다면, Web Container
에게 그 요청을 넘기게 된다.
흔히 얘기하는 Servlet Container
에게 요청을 넘기게 되는 것이다.
그럼 요청을 넘겨받은 Web Container
는 다양한 동적인 동작이 가능하다.
HttpServletRequest, HttpServletResponse
객체와 함께 요청과 응답을 처리하게 되는 것이다.
Web Server의 활용
하지만 최근에는 특정한 용도를 위해 앞단에 WS
를 두기도 한다.
예를 들어, Netflix
가 대표적으로 WS
를 앞단에 두고 있는 서비스라고 한다.
WS
중 하나인 nginx
를 사용하고 있다고 한다.
WAS
도 WS
를 포함하는데, 왜 굳이 WS
를 사용하는 것일까?
아래로 두 가지의 이유를 설명하도록 하겠다.
Reverse Proxy
먼저, 보안에 주안점을 둔 기능인 Reverse Proxy
이다.
흔히 Proxy
라고 하면, 사용자의 정체를 숨기고 서비스를 사용하도록 하는 것이다.
사용자의 IP
와 같은 정보들이 숨겨지기 때문에, 안전한 서비스 이용이 가능하다.
위에서 설명한 기능은 Forward Proxy
이다.
하지만 Reverse Proxy
의 경우는 이름처럼 반대로 작동하게 된다.
사용자에 대해 서버의 정보를 숨기게 되는 것이다.
Proxy Server
를 가운데에 두고, 일종의 응접실로 사용하며 서버의 위치를 숨긴다.
이렇게 이용을 하게 되면 서버의 보안을 견고히 할 수 있게 된다.
또한 Cache
로서의 기능이 가능하기 때문에 성능의 향상 또한 기대할 수 있다.
Load Balancing
서버의 안정성에 주안점을 둔 기능인 Load Balancing
이다.
흔히 네트워크에서 얘기하는 로드 밸런싱
과 동일한 개념이다.
서버에 많은 요청이 들어왔을 때, 서버에 부하가 걸리지 않도록 요청을 분산하는 것이다.
이런 기능을 WS
를 앞단에 둠으로써 구현할 수 있다.
위에서 설명했던 nginx
의 경우, 위와 같이 로드 밸런싱
기능을 제공한다.
실제 활용 가능한 구조
실제로 CSR(Client Side Rendering)
방식으로, 아래와 같이 서버를 구성할 수 있을 것이다.
동일한 클라우드 내에, 서로 다른 포트로 Frontend, Backend
를 배포하도록 한다.
단 협업의 효율성을 높이기 위해 Docker Image
로 저장해 실행을 시키도록 한다.
이 때, Frontend
는 3000
번 포트, Backend
는 8080
번 포트를 사용한다면?
동일한 클라우드 주소로 접근했을 때, 둘 중 어떤 포트로 요청이 가야할까?
이 때 nginx
가 앞단에서 교통 정리를 해줄 수 있다.
그냥 /
경로로 들어오는 요청은, 모두 3000
번 포트로 연결시킨다.
/api
가 붙어서 오는 요청은, 모두 8080
번 포트로 연결을 시킨다.
이렇게 실제 서버를 구성할 때에도 WS
를 활용할 수 있다!
프로젝트들을 관찰하다 보면, /api
가 경로에 붙은 경우를 볼 수 있다.
아마 모두 위와 같은 구조로 구성을 하기 위해 그렇게 사용을 하는 것 같다.
프로젝트로의 적용
이번엔 내가 실제로 혼자서 개발중인 프로젝트에 적용을 해보려고 한다.
간단히 nginx
를 통해서 CSR 구조의 프로젝트를 구성해보도록 하자.