반응형
팩토리빈과 팩토리 메소드
팩토리메소드를 통한 인스턴스 생성은 XML에서 어떻게 표현할 수 있을까? (spring xml factory)
생성자 대신 오브젝트를 생성해주는 코드의 도움을 받아서 빈 오브젝트를 생성하는 것을 팩토리 빈이라고 부른다.
빈 팩토리와 비슷하지만 전혀 다르니 혼돈 ㄴㄴ
팩토리 빈 자신은 빈 오브젝트로 사용되지 않는다. 대신 빈 오브젝트를 만들어주는 기능만 제공해줄 뿐이다.
팩토리 기능을 가진 빈을 통째로 사용하는 방법도 있지만, 특정 빈이나 클래스의 팩토리 메소드를 사용해서 빈을 등록하는 방법도 있다.
1. FactoryBean 인터페이스
new 키워드나 리플렉션 API를 이용해 생성자를 호출하는 방식으로는 만들 수 없는 JDK 다이내믹 프록시를 빈으로 등록하기 위해 FactoryBean 인터페이스를 구현해서 다이내믹 프록시를 생성하는 getObject() 메소드를 구현하고 팩토리 빈으로 등록해서 사용했다.
가장 단순하고 자주 사용하는 방법이다.
2. 스태틱 팩토리 메소드
클래스의 스태틱 메소드를 호출해서 인스턴스를 생성하는 방식이다. JDK를 비롯해서 다양한 기술 API에서 자주 사용된다.
팩토리 메소드를 호출해서 빈 오브젝트를 생성해야 한다면 <bean> 태그에 사용할 수 있는 factory-method 애트리뷰트를 이용하는 것이 편리
전통적인 싱글톤 클래스는 생성자를 직접 호출해서 오브젝트를 만들 수 없다. 생성과 함께 초기화 작업이 필요한 경우라면 스태틱 팩토리 메소드를 이용해야 한다.
<bean id="counter" class="GlobalCounter" factory-method="createInstance”/>
GlobalCounter라는 싱글톤 클래스의 createInstance 메소드를 호출해서 빈으로 등록해주는 설정
3. 인스턴스 팩토리 메소드
스태틱 메소드 대신 오브젝트의 인스턴스 메소드를 이용해 빈 오브젝트를 생성할 수도 있다.
FactoryBean 인터페이스를 구현한 팩토리 빈이 바로 팩토리 빈 오브젝트의 메소드를 이용해 빈 오브젝트를 생성하는 대표적인 방법이다.
하지만 FactoryBean이라는 스프링의 인터페이스에 종속적이라는 단점이 있다.
임의의 오브젝트의 메소드를 호출해서 빈을 생성해야 한다면, factory-bean과 factory-method를 함께 사용할 수 있다. 이때는 팩토리 기능을 제공할 빈을 따로 등록해둬야 한다.
logFactory 빈의 createLog 메소드를 호출해서 log 빈을 생성하는 설정이다. 이때는 class를 지정하지 않아도 된다.
<bean id="logFactory" class="...LogFactory"/>
<bean id="log" factory-bean="logFactory" factory-method="createLog”/>
4. @Bean 메소드
@Bean 메소드도 일종의 팩토리 메소드다.
스프링 컨테이너가 @Bean 메소드를 실행해 빈 오브젝트를 가져오는 방식이기 때문이다. 아예 자바 코드에 의해 빈의 설정과 DI를 대폭 적용한다면 @Configuration이 붙은 설정 전용 클래스를 사용하는 것이 편리하다.
반면에 특정 빈만 팩토리 메소드를 통해 만들고 싶다면 일반 빈 클래스에 @Bean 메소드를 추가하는 방법을 사용하는 편이 낫다.
(출처 : 토비의 스프링)
반응형
'프로그래밍 노트 > SPRING' 카테고리의 다른 글
[Spring] @ModelAttribute, @RequestAttribute (5) | 2019.07.17 |
---|---|
[Spring] junit을 활용한 스프링 테스트 (0) | 2018.09.21 |
[Spring] 빈(bean)생명주기 메소드 (0) | 2018.09.09 |
[Spring] 컨테이너가 자동등록하는 빈 (0) | 2018.09.07 |
[Spring] 프로퍼티(properties) 다루기 (0) | 2018.09.07 |