본문 바로가기
Spring Study

FactoryBean과 ProxyFactoryBean

by xogns93 2024. 8. 26.

FactoryBeanProxyFactoryBean은 모두 Spring 프레임워크에서 사용되는 개념이지만, 각각의 역할과 목적이 다릅니다. 

1. FactoryBean

  • 정의: FactoryBean은 Spring에서 사용되는 특수한 빈으로, 특정 객체를 생성하는 데 사용됩니다. 이 객체는 단순한 객체 생성뿐만 아니라, 복잡한 객체 생성 로직이 필요할 때 주로 사용됩니다.
  • 목적: FactoryBean은 개발자가 복잡한 초기화나 객체 생성 로직을 캡슐화할 수 있도록 도와줍니다. FactoryBean을 사용하면, 실제 빈 대신에 FactoryBean이 관리하는 객체를 Spring 컨테이너에서 사용할 수 있습니다.
  • 작동 방식:
    • FactoryBean 인터페이스를 구현한 클래스는 getObject() 메서드를 통해 Spring 컨테이너가 실제로 사용할 객체를 반환합니다.
    • 개발자는 이 FactoryBean을 정의하고, 이를 통해 반환된 객체를 애플리케이션에서 사용할 수 있습니다.
  • 예시:
    • 예를 들어, 복잡한 초기화 작업이 필요한 데이터 소스를 설정하거나, 여러 객체를 조합하여 하나의 객체를 생성하는 경우에 FactoryBean을 사용할 수 있습니다.
    public class MyFactoryBean implements FactoryBean<MyObject> {
      @Override
      public MyObject getObject() throws Exception {
          // 복잡한 객체 생성 로직
          return new MyObject();
      }
    
      @Override
      public Class<?> getObjectType() {
          return MyObject.class;
      }
    }
  • XML 설정:
  • <bean id="myObject" class="com.example.MyFactoryBean"/>
  • 이 경우, myObject라는 빈은 MyFactoryBean이 생성하는 MyObject 인스턴스를 가리킵니다.

2. ProxyFactoryBean

  • 정의: ProxyFactoryBean은 Spring AOP에서 사용되는 빈으로, 프록시 객체를 생성하여 AOP 어드바이스를 타겟 객체에 적용하는 데 사용됩니다.
  • 목적: ProxyFactoryBean은 타겟 객체에 프록시를 적용하여, 메서드 호출을 가로채고 추가적인 동작(어드바이스)을 수행하는 데 사용됩니다. 이를 통해 공통 관심사(예: 로깅, 트랜잭션 관리)를 메인 비즈니스 로직과 분리할 수 있습니다.
  • 작동 방식:
    • ProxyFactoryBean은 AOP 어드바이스(예: MethodInterceptor)와 타겟 객체를 설정하여, 프록시를 생성합니다.
    • 이 프록시는 타겟 객체의 메서드를 호출할 때마다 어드바이스를 적용할 수 있습니다.
  • 예시:
    • 예를 들어, ProxyFactoryBean을 사용하여 특정 서비스에 로깅 기능을 추가할 수 있습니다.
    <bean id="myServiceTarget" class="com.example.MyServiceImpl"/>
    
    <bean id="loggingAdvice" class="com.example.LoggingAdvice"/>
    
    <bean id="myServiceProxy" class="org.springframework.aop.framework.ProxyFactoryBean">
      <property name="target" ref="myServiceTarget"/>
      <property name="interceptorNames">
          <list>
              <value>loggingAdvice</value>
          </list>
      </property>
    </bean>
  • 이 설정에서 myServiceProxy라는 프록시 빈은 MyServiceImpl의 메서드 호출을 가로채어 LoggingAdvice를 적용합니다.

차이점 요약

  1. 목적:
    • FactoryBean: 복잡한 객체 생성 로직을 캡슐화하여, Spring 컨테이너에서 관리되는 빈을 생성하는 데 사용됩니다.
    • ProxyFactoryBean: 타겟 객체에 프록시를 적용하여 AOP 어드바이스를 추가하는 데 사용됩니다.
  2. 역할:
    • FactoryBean: getObject() 메서드를 통해 직접 생성된 객체를 반환합니다.
    • ProxyFactoryBean: 프록시 객체를 생성하여, 프록시를 통해 타겟 객체의 메서드 호출을 가로채고 어드바이스를 적용합니다.
  3. 사용 상황:
    • FactoryBean: 복잡한 초기화나 객체 생성 로직이 필요한 경우, 커스텀 객체를 생성하기 위해 사용됩니다.
    • ProxyFactoryBean: AOP를 적용하여 메서드 호출 전후에 추가적인 동작을 수행하거나, 타겟 객체의 메서드 호출을 제어하고자 할 때 사용됩니다.

결론

  • FactoryBean은 복잡한 객체 생성 논리를 캡슐화하여 Spring 컨테이너가 관리하는 빈을 생성하는 데 사용됩니다.
  • ProxyFactoryBean은 AOP를 지원하며, 타겟 객체에 프록시를 생성하여 어드바이스를 적용하는 데 사용됩니다.

 


 

FactoryBean ProxyFactoryBean은 과거에 자주 사용되던 방식이지만, 현재는 Spring의 다른 기능들로 대체되어 사용하는 빈도가 많이 줄었습니다.

 

1. FactoryBean

  • 현대적 대체:
    • Java Config: Spring에서는 이제 Java 기반의 설정 클래스(@Configuration)와 함께 팩토리 메서드를 통해 복잡한 객체를 생성하는 방식을 더 많이 사용합니다.
    • @Bean 메서드: @Bean 애노테이션을 사용하여 Spring 컨테이너에 빈을 등록할 때, 복잡한 초기화 로직이 필요한 경우 메서드 내부에 직접 구현할 수 있습니다.

2. ProxyFactoryBean

  • 현대적 대체:
    • @AspectJ 애노테이션 기반 AOP: Spring 2.0 이후, @Aspect와 같은 애노테이션 기반의 AOP 방식이 도입되면서, ProxyFactoryBean을 직접 사용하는 방식은 많이 줄어들었습니다.

 

 

결론

  • FactoryBean ProxyFactoryBean은 Spring의 초기 버전에서 중요한 역할을 했지만, 현재는 Spring의 발전된 기능과 새로운 애노테이션 기반 방식으로 인해 그 사용 빈도가 줄어들었습니다.
  • 대신, Spring에서는 더 직관적이고 간결한 Java Config 애노테이션 기반 AOP 방식을 주로 사용합니다. 이러한 새로운 방식들은 코드를 더 쉽게 관리하고, 설정을 간소화하며, 현대적인 Spring 개발 패턴에 더 잘 맞습니다.
  • 그러나 FactoryBean과 ProxyFactoryBean이 완전히 사라진 것은 아닙니다. 특정 상황이나 레거시 시스템에서는 여전히 사용될 수 있으며, 이들 개념을 이해하는 것은 여전히 유용합니다.