Development/SpringBoot

[Spring] 스프링이란

곽진돔 2024. 3. 31. 19:49

스프링(Spring)과 스프링 부트(Spring Boot)

스프링(Spring) 은 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크입니다. 엔터프라이즈급(기업/사업) 애플리케이션을 개발하기 위한 포괄적인 프로그래밍 및 구성 모델을 제공합니다. 스프링 프레임워크는 다음과 같은 특징을 가지고 있습니다:

  • 경량 컨테이너: 스프링은 경량의 IoC(Inversion of Control) 컨테이너로, 객체의 생성과 생명 주기를 관리합니다.
  • 의존성 주입(Dependency Injection): 스프링은 클래스 간의 의존성을 줄이고, 느슨한 결합을 통해 코드의 유연성과 테스트 용이성을 향상시킵니다.
  • 다양한 지원 기능: 트랜잭션 관리, 웹 MVC, 보안, 데이터 접근, 메시징 등 엔터프라이즈급 애플리케이션을 구축하기 위한 다양한 기능을 제공합니다.
IoC(Inversion of Control), 제어 반전
제어 반전, 제어의 반전, 역제어는 프로그래머가 작성한 프로그램이 재사용 라이브러리의 흐름 제어를 받게 되는 소프트웨어 디자인 패턴을 말한다. 줄여서 IoC이라고 부른다. 전통적인 프로그래밍에서 흐름은 프로그래머가 작성한 프로그램이 외부 라이브러리의 코드를 호출해 이용한다.

 

스프링 부트(Spring Boot) 는 스프링 기반의 애플리케이션을 쉽게 만들 수 있도록 지원하는 도구입니다. 스프링 부트는 스프링 애플리케이션 개발을 위한 초기 설정 작업을 간소화하고, 애플리케이션을 빠르게 시작하고 실행할 수 있도록 해줍니다. 스프링 부트의 주요 특징은 다음과 같습니다:

  • 자동 구성(Auto-configuration): 스프링 부트는 애플리케이션의 종속성에 기반하여 애플리케이션 설정을 자동으로 완료합니다.
  • 독립 실행 가능한 애플리케이션: 스프링 부트는 내장된 서버(Tomcat, Jetty 등)를 이용하여 애플리케이션을 독립 실행 가능한 JAR로 패키징할 수 있도록 지원합니다.
  • 의존성 관리: 스프링 부트는 애플리케이션 개발에 필요한 의존성을 관리하고, 호환되는 버전을 제공합니다.

 

스프링 컨테이너

스프링 프레임워크의 핵심 부분으로, 애플리케이션 내에서 객체(빈)의 생성, 관리, 구성을 담당하는 역할을 합니다. 이 컨테이너는 Inversion of Control(IoC) 원칙을 기반으로 작동하며, 애플리케이션의 구성과 생명 주기 관리를 담당합니다. 스프링 컨테이너를 통해 개발자는 객체 생성과 의존성 관리를 스프링 프레임워크에 위임함으로써, 더 유연하고 관리하기 쉬운 코드를 작성할 수 있습니다.

 

스프링 컨테이너의 종류

스프링 컨테이너는 크게 두 가지 유형으로 나뉩니다:

  1. BeanFactory: 가장 기본적인 컨테이너 제공 기능을 가지고 있으며, 빈을 생성하고 구성합니다. 요청 시점에 빈을 로딩하고 관리하는 지연 로딩 방식을 사용합니다.
  2. ApplicationContext: BeanFactory의 하위 인터페이스로, 보다 확장된 기능을 제공합니다. 국제화, 이벤트 전파, 리소스 로딩 같은 엔터프라이즈급 기능을 지원합니다. 일반적으로 스프링 애플리케이션에서는 ApplicationContext를 더 많이 사용합니다.
  3. 스프링 컨테이너의 작동 방식
  4. 빈 정의: 개발자는 애플리케이션의 빈과 그 의존성을 XML, 노테이션, 자바 기반 설정을 통해 정의합니다.
  5. 빈 등록: 스프링 컨테이너는 빈 정의를 읽어들여 빈을 등록합니다. 이때 각 빈에 대한 메타데이터(클래스 정보, 스코프, 의존성 등)가 컨테이너에 저장됩니다.
  6. 빈 생성: 스프링 컨테이너는 빈의 메타데이터를 바탕으로 빈 인스턴스를 생성합니다. 이 과정에서 의존성 주입이 이루어집니다.
  7. 사용 및 관리: 애플리케이션은 스프링 컨테이너로부터 필요한 빈을 가져와 사용합니다. 스프링 컨테이너는 빈의 전체 생명 주기(생성, 사용, 소멸)를 관리합니다.

