Spring Boot의 spring-boot-starter-web 모듈에 기본으로 포함되어 있는 embedded tomcat WAS(Web Application Server)에 대하여 알아보겠습니다.
기본적으로 Spring Boot에서 사용하는 Apache Tomcat은 Apache Web Server + Tomcat Server로 구성되어 있습니다.
WAS vs Web Server
Web Server
우선 WAS와 Web Server의 차이점부터 알아보겠습니다.
Web Server는 클라이언트로부터 HTTP 요청을 받아 정적인 컨텐츠(.html, .jpg, .css, ...)를 제공하는 서버를 의미합니다.
즉 Web Server는 서버가 가지고 있는 특정 자원만을 반환하는 역할을 합니다.
WAS
WAS는 Web Application Server의 약자로 Web Server와 달리 클라이언트로부터 HTTP 요청을 받아 동적인 콘텐츠를 반환하는 서버 역할을 합니다.
여기서 동적인 컨텐츠란 특정 자원이 아닌 다양한 로직, db 조회 등의 작업이 진행된 후 반환되는 컨텐츠를 의미합니다.
Web Server와 WAS를 같이 사용하는 이유
가장 일반적인 이유로는 서버의 부하 방지가 있습니다.
WAS는 사용자의 요청을 다양한 로직과 db 조회를 처리해야 하기 때문에 상당한 컴퓨팅 자원을 소모하게 됩니다. 그렇기 때문에 단순 정적 자원 반환 같은 경우에는 Web Server가 처리하게 하여 부하를 분산시킬 수 있기 때문에 Web Server와 WAS를 같이 사용합니다.
그 외에도 Web Server를 Load balancer로 사용하고 여러 대의 WAS를 두어 부하를 분산 하는 등의 이유가 있습니다.
Apache Tomcat
Spring boot에서는 Apache Web Server + Tomcat Server를 같이 사용하고 있는데요. 보통 Apache Tomcat으로 많이 부릅니다.
Tomcat은 Web Server의 역할도 할 수 있다?
Tomcat은 WAS와 Web Server의 역할 모두를 수행할 수 있습니다.
하지만 Tomcat의 Web Server의 처리속도가 Apache Web Server의 처리속도보다 느린 이유로 Spring boot에서는 Apache Web Server와 Tomcat Server를 같이 사용하는 것 같습니다.(?)
Apache Web Server와 Tomcat의 연동 Flow
그림 출처: https://m.blog.naver.com/tmondev/220731906490
위의 그림은 Apache Web Server와 Tomcat의 연동을 나타냅니다. 흐름은 다음과 같습니다.
- 클라이언트에서 서버의 80포트로 동적 자원(예를 들어 로그인) 요청을 보냄
- Apache web server에서는 정적 자원 요청이 아니므로 tomcat server로 AJP Connector를 이용하여 요청을 전달한다
- 이 때 AJP(Apache JServ Protocol)을 이용하는 데 이 프로토콜은 Web Server에서 받은 요청을 WAS로 전달해주는 프로토콜 입니다.
- 해당 프로토콜은 Apache Web Server, Tomcat, JBOSS 등 다양한 WAS에서 지원합니다.
- Tomcat server는 받은 요청을 요청에 맞는 서블릿을 생성하여 처리하고 web server에 결과를 돌려줌
- 서블릿 생성은 Spring boot의 경우입니다.
- Apache web server는 tomcat으로 받은 데이터를 다시 클라이언트에 전달합니다.
결론
오늘은 Spring boot의 starter-web 패키지에 기본으로 포함된 tomcat server에 대하여 구성과 클라이언트의 요청 flow에 대하여 간략하게 알아보았습니다.
이전에는 단순히 tomcat 서버에서 80포트로 요청을 받고 서블릿 생성후 처리, 반환만 생각하고 있었는데 AJP 같은 것을 포함하여 스프링 부트와 tomcat에 대하여 좀 더 자세하게 알게 되었습니다.
참고
'스프링' 카테고리의 다른 글
Spring boot의 Resource Server 구현 (0) | 2021.06.24 |
---|---|
Spring boot의 Authorization Server 구현 (0) | 2021.06.24 |
Spring boot, kotlin 기반의 OAuth2 인증 서버 - 구글(firebase) 로그인 (0) | 2021.06.24 |
Spring boot, kotlin 기반의 OAuth2 인증 서버 개요 (0) | 2021.06.24 |
댓글