스프링부트는 컨테이너리스 웹 애플리케이션 아키텍처를 스프링이 지원해줬으면 좋겠다고 한 한 개발자의 요청 사항으로부터 출발. 그럼 컨테이너리스가 뭘까?
Serverless 와 유사하다.그럼 컨테이너 관리를 신경 쓰지 않아도 된다라는 이야기를 하려면, 먼저 컨테이너가 뭔지를 따져봐야 한다. 스프링은 IoC 컨테이너이다. 스프링 컨테이너라고 부르기도.

라이프 사이클 관리
웹 컨테이너란 1차적으로 웹 컴포넌트를 관리하는 역할을 한다. 웹 컴포넌트가 서버에 떠있으므로 누군가가 시작을 시켜줘야 한다. 컴포넌트를 메모리에 올리고 new 해서 진입되는 인스턴스를 생성해주고 서비스가 되는 동안 계속 메모리 위에서 관리해주는 작업이 필요하다. 흔히 이야기하는 라이프 사이클을 관리하는게 웹 컨테이너의 주요한 역할 첫 번째이다.
많은 기능을 가진 여러 개의 컴포넌트들을 관리
또 하나 중요한 건 웹 컨테이너는 일반적으로 하나의 웹 컴포넌트만 갖고 관리하지 않는다. 이 안에는 하나의 웹 컨테이너가 제공하는 서비스를 담당하는 굉장히 많은 종류의 컴포넌트를 여러 개 가지고 있을 수 있다. 이렇게 많은 기능을 가진 여러 개의 컴포넌트들을 웹 컨테이너가 관리를 해줘야 한다.
또 웹 컨테이너가 해주는 중요한 일 중 하나는 클라이언트로부터 들어온 요청은 어느 컴포넌트가 관리할 것인지 결정해 연결해주는 작업이 필요하다. 웹 요청이 들어오면 웹 컨테이너는 정해진 룰에 따라 어느 컴포넌트가 요청을 처리해줄지 컴포넌트에게 요청을 넘겨준다. 어떤 컴포넌트가 웹 요청을 처리할지 결정하고 선택하는 작업을 흔히 라우팅, 매핑이라고 한다. (ex. 핸들러 매핑)
이걸 자바 용어로 바꿔볼 것.

이 안에 서블릿을 여러 개 띄워놓고 매핑 정보를 넣으면 특정 서블릿이 그 요청을 처리할 수 있도록 그리고 응답을 생성해 다시 클라이언트, 브라우저나 API 호출을 생성한 클라이언트한테 돌려주는 작업을 담당하는 서블릿 컨테이너가 존재. 이게 원래 전통적인 90년대 후반부터 시작된 자바의 프로그래밍 가장 기본 구성이 되는 것.
서블릿에 대해 불만을 많이 가진 사람들이 만든 것이 우리가 공부하는 스프링 프레임워크.

스프링이란, 아까 스프링 컨테이너라 언급했는데, 그렇다고 서블릿 컨테이너를 대체하는 건 아니다. 이때 스프링 컨테이너에 들어가는 컴포넌트들을 빈 (BEAN) 이라 부른다. 자바 빈에서의 용어를 따옴. 여러 개의 빈을 가진 스프링 컨테이너가 서블릿 컨테이너 뒷쪽에서 서블릿을 통해 웹으로 들어오는 요청을 받아 스프링 컨테이너에게 다시 넘겨주는 것. 스프링 컨테이너가 이건 어느 빈이 이 요청을 처리해라, 작업하는 동안 이런 기능이 필요하니 이 작업이 필요하다 다시 호출하기도 하고, 스프링 컨테이너 안에서 우리가 만든 애플리케이션이 동작하는 것.
하면 안된다. 기본적으로 자바의 표준 웹 기술을 사용하려면 어쨌건 서블릿 컨테이너가 존재해야한다.
스프링으로 애플리케이션 개발하는 것만 집중해 저 빈을 어떻게 구성하고 이를 스프링 컨테이너에 어떻게 담을지 등만 고민하고 개발하면 좋겠는데 이걸 동작하려면 무조건 서블릿 컨테이너가 떠야 한다. 근데 이 서블릿 컨테이너를 띄우는게 간단하지 않다. 이게 오래된 기술이기도 하고 많은 걸 포용하려 여러 다양한 설정방법을 요구하고 있다.
그래서 서블릿 컨테이너가 없는, 컨테이너리스 웹 아키텍처를 만들어줬으면 좋겠다 하는 건 서블릿 컨테이너를 안쓰고 스프링 컨테이너가 웹 요청을 받았으면 하는게 아닌 서블릿 컨테이너가 필요는 하고 동작해야 하지만 이를 설치, 관리하는 건 너무 신경 쓸 게 많으니 이런 수고 없이 할 수 있으면 좋겠다.
스프링부트가 제공해줌으로써 정을 우리가 하나도 신경 쓰지 않고 일단 개발을 시작하고 서버를 띄우고 동작할 수 있다. 물론 나중에 원하면 이 Servlet Container를 굉장히 깊이 있게 살펴보고 원하는 방식으로 튜닝하거나 커스터마이징 할 수 있다.
어쨌거나 몰라도 스프링을 개발하는 데에는 저런 걸 작성하고 빈으로 등록하면 된다는 걸 안다면 바로 웹 환경에서 동작하는 스프링 애플리케이션을 만들고 사용할 수 있다. 이게 Spring Boot 가 적용한 방식이다.