이번 강의 내용을 보고 스프링 컨테이너에 톰캣을 내장했다고 볼 수 있을까요?
안녕하세요 토비님 강의 재밌게 잘 듣고있습니다 :)
흔히들 스프링부트는 톰캣을 스프링 애플리케이션 내에 내장 시켰다는 것에서 가장 큰 차이점을 두고 있는 것 같습니다.
그렇다면 이번 강의 내용에서 서블릿 컨테이너 초기화 작업을 스프링 컨테이너 초기화 작업에 종속 시켰다는 점에서 위에서 언급한 톰캣을 스프링 컨테이너에 내장 시켰다고 볼 수 있을까요?
만약에 제가 질문한 내용이 맞다면 기존에 스프링 부트 없이도 안내해주신 방법대로 내장시킬 수 있었을텐데 보편적으로 내장시키지 않고 분리 시켰을 때의 단점을 가져갔던 이유는 무엇 일까요?
감사합니다.
답변 1
10
스프링부트가 서블릿 컨테이너를 내장한 것이 중요한 특징이긴합니다. 하지만 원한다면 기존 톰캣 서버에 배포하는 형태로도 빌드해서 사용할 수 있습니다. 가장 큰 특징이라고 하기엔 자동 구성이 워낙 중요해서, 하나의 큰 특징 정도로 생각하시면 좋겠습니다. 물론 스프링을 전통적인 방식으로 개발하다가 부트로 넘어온 경우엔 서블릿 컨테이너까지 자동으로 동작하는게 매우 인상적이긴 합니다.
서블릿 컨티이너를 내장하는 방식은 강의에서 설명드린대로 서블릿 컨테이너 팩토리를 스프링의 빈으로 등록한게 중요합니다. 그리고, 그 빈을 가져다가 스프링의 초기 라이프라이클에서 직접 실행하는 것도 의미가 있고요.
서블릿 컨테이너를 내장형해서 사용하는 것은 원래는 상상도 못했던 일입니다. 처음 서블릿 기술이 나왔던 시절에는 서블릿 컨테이너가 일부로 포함된 웹 애플리케이션 서버(WAS)를 기업에서 고가로 구매해서 사용하던 시절입니다. CPU/Core당 천만원이 넘는 라이센스비를 주고, 그러니까 WAS하나에 5천만~1억쯤 매년 라이센스 비용을 내기도 했죠. 그런 고가의 서버 제품을 구매하면 전담 SE(시스템 엔지니어)가 관리를 담당합니다. 필요에 따라 미세한 조정을 하기도 했고요. JVM의 GC 문제라든가, 오류가 생겼을 때 여러가지 분석하고 관리하는 등의 작업도 담당해야 했습니다. 그리고 WAR, EAR 등으로 빌드된 애플리케이션을 개발자들이 가져오면 그걸 서버에 배포하고 동작시키는 것도 전담 엔지니어나 부서에서 처리했죠. 예전엔 서블릿 컨테이너에 여러 개의 웹 모듈을 멀티로 배포했고, 서버를 재시작하지 않고 오래 운영해면서 새로운 웹 모듈을 재배포하는 등의 작업을 했습니다. 그 시절엔 EJB도 중요했기에 WAS를 잘 운영하는게 중요했습니다.
그런데 스프링이 등장하고 서블릿 컨테이너만으로도 기존 WAS에서 지원하던 엔터프라이즈 기술을 사용할 수 있게 되었고, 점차 가볍고 서블릿 컨테이너를 도입하는 게 늘어나기 시작했죠. 그래서 톰캣과 같은 오픈소스, 무료 제품도 점차 사용이 늘게 되었습니다. 그래도 여전히 기존 방식으로 서버를 따로 띄우고 쓰는 방식을 선호했던 것이고요.
그런데 스프링 부트와 같이 컨테이너를 같이 띄우기 시작하게 된 건, 아마도 클라우드의 영향으로 동시에 여러개의 서버를 사용하고, 필요에 따라 이를 늘리기도 하는 등의 최근 배포 방식이 시작되면서인 듯합니다. 마이크로서비스를 도입하거나, 그렇지 않더라도 작은 사양의 서버를 부하에 따라 늘리거나 줄이거나 하는 상황에서 SE가 일일히 서버를 관리하기 힘들게 됐죠.
그래서 점차 서블릿 컨테이너당 웹 모듈 하나만 배포하는 것, 그리고 재배포시 아예 서블릿 컨테이너를 재시작하는 방식도 늘기 시작했고요. 아마 그런 변화가 일어나던 시점에 스프링 부트 혹은 그에 영향을 준 다른 웹 기술 등이 등장으 했던 것 같습니다.
하지만 지금도 일부 기업 등에선 톰캣 서버를 관리하는 팀이 따로 있고, 스프링 부트를 쓰더라도 WAR로 빌드해서 톰캣에 직접 배포하는 방식으로 운용하기도 합니다. 여러가지 필요에 따라 장단점이 달라질 수 있기 때문에 그에 맞는 선택을 하면 됩니다. 스프링부트는 마이크로서비스에 적합하다고도 자주 얘기하는데, 아무튼 그런 애플리케이션 개발과 배포 방식을 선호한다면 기본인 독립실행형 방식이 유리할 것이고요.
11강에서 cmd에서 spring shell에 $ init 하면 Fail 메세지
0
75
2
TestRestTemplate 을 통해 테스트 실행시 웹 요청 정보가 콘솔에 표시되지 않습니다.
0
85
1
섹션7. 자동구성 정보파일분리 강의 질문(@MyAutoConfiguration 붙힌 이유)
0
201
2
WebApplicationContext를 DispatcherServlet에 this로 넘기는 것
0
279
2
인프라 빈 구성 정보의 분리에서 EnableMyAutoConfiguration 질문드립니다.
0
210
2
질문드립니다.
0
232
2
spring boot 3.3.7로 학습중입니다.
0
369
2
Serverproperties 객체 생성 후 @Impor 어노테이션 사용 이유 용도
0
162
2
spring start io 에서 이제더이상 2.x버전은 지원하지 않는 것 같습니다.
1
296
2
Springboot 3.2 이상에서 파라미터 추론관련
0
913
4
binding error
0
220
3
Arrays.copyOf 메서드의 타입 세이프
1
155
2
MyOnClassCondition에 있는 matches method의 Invoke 횟수
1
233
3
인용구의 출처가 궁금합니다.
0
259
1
프로퍼티 빈의 후처리기 도입 AnnotationUtils의 사용
0
236
2
SimpleCacheConfiguration과 빈 등록
0
168
2
MyAutoConfigImportSelector 에서 생성자로 ClassLoader를 주입받을 수 있는 점
0
244
1
IntelliJ project jenerator spring initailizr
0
150
1
강의 자료 레퍼지토리에 업로드
0
216
1
강의자료
0
388
1
Hikari 라이브러리가 없으면 오류가 나는거 아닌가요
0
314
2
Tomcat 포트 프로퍼티 미설정시 랜덤 포트 설정 문의
0
476
5
@Import 로 Bean을 등록해야하는 기준이 뭔지 궁금합니다.
0
340
2
application.properties파일내 프로퍼티 이름
0
210
1





