새로운 내용을 공부할 때
새로운 내용의 공부를 시작할 때 용어의 정의를 이해하지 못하거나 정확하게 알지 못한다면 그 용어가 포함된 문장을 이해하지 못합니다.
작은 단어 하나가 내용을 이해하지 못하게 하기 때문에 용어를 정확하게 이해하는 것이 중요합니다.

3 분 소요

컨테이너리스(Containerless)와 스프링 부트의 철학

1. 컨테이너리스란?

컨테이너리스(Containerless)는 웹 애플리케이션에서 컨테이너(서블릿 컨테이너)를 직접 설치하고 관리할 필요 없이 동작할 수 있도록 하는 개념이다. 이를 통해 개발자는 서버 설정과 운영을 신경 쓰지 않고 애플리케이션 개발에 집중할 수 있다.

컨테이너리스는 서버리스(Serverless)와 유사한 개념이다. 서버리스가 개발자가 직접 서버를 관리하지 않고 함수 단위로 실행할 수 있도록 돕는다면, 컨테이너리스는 서블릿 컨테이너를 개발자가 직접 신경 쓰지 않아도 자동으로 설정되고 실행되도록 하는 방식을 의미한다.

즉, 컨테이너리스는 “컨테이너가 없는 것이 아니라, 컨테이너 관리를 신경 쓰지 않아도 된다”는 의미다.


2. 컨테이너(Container)란?

컨테이너는 웹 컴포넌트(예: 서블릿)를 관리하는 역할을 한다. 웹 컴포넌트는 웹 클라이언트의 요청을 받아 동적인 콘텐츠를 생성하는 역할을 하지만, 이를 제대로 동작시키기 위해서는 다음과 같은 관리가 필요하다:

  • 라이프 사이클 관리: 웹 컴포넌트의 생성, 초기화, 종료 등을 담당
  • 요청 라우팅: 클라이언트 요청을 적절한 컴포넌트(서블릿)로 전달하는 역할

2.1 웹 컨테이너(Web Container)

웹 컨테이너는 서블릿을 실행하고 관리하는 환경이다. 대표적인 웹 컨테이너로는 Tomcat, Jetty, Undertow 등이 있다.


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

스프링 애플리케이션은 스프링 컨테이너(IoC 컨테이너)에서 동작한다. 하지만, 웹 애플리케이션을 만들려면 반드시 서블릿 컨테이너가 필요하다.

  • 서블릿 컨테이너(Tomcat 등)
    • 서블릿을 실행하고, 요청을 처리할 서블릿을 찾아 전달하는 역할
    • DispatcherServlet을 통해 요청을 스프링 컨테이너로 전달
  • 스프링 컨테이너(ApplicationContext)
    • 애플리케이션의 주요 컴포넌트(빈)를 관리하고, 서블릿 컨테이너에서 전달받은 요청을 처리

3.1 전통적인 웹 애플리케이션의 문제

과거에는 서블릿 컨테이너를 별도로 설치하고, 복잡한 XML 설정을 해야만 동작했다. 이 과정에서 많은 설정이 필요하고, 배포도 번거로웠다.

스프링 부트는 이를 해결하기 위해 “컨테이너리스” 방식을 도입했다.


4. 컨테이너리스와 스프링 부트의 역할

스프링 부트는 컨테이너리스를 지원하기 위해 내장 서블릿 컨테이너(Embedded Servlet Container)를 제공한다. 즉, 개발자가 별도로 Tomcat 등을 설치할 필요 없이, 애플리케이션 실행과 동시에 서블릿 컨테이너도 함께 실행된다.

4.1 컨테이너리스 방식의 특징

  • 서블릿 컨테이너를 직접 관리할 필요 없음
  • 설정 없이 바로 실행 가능 (main() 메소드 실행 시 내장 컨테이너가 자동 실행됨)
  • 배포가 간편함 (독립 실행형 JAR로 배포 가능)

스프링 부트가 제공하는 컨테이너리스 방식 덕분에 개발자는 애플리케이션의 기능 개발에 집중할 수 있다.