스프링 컨테이너와 빈, 의존성 주입의 개념은 스프링 프레임워크의 핵심이며, 스프링을 통한 애플리케이션 개발에 있어 기본적으로 이해해야 할 중요한 부분입니다.

 

빈(Bean)

스프링에서 관리하는 객체를 빈(Bean)이라고 합니다. 빈은 스프링 IoC 컨테이너에 의해 인스턴스화, 구성, 관리되는 객체를 의미합니다. 개발자는 XML, 애노테이션, 자바 기반 설정을 통해 빈을 정의할 수 있으며, 스프링 컨테이너는 이러한 정의를 바탕으로 빈의 생명 주기를 관리합니다.

 

빈과 컨테이너?

스프링 프레임워크의 빈과 컨테이너 개념은 Java 생태계에서 IoC(Inversion of Control)와 DI(Dependency Injection)를 구현하는 방법 중 하나입니다. 이러한 패턴은 다른 언어나 프레임워크에서도 비슷한 형태로 나타나며, 각각의 생태계에서는 이를 구현하기 위한 도구나 라이브러리를 제공합니다. 여기 몇 가지 예를 들어보겠습니다:

 

Python

  • Django: Python의 웹 프레임워크인 Django는 컴포넌트 간의 느슨한 결합을 지원하는 여러 기능을 제공합니다. 예를 들어, Django의 signals 시스템은 이벤트를 기반으로 다른 애플리케이션에 알림을 보내는 방식으로, IoC의 형태를 띕니다.
  • FlaskDependency Injector: Flask는 마이크로 웹 프레임워크이며, Dependency Injector는 Flask와 같은 프레임워크에서 사용할 수 있는 DI 컨테이너를 제공합니다.

 

PHP

  • Laravel: Laravel은 서비스 컨테이너(Service Container)를 포함하고 있는데, 이는 스프링의 빈 컨테이너와 유사한 역할을 합니다. Laravel의 서비스 컨테이너를 통해 개발자는 클래스의 의존성을 쉽게 관리하고, IoC를 활용할 수 있습니다.

 

JavaScript/Node.js

  • NestJS: Node.js를 위한 프레임워크인 NestJS는 Angular의 DI 시스템에서 영감을 받았습니다. 이 프레임워크는 모듈, 프로바이더(서비스), 컨트롤러 등을 사용하여 애플리케이션의 다양한 부분을 구성하며, 각 컴포넌트 간의 의존성을 IoC 컨테이너를 통해 관리합니다.
  • React: React 자체는 UI 라이브러리이기 때문에 IoC나 DI 패턴을 직접적으로 구현하진 않습니다. 하지만, React 생태계에서는 상태 관리 라이브러리(예: Redux, MobX)를 통해 애플리케이션의 상태 관리 로직을 구성 컴포넌트로부터 분리(decouple)하는 패턴을 적용할 수 있습니다. 이는 IoC의 한 형태로 볼 수 있습니다.

 

Kubernetes

컨테이너라는 용어 때문에, k8s에서의 컨테이너와 혼동이 있어서 찾아보았습니다.
  • Kubernetes(K8s)는 컨테이너 오케스트레이션 도구로, 애플리케이션 컨테이너의 배포, 관리를 자동화합니다. Kubernetes 자체는 소프트웨어 개발 패턴과는 거리가 있지만, '컨테이너'라는 용어를 사용하는 점에서 혼동을 일으킬 수 있습니다. Kubernetes의 컨테이너는 애플리케이션의 실행 환경을 격리시켜주는 소프트웨어 패키지를 의미하며, 스프링의 빈 컨테이너와는 다른 개념입니다.

각각의 언어나 프레임워크가 제공하는 IoC와 DI 구현은 서로 다를 수 있으나, 기본적으로는 애플리케이션의 결합도를 낮추고, 유연성 및 테스트 용이성을 높이는 공통된 목표를 가지고 있습니다.