Spring Boot에는 Tomcat 외에도 Jetty, Undertow, Netty과 같은 Sevlet Container가 내장되어 있다.
즉, 외장 톰캣과는 다르게 톰캣을 따로 설치할 필요 없이 애플리케이션을 바로 실행할 수 있다.
내장 tomcat이 외장 tomcat과 성능이 떨어질까? tomcat 개발자들은 둘의 성능이 동일하다고 밝혔다고 한다.
그렇다면 내장 톰캣과 외장 톰캣은 뭐가 다를까?
애플리케이션 실행 방법
- 외장 톰캣(Tomcat)
- tomcat 설치 및 설정 파일 구성
- webapp 디렉토리에 build된 war 파일을 업로드
- tomcat 실행
- 내장 톰캣(Embedded Tomcat)
- build된 스프링 부트 애플리케이션인 jar, war 파일을 java 명령어로 실행함
- 외장 톰캣보다 더 간단함(배포가 단순해짐)
Virtual Host 가능 여부
Apache HTTPd 웹 서버에서는 Virtual Host 기능을 제공하는데 외장 Tomcat에서도 Host 설정으로 해당 기능을 제공할 수 있다.
가상호스트(Virtual Host)는 한 컴퓨터에서 여러 웹사이트를 서비스함을 뜻함
웹 사이트마다 다른 IP 주소를 사용하는 IP기반(IP-baesd) 방식과 IP 주소당 여러 이름을 가지는 이름 기반(name-based) 방식이 존재
즉, 하나의 서버에서 가상 호스트를 이용하여 WAS 하나로 여러 서비스를 제공할 수 있다.
- 내장 톰캣
- Spring Boot는 그 자체가 하나의 프로그램
- Servlet Container로 동작 시, 하나의 포트를 독자적으로 점유함
- 여러 프로그램이 같은 포트를 사용할 수 없음 → 가상 호스트 불가능
- Spring Boot는 그 자체가 하나의 프로그램
- 외장 톰캣
- 스스로 하나의 포트를 점유한 뒤, 내부에서 여러 도메인을 각자 서비스할 수 있음
- tomcat 구성 요소 파일인 tomcatFolder/conf/server.xml에서 가상 호스트 설정
<!-- -->
<Host name="localhost" appBase="webapps"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
</Host>
<Host name="www.testdomain.com" appBase="C:\testdomain"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
</Host>
<!-- -->
그렇다면 Spring Boot 프로젝트는 대형 서비스에 부적합할까?
내장 톰캣과 외장 톰캣의 차이점에 대해 알아보았다.
Spring Boot는 톰캣이 내장되어있고, 외장 톰캣은 내장 톰캣과 다르게 Virtual Host의 기능을 제공한다.
Virtual Host는 하나의 서버에서 여러 서비스를 제공할 수 있게 해준다.
그렇다면 이러한 차이로 인해 Spring Boot는 대형 프로젝트에는 부적합할까? ❌❌
1. Web Server와 WAS의 역할 구분
Virtual Host의 기능은 Web Server의 역할이기 때문에 WAS에서 해당 기능을 제공하는 것은 WAS의 역할과는 거리가 멀다.
WAS는 Servlet Container의 역할만 하도록 구성하는 것이 좋다.
2. 최근 Infra와 비교
과거에는 하나의 고사양 서버에 여러 애플리케이션을 운영하는 것이 훨씬 효율적이었다.
하지만 현재는 하나의 애플리케이션에 하나의 서비스만 구성하고 운영하는 것이 효율적이다.
하나의 VM이나 Docker로 하나의 서비스만 구성하고 여러 개로 나누어서 서비스하는 것이 대세이다.
Web Server의 reverse proxy
현재는 Web Server를 WAS 앞에 두는 reverse proxy 구성 환경이 많이 사용되고 있으며, 이 구성은 Web Server와 WAS의 역할을 분리하여 준다. 또한, Web Server에 여러 대의 WAS를 연결하는 구조를 이용하면 Virtual Host의 기능을 대체할 수 있고 서버에 가해지는 부하를 분산해주어 효율적인 처리가 가능해진다.
해당 글들이 내장과 외장 톰캣 그리고 스프링과 스프링 부트를 이해하는데 많은 도움이 되었다.
[내장 Tomcat과 외장 Tomcat의 간단한 비교] https://zepinos.tistory.com/51?category=797552
[Spring Boot는 어떤 구조일까?] https://zepinos.tistory.com/85?category=797552
[외장 WAS가 반드시 필요한가?] https://zepinos.tistory.com/86?category=797552
[외장 WAS만이 할 수 있는 것] https://zepinos.tistory.com/87?category=797552
[Embedded Tomcat과 Tomcat의 차이]
https://thxwelchs.github.io/EmbeddedTomcat%EA%B3%BCTomcat%EC%9D%98%EC%B0%A8%EC%9D%B4/
'Web > Spring, JPA' 카테고리의 다른 글
[JPA] Entity 생성 방법 (0) | 2023.08.29 |
---|---|
[아키텍쳐] 스프링 패키지 구조(계층형과 도메인형) (0) | 2023.08.22 |
[Spring] Spring vs Spring Boot (0) | 2022.08.30 |
[Spring Boot] Spring Boot War/Jar 배포해보기 (0) | 2022.08.26 |
[Spring] 스프링(Spring)이란? (0) | 2022.01.26 |