Opinionated(독선적인) 철학

1. 스프링 프레임워크 vs. 스프링 부트

| 구분 | 특징 | | ——————— | ———————————————————— | | 스프링 프레임워크 | 다양한 선택지를 제공하지만, 개발자가 직접 설정해야 함 (Not Opinionated) | | 스프링 부트 | 스프링에서 “가장 좋은 설정”을 기본값으로 제공하여 빠르게 개발할 수 있도록 지원 (Opinionated) |

1.1 스프링 부트의 목표

스프링 부트는 개발자가 고민 없이 개발을 시작할 수 있도록 미리 설정을 제공한다. 이를 통해 개발자는 비즈니스 로직 개발에 집중하고, 환경 설정에 대한 부담을 줄일 수 있다.

1.2 스프링 부트가 제공하는 것

  • 어떤 기술을 사용할지 결정 (JPA, Thymeleaf, Spring Security 등)
  • 라이브러리 및 버전 관리 (Spring Boot Starter 사용)
  • DI 설정 및 기본 설정 제공
  • 애플리케이션 실행 및 배포 방식 자동화

스프링 부트는 스프링을 잘 활용하는 방법을 미리 정의하여 제공함으로써 개발 효율성을 높인다.


2. 스프링 부트의 개발 방식

  1. 스프링 부트가 제공하는 기술과 기본 설정을 수용
  2. 필요하면 외부 설정 파일(application.yml)로 설정 변경
  3. 빠르게 개발을 시작하고 필요한 경우 설정을 수정하여 확장 가능

3. 스프링 부트의 이해와 오해

  • 애플리케이션 기능 코드만 작성하면 된다
    • 설정을 몰라도 개발은 가능하지만, 설정을 이해하면 더 효율적으로 활용할 수 있다.
  • 스프링을 몰라도 개발할 수 있다
    • 기본 설정을 제공하지만, 스프링의 원리를 알면 커스터마이징이 가능하다.
  • 검색해서 문제를 해결하면 된다
    • 내부 동작 방식을 이해하면, 검색 없이도 문제를 해결할 수 있다.

3.1 스프링 부트를 이해하면 얻는 것

  • 스프링 부트가 스프링 기술을 어떻게 활용하는지 배울 수 있다.
  • 스프링 부트가 자동 설정하는 내용을 확인하고, 필요하면 수정할 수 있다.
  • 나만의 스프링 부트 모듈을 만들어 활용할 수 있다.

스프링 부트의 핵심 목표

  1. 빠르고 편리한 스프링 개발 경험 제공
    • 설정 없이 개발을 시작하고, 필요한 경우 설정을 수정 가능
  2. 즉시 사용 가능한 기술 조합 제공 (Opinionated Defaults)
    • “가장 좋은 조합”을 기본값으로 제공하지만, 필요하면 수정 가능
  3. 실무에서 필요한 다양한 기능 내장
    • 내장형 서버, 보안, 메트릭, 상태 체크, 외부 설정 지원
  4. 코드 생성이나 XML 설정이 필요 없음
    • YAML/Properties 설정 파일만으로도 대부분의 설정 가능

정리

| 개념 | 설명 | | ———————— | ———————————————————— | | 컨테이너리스 | 컨테이너(서블릿 컨테이너)를 직접 설치·관리할 필요 없이 실행되는 방식 | | 웹 컨테이너 | 서블릿을 실행하고 요청을 적절한 컴포넌트로 라우팅하는 역할 (예: Tomcat) | | 스프링 컨테이너 | 애플리케이션의 빈을 관리하고, 의존성 주입을 수행하는 역할 | | 내장 서블릿 컨테이너 | 스프링 부트가 제공하는 자동 설정된 서블릿 컨테이너 (Tomcat, Jetty 등) | | Opinionated | 개발자가 고민하지 않아도 되는 “가장 좋은 설정”을 기본 제공 |

스프링 부트를 잘 활용하면 빠르게 개발을 시작할 수 있고, 필요할 때 유연하게 확장 가능하다.

##

태그:

카테고리:

업데이트:

댓글남기기