SPRING

[Spring] Spring Boot Container란 무엇인가?

sagecode 2024. 12. 26. 13:35

1. 컨테이너(Container)를 왜 사용하는가?

  • 객체 간의 의존성 문제 해결

소프트웨어 개발에서 객체 간의 의존성은 필수적이다. 그러나 객체가 서로 강하게 결합되어 있으면 코드 변경 시 모든 연관된 코드가 수정되어야 하는 문제가 발생한다. Spring Boot의 컨테이너는 객체 간의 의존성을 주입해주는 역할을 하여 이런 문제를 해결한다.

  • 코드의 모듈화와 유지보수성 향상

컨테이너는 객체 생성을 개발자가 직접 처리하지 않도록 하여 코드의 모듈화를 지원합니다. 이는 객체 간의 결합도를 낮추고, 유지보수성과 확장성을 향상시킨다.

  • 개발자 작업의 단순화

컨테이너는 애플리케이션의 객체 생성과 의존성 주입, 생명주기 관리를 자동으로 처리한다. 개발자는 비즈니스 로직 구현에 집중할 수 있으며, 반복적인 작업에서 벗어날 수 있다.

 

2. 컨테이너(Container)란 무엇인가?

  • Spring Boot에서의 컨테이너 정의

Spring Boot에서 이야기하는 컨테이너는 의존성 주입 컨테이너(Dependency Injection Container)를 의미한다. 이는 애플리케이션의 객체를 생성하고, 객체 간의 의존성을 관리하며, 생명주기를 책임지는 환경이다.

  • 의존성 주입 컨테이너(DI Container)란?

DI 컨테이너는 개발자가 객체 생성과 의존성 관리를 직접 처리하지 않아도 되게 만드는 프레임워크의 핵심 구성 요소이다. Spring Boot는 이를 통해 애플리케이션의 모듈화와 확장성을 크게 향상시킨다.

 

3. 컨테이너(Container)의 주요 역할

  • 객체 생성 및 관리

컨테이너는 @Component, @Service, @Repository와 같은 Annotation으로 등록된 클래스의 객체를 생성하고 관리한다.

  • 의존성 주입

의존성이 필요한 클래스는 @Autowired 또는 생성자 주입을 통해 자동으로 필요한 객체를 주입받는다.

@Component
public class ServiceA {
    private final ServiceB serviceB;
    
    @Autowired
    public ServiecA(ServiceB serviceB) {
        this.serviceB = serviceB;
    }
}
  • Bean 등록 및 생명주기 관리

컨테이너는 빈의 생명주기(생성 -> 초기화 -> 소멸)을 관리하며, @PostConstruct와 @PreDestroy 같은 Annotation을 통해 초기화 . 및정리 작업을 수행할 수 있다.

  • 제어의 역전(Inversion of Control, IoC)

컨테이너가 객체의 생성과 의존성 관리를 담당하므로, 개발자는 이러한 작업에서 해방되어 비즈니스 로직에 집중할 수 있다.

 

4. Spring Boot 컨테이너(Container) 종류

스프링 컨테이너(Spring Container)는 두 가지 주요 인터페이스인 BeanFactory와 ApplicationContext로 구현된다.

 

  • BeanFactory

BeanFactory는 스프링 컨테이너의 최상위 인터페이스로, 기본적인 IoC(제어의 역전) 기능을 제공한다. BeanFactory는 빈을 등록, 생성, 조회 등의 빈을 관리하는 역할을 하며, getBean() 메소드를 통해 Bean을 인스턴스화 할 수 있다.

@Bean Annotation이 붙은 메소드의 이름을 Spring Bean의 이름으로 사용하여 Bean 등록을 한다.

  • ApplicationContext

애플리케이션 컨텍스트(ApplicationContext)는 BeanFactory를 확장하여, 더 풍부한 기능을 제공하는 인터페이스다. 대부분의 Spring Application에서 주로 사용된다. MessageSource, EnvironmentCapable, ApplicationEventPublisher 등의 기능을 제공한다.

특징 BeanFactory ApplicationContext
기능 범위 기본 IoC 컨테이너 확장된 IoC 컨테이너
사용 시점 간단한 테스트 및 리소스 제한 환경 일반적인 스프링 애플리케이션
초기화 지연 초기화(Lazy Loading) 지원 애플리케이션 시작 시 빈을 미리 로드
부가 기능 제공 여부 없음 있음 (다국어, 이벤트, 리소스 로딩 등 지원)

 

스프링 애플리케이션에서는 대부분 ApplicationContext를 사용하며, 필요에 따라 BeanFactory의 경량 기능을 활용하기도 합니다. 스프링 컨테이너의 이러한 구조는 애플리케이션의 유연성과 확장성을 높이는 데 기여합니다.