컨테이너리스 웹 애플리케이션 아키텍처

스프링부트는 컨테이너리스 웹 애플리케이션 아키텍처를 스프링이 지원해줬으면 좋겠다고 한 한 개발자의 요청 사항으로부터 출발. 그럼 컨테이너리스가 뭘까?

컨테이너리스란

컨테이너

그럼 컨테이너 관리를 신경 쓰지 않아도 된다라는 이야기를 하려면, 먼저 컨테이너가 뭔지를 따져봐야 한다. 스프링은 IoC 컨테이너이다. 스프링 컨테이너라고 부르기도.

image.png

자바에서의 컨테이너

이걸 자바 용어로 바꿔볼 것.

image.png

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

스프링 컨테이너와 서블릿 컨테이너

서블릿에 대해 불만을 많이 가진 사람들이 만든 것이 우리가 공부하는 스프링 프레임워크.

image.png

스프링이란, 아까 스프링 컨테이너라 언급했는데, 그렇다고 서블릿 컨테이너를 대체하는 건 아니다. 이때 스프링 컨테이너에 들어가는 컴포넌트들을 빈 (BEAN) 이라 부른다. 자바 빈에서의 용어를 따옴. 여러 개의 빈을 가진 스프링 컨테이너가 서블릿 컨테이너 뒷쪽에서 서블릿을 통해 웹으로 들어오는 요청을 받아 스프링 컨테이너에게 다시 넘겨주는 것. 스프링 컨테이너가 이건 어느 빈이 이 요청을 처리해라, 작업하는 동안 이런 기능이 필요하니 이 작업이 필요하다 다시 호출하기도 하고, 스프링 컨테이너 안에서 우리가 만든 애플리케이션이 동작하는 것.

그럼 스프링 컨테이너가 서블릿 컨테이너를 대체하면 안 될까?

하면 안된다. 기본적으로 자바의 표준 웹 기술을 사용하려면 어쨌건 서블릿 컨테이너가 존재해야한다.

스프링으로 애플리케이션 개발하는 것만 집중해 저 빈을 어떻게 구성하고 이를 스프링 컨테이너에 어떻게 담을지 등만 고민하고 개발하면 좋겠는데 이걸 동작하려면 무조건 서블릿 컨테이너가 떠야 한다. 근데 이 서블릿 컨테이너를 띄우는게 간단하지 않다. 이게 오래된 기술이기도 하고 많은 걸 포용하려 여러 다양한 설정방법을 요구하고 있다.

스프링 프레임워크 등장 배경

그래서 서블릿 컨테이너가 없는, 컨테이너리스 웹 아키텍처를 만들어줬으면 좋겠다 하는 건 서블릿 컨테이너를 안쓰고 스프링 컨테이너가 웹 요청을 받았으면 하는게 아닌 서블릿 컨테이너가 필요는 하고 동작해야 하지만 이를 설치, 관리하는 건 너무 신경 쓸 게 많으니 이런 수고 없이 할 수 있으면 좋겠다.

스프링부트가 제공해줌으로써 정을 우리가 하나도 신경 쓰지 않고 일단 개발을 시작하고 서버를 띄우고 동작할 수 있다. 물론 나중에 원하면 이 Servlet Container를 굉장히 깊이 있게 살펴보고 원하는 방식으로 튜닝하거나 커스터마이징 할 수 있다.

스프링 부트 적용 방식

어쨌거나 몰라도 스프링을 개발하는 데에는 저런 걸 작성하고 빈으로 등록하면 된다는 걸 안다면 바로 웹 환경에서 동작하는 스프링 애플리케이션을 만들고 사용할 수 있다. 이게 Spring Boot 가 적용한 방식이다.