FactoryBean
과 ProxyFactoryBean
은 모두 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
를 적용합니다.
차이점 요약
- 목적:
FactoryBean
: 복잡한 객체 생성 로직을 캡슐화하여, Spring 컨테이너에서 관리되는 빈을 생성하는 데 사용됩니다.ProxyFactoryBean
: 타겟 객체에 프록시를 적용하여 AOP 어드바이스를 추가하는 데 사용됩니다.
- 역할:
FactoryBean
:getObject()
메서드를 통해 직접 생성된 객체를 반환합니다.ProxyFactoryBean
: 프록시 객체를 생성하여, 프록시를 통해 타겟 객체의 메서드 호출을 가로채고 어드바이스를 적용합니다.
- 사용 상황:
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이 완전히 사라진 것은 아닙니다. 특정 상황이나 레거시 시스템에서는 여전히 사용될 수 있으며, 이들 개념을 이해하는 것은 여전히 유용합니다.
'Spring Study' 카테고리의 다른 글
Delegate Pattern (위임 패턴) (0) | 2024.08.28 |
---|---|
[ AOP 포인트컷 ] 클래스 필터(ClassFilter)와 메서드 매처(MethodMatcher) (0) | 2024.08.27 |
Aspect 와 Aspect J 의 차이 (0) | 2024.08.23 |
AOP(Aspect-Oriented Programming)의 중요한 세 가지 기술 (0) | 2024.08.19 |
"Eager"(즉시 모드)와 "Lazy"(지연 모드) (0) | 2024.08.11 |