본문 바로가기
Spring Study

빈 팩토리(BeanFactory)와 팩토리 빈(FactoryBean)

by xogns93 2024. 8. 11.

1. 빈 팩토리 (BeanFactory)

정의

  • **빈 팩토리(BeanFactory)**는 스프링의 IoC (Inversion of Control) 컨테이너의 최상위 인터페이스입니다. 빈 팩토리는 스프링 애플리케이션에서 빈(Bean)을 생성하고 관리하는 책임을 맡고 있습니다.
  • ApplicationContext는 BeanFactory를 확장한 인터페이스로, 대부분의 경우 스프링 애플리케이션에서 ApplicationContext를 사용하여 빈을 관리하지만, 기본적인 빈 관리 기능은 BeanFactory에서 제공됩니다.

주요 기능

  • 의존성 주입: 빈 팩토리는 빈 간의 의존성을 관리하고, 주입하는 역할을 합니다.
  • 지연 초기화: 기본적으로 빈 팩토리는 요청 시점에 빈을 초기화하는 지연 초기화(Lazy Initialization)를 지원합니다. 이는 메모리 사용을 최적화하고, 애플리케이션 시작 시간을 단축하는 데 도움이 됩니다.
  • 빈 생성 및 관리: 빈 팩토리는 빈의 생성, 설정, 생명주기 관리 등의 역할을 수행합니다.

사용 예시

빈 팩토리는 직접적으로 사용하기보다는 ApplicationContext를 통해 사용되는 경우가 많습니다. 그러나, 간단한 예시를 통해 빈 팩토리의 사용을 살펴볼 수 있습니다.

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;

public class MainApp {
    public static void main(String[] args) {
        BeanFactory factory = new XmlBeanFactory(new ClassPathResource("Beans.xml"));
        MyBean myBean = (MyBean) factory.getBean("myBean");
        myBean.doSomething();
    }
}

위 예시는 빈 팩토리의 기본 사용법을 보여줍니다. XmlBeanFactory는 XML 파일에서 빈 정의를 읽어와 빈을 관리합니다. 하지만, XmlBeanFactory는 스프링 3.1 이후로 더 이상 권장되지 않으며, 대신 ApplicationContext를 사용하는 것이 일반적입니다.

 

 

2. 팩토리 빈 (FactoryBean)

정의

  • **팩토리 빈(FactoryBean)**은 스프링에서 빈을 생성하는 데 사용되는 특별한 빈입니다. FactoryBean 인터페이스를 구현하면, 스프링 컨테이너는 이 빈을 통해 다른 객체를 생성하고 관리합니다.
  • FactoryBean 인터페이스를 구현한 클래스는 getObject() 메서드를 통해 실제 빈을 생성하여 반환합니다. 스프링 컨테이너는 이 메서드에서 반환된 객체를 빈으로 등록하고 관리합니다.

주요 기능

  • 복잡한 객체 생성: FactoryBean은 복잡한 초기화나 생성 과정이 필요한 객체를 생성하는 데 유용합니다.
  • 동적 빈 생성: FactoryBean을 사용하면 빈 생성 로직을 동적으로 정의할 수 있습니다.
  • 특정 객체 타입 반환: FactoryBean을 사용하여 빈을 생성할 때, 특정 객체 타입을 반환하도록 구성할 수 있습니다.

사용 예시 :

import org.springframework.beans.factory.FactoryBean;

public class MyServiceFactoryBean implements FactoryBean<MyService> {

    @Override
    public MyService getObject() {
        return new MyService(); // 복잡한 로직을 통해 MyService 객체를 생성
    }

    @Override
    public Class<?> getObjectType() {
        return MyService.class;
    }

    @Override
    public boolean isSingleton() {
        return true; // 이 팩토리 빈이 생성하는 객체가 싱글턴인지 여부를 반환
    }
}

 

이제 스프링 설정에서 이 FactoryBean을 빈으로 등록할 수 있습니다:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {

    @Bean
    public MyServiceFactoryBean myServiceFactoryBean() {
        return new MyServiceFactoryBean();
    }
}

 

스프링 컨텍스트에서 MyService 빈을 사용할 수 있습니다:

import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class MainApp {
    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        MyService myService = context.getBean(MyService.class);
        myService.performTask();
    }
}

 

 

요약

  • 빈 팩토리(BeanFactory): 스프링 IoC 컨테이너의 최상위 인터페이스로, 빈의 생성과 관리를 책임집니다. ApplicationContext는 이를 확장한 인터페이스로, 애플리케이션 전반에 걸쳐 사용됩니다.
  • 팩토리 빈(FactoryBean): 특정 객체를 생성하고 반환하는 로직을 캡슐화할 수 있는 특별한 빈입니다. FactoryBean 인터페이스를 구현하여, 복잡한 객체 생성 과정을 처리하거나, 다양한 유형의 객체를 동적으로 생성할 수 있습니다.

이 두 개념은 스프링 프레임워크에서 빈을 관리하고 생성하는 중요한 역할을 하며, 각각의 상황에 맞게 활용될 수 있습니다.