⭐ Plogramming/Spring

IoC 컨테이너와 @Bean, @Component

김진한

1. IoC 컨테이너 

  • 애플리케이션 컴포넌트의 라이프사이클을 관리
  • 컴포넌트 간의 의존성을 주입하는 기능을 제공하는 프레임워크
  • BeanFactory
    • ApplicationContext의 상위 인터페이스
    • XML 파일이나 자바 설정 클래스 등에서 Bean의 정의를 읽어와서 Bean을 생성하고, 필요한 곳에서 의존성 주입을 수행함
    • Bean의 생명주기를 관리하여, Bean이 생성될 때 초기화 작업을 수행하고, 애플리케이션이 종료될 때 Bean을 소멸시킴
    • 지연 초기화(lazy initialization)를 지원
      • Bean이 필요한 시점까지 생성을 지연시켜서, 메모리와 자원을 관리
    • 인터페이스를 이용해서 다른 컨테이너와 연동할 수 있음
  • ApplicationContext
    • BeanFactory의 확장된 버전
    • BeanFactory와 달리 미리 Bean을 생성하고 초기화하므로, 지연 초기화(lazy initialization)보다 빠른 초기화가 가능
    • XML 파일이나 자바 설정 클래스를 사용하여 구성할 수 있으며, WebApplicationContext를 사용하여 웹 애플리케이션에서도 사용할 수 있음
    • 스프링에서 지원하는 다른 프레임워크와 연동할 수도 있음
    • 스프링에서는 ApplicationContext를 사용하여 필요한 Bean을 가져와서 사용하며, Bean을 관리하고 생명주기를 관리
    • 대체로 시간 및 효율이 좋아 더 많이 사용함

2. @Bean 

  • 스프링에서 Bean으로 등록되어 IoC 컨테이너에서 관리되는 객체의 라이프사이클을 관리하고, 필요한 곳에서 의존성 주입을 수행하는 데 사용하는 어노테이션
  • 개발자가 직접 작성한 클래스를 Bean으로 등록할 때
  • 메소드 레벨에서 사용되며, 해당 메소드가 반환하는 객체가 Bean으로 등록
  • 예를 들어, @Bean 어노테이션을 사용하여 DataSource 객체를 등록하면, 컨테이너는 이 DataSource 객체를 관리하고, 다른 컴포넌트에서 필요할 때 해당 빈 객체를 주입합니다.
@Configuration
public class MyConfig {
 
   @Bean
   public MyService myService() {
      return new MyService();
   }
}

3. @Component 

  • 스프링에서 Bean으로 등록되어 IoC 컨테이너에서 관리되는 객체의 라이프사이클을 관리하고, 필요한 곳에서 의존성 주입을 수행하는 데 사용하는 어노테이션
  • @Controller, @Service, @Repository 어노테이션으로 세분화 -> 각각 컨트롤러, 서비스, 레파지토리 역할을 하는 클래스를 Bean으로 등록할 때 사용
  • 클래스 레벨에서 사용되며, 해당 클래스가 Bean으로 등록
  • @Component 어노테이션을 사용하여 등록한 클래스는 기본적으로 싱글톤으로 관리
@Component
public class MyService {
}

 

cf) 

빈(Bean)은 스프링 컨테이너에 의해 관리되는 재사용 가능한 소프트웨어 컴포넌트이다.

즉, 스프링 컨테이너가 관리하는 자바 객체를 뜻하며, 하나 이상의 빈(Bean)을 관리한다.

빈은 인스턴스화된 객체를 의미하며, 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다.

@Bean 어노테이션을 통해 메서드로부터 반환된 객체를 스프링 컨테이너에 등록한다.