보통 무언가가 필요 없을 때 less를 사용한다.
Containerless는 이름 그대로 Container가 필요없다는 뜻을 가지게 되는데,
이것이 스프링 부트가 시작되는 배경으로 볼 수 있다.
Container?
모듈과 컴포넌트, 컨테이너에 대한 포스트를 참고하시고 오면 좋다.
위 포스트에서 모듈과 컴포넌트는 소프트웨어 공학에서 정의한 내용이다.
이 포스트의 컴포넌트는 FrontEnd에서 설명하는 컴포넌트와 BackEnd에서 설명하는 컴포넌트가 파생 된 것.
우리가 웹, 앱에서 특정 기능들(글쓰기, 메일 작성, ...)을 사용하려면 FrontEnd에서 보이는 컴포넌트를 사용하면 해당 컴포넌트가 백엔드의 컴포넌트와 연결되어 우리에게 정보를 제공하게 된다.
SpringBoot는 Java 기반 FrameWork이다.
Java에서 Container는 Servlet Container라고 부르고 Component를 Servlet이라고 부른다.
Spring에서는 Container를 Spring Container라고 부르고 Component를 Bean이라고 부른다.
즉, 웹에서 Resource를 Request하면 Servlet Container의 Component를 통해 Spring Container에서 작업을 수행한다.
Servlet Container를 통해 Spring Container에서 작업을 왜 하는가?
Java에서 기본적으로 제공하는 웹 기술은 Servlet Container를 호출해야 사용할 수 있다.
즉, 클라이언트가 요청을 하면 Spring Container에서 처리를 하고 Response 받는 형태이다.
Spring 입장에서 Servlet이 Bean이라고 해서 Servlet = Bean이 아니다.
Servlet은 Servlet Container의 Component 이고 Bean은 Spring Container의 Component와 같은 것이다.
즉, servlet은 bean들로 구성이 되어 client에게 response 하게 된다.
Containerless
그럼 우리는 Spring에서 Servlet을 처리한다는 것을 알게 되었다.
그러면 Spring을 사용하려면 Servlet Container에서 호출해야 된다는 것이다.
우리는 저런 Servlet Container를 호출하는 것을 Was(WebApplicationServer)라고 한다.
인터페이스 포스트를 참고해보자.
Servlet Container는 클라이언트가 Spring의 기술을 사용하기 위한 하나의 Interface로 볼 수 있다.
만약, 인터페이스와 같이 사용하지 않는다면?
1. 우리는 Spring 작업을 시작할 때 마다 Web.xml과 같이 초기 설정을 해야한다.
2. 우리는 Spring 작업을 처리하기 위해 Servlet을 Build하고 Deploy 해야 한다.
3. 그 외에도 다양한 작업들이 있지만 위 과정들을 수행하기 위한 지식이 필요하다.
즉, 진입장벽이 높아진다.
그런데 중요한 점은 이 작업은 프로젝트 기능에 영향을 미치는 작업이 아니라는 것이다.
위 과정들은 공통된 작업인데 진입장벽이 높으면 어떤 문제가 발생할까?
프로젝트 기간이 길어질수록 위 내용을 잊고 다시 찾아봐야하는 반복 작업이 발생한다.
효율이 너무 떨어지게 되는 문제점이다.
우리가 Spring Frame Work를 사용할 줄 안다고 가정해보자.
보통, Was를 구축하기 위해서 Tomcat을 사용해서 정적 페이지를 관리한다.
그럼 우리는 Tomcat을 사용해 Servlet을 호출하고 Spring 으로 처리를 할 것이다.
그런데 실무에서 Tomcat이 아닌 Jetty, Undertow와 같은 Servlet Conatiner를 사용한다면?
우리는 또 다시 공부를 해야하는 것이다.
이런 이유 때문에 사용자들은 Spring 측으로부터 불편함을 호소하는 ISSUE를 작성했다.
어차피 Container는 공통적인 작업이므로 더 이상 개발자가 이 부분에 대해 신경쓰지 않도록 만든 것이 Containerless를 채택한 SpringBoot이다.
쇼핑을 한 번 생각해보자.
1. 우리가 마트에서 물건을 구매하려고 한다.
2. Container(장바구니)가 필요하다. 먼저 구매하려는 물품들을 고려해서 장바구니를 선택한다.
3. 물건들을 장바구니에 담고 필요 없을 경우 뺀다. (물리적으로)
4. 집에 도착할 때까지 장바구니를 들고와야 한다.
Containerless라면?
1. 물건들을 장바구니에 담고 뺄 때 물건을 직접 옮길 필요가 없다. (클릭만)
2. 물리적인 장바구니가 필요없다. 택배기사가 알아서 챙겨준다.
standalone application
그럼, Containerless는 알겠는데 독립 실행형 프로그램은 무엇인가?
SpringBoot에서 Containerless 성질이 있어도 어쨌든 Spring의 bean들이 동작하려면
Servlet Container는 실행이되어야 한다는 것이다.
그럼 Containerless가 아니지 않냐?
Containerless는 container에 대한 투자가 필요없는 기술이지 container가 없어도 되는 기술이 아니다.
SpringBoot는 작성한 코드들을 실행하기 위해 tomcat과 같은 ServletContainer 기술이 사용된다.
container와 관련된 내용을 따로 작성하고 build하지 않아도(Containerless)
SpringBoot Project를 실행하는 순간에 Container를 같이 띄우는 작업을 하는데
이런 것을 독립실행형 프로그램이라고 한다.
참고
https://inpa.tistory.com/entry/TOMCAT
ServletContainer vs SpringContainer
※ 인프런 Toby의 SpringBoot 이해와 원리를 기반으로 작성합니다.
'SpringBoot > 이해와 원리' 카테고리의 다른 글
Opinionated과 Out of the box (0) | 2024.03.04 |
---|