인프런 커뮤니티 질문&답변

작성자 없음

작성자 정보가 삭제된 글입니다.

스프링 핵심 원리 - 기본편

스프링으로 전환하기

static Factory method로 빈 생성

작성

·

142

·

수정됨

0

스프링으로 전환하기 1:07 부터의 강의 내용에 추가로 공부하다가 생긴 의문점에 관한 내용입니다.

스프링공식문서

위의 공식문서에서는 빈을 생성하는 또다른 방법으로 정적 팩터리 메서드가 있다고 했습니다.

public class StaticFactoryMethodBean {

    private String value;

    private StaticFactoryMethodBean(String value) {
        this.value = value;
    }

    public static StaticFactoryMethodBean createInstance(String value) {
        return new StaticFactoryMethodBean(value);
    }
}

이런 클래스가 있다고 가정하면, 두가지 종류의 빈을 만들 수 있습니다.
(물론 따로 따로 생성. 동시에 두가지는 생성이 안됨.)
(컴파일에러는 안나지만, 실제 실행을 시키면 런타임 에러 발생)

@Configuration
public class AppConfig {
    @Bean
    public StaticFactoryMethodBean factoryMethodBean() {
        return StaticFactoryMethodBean.createInstance("value");
    }

    @Bean
    public static StaticFactoryMethodBean staticFactoryMethodBean() {
        return StaticFactoryMethodBean.createInstance("value");
    }
}

여기서 생기는 궁금점이 있어서 질문드립니다.

이 static 빈은 @Configuration 에 영향을 받지 않고, 프록시를 생성하지 않아 여러 기능들을 쓸 수 없다고 생각이 들었습니다.

그럼에도 이걸 쓰는 경우가 있을까 해서 질문드립니다. 제 생각엔 외부 라이브러리나 이런거를 쓸 때, 쓸 거 같기도 하단 생각이 들었습니다. 혹시 실무에서도 쓰는 경우가 종종 있었는지 여쭈어봅니다.

답변 2

0

질문에 오류가 있어 다시 질문드립니다.
헷갈리게 해서 죄송합니다.
https://www.inflearn.com/questions/1280576/static-factory-method%EB%A1%9C-%EB%B9%88-%EC%83%9D%EC%84%B1

0

안녕하세요, 인프런 AI 인턴입니다.

임형준님의 질문은 스프링에서 제공하는 정적 팩토리 메서드(StaticFactoryMethodBean.createInstance)를 사용하여 빈을 생성하고, 이 방법이 @Configuration과 연동되어 프록시 기반의 강화된 기능을 제공하지 못하는 사례에 대해 언급하고 있습니다. 또한, 실제로 이러한 방식이 실무에서 사용되는 경우가 있는지에 대한 궁금증이 담겨 있습니다.

이에 가장 관련있는 정보를 찾아보니, static관련 질문드립니다.에서 비슷한 주제에 대해 토의가 이루어졌습니다. 이 질문에서는 @Bean 어노테이션을 사용한 static 메소드와 이러한 메소드 사용 시 싱글톤 보장 관련 문제, 스프링 컨테이너 관리의 차이 등에 대해 질문하였습니다.

정적 팩토리 메서드를 사용하는 주된 이유는, 인스턴스 생성 로직을 좀 더 유연하게 관리할 수 있도록 도와주며, 좀 더 구체적인 이름을 통해 인스턴스 생성 의도를 명확하게 전달할 수 있다는 장점이 있습니다. 실제로 외부 라이브러리나 특정 상황에서 인스턴스 생성 과정을 세밀하게 제어해야 할 때 사용될 수 있습니다.

단, 스프링에서는 @Bean 메소드 내에서 정적 팩토리 메서드를 호출하는 방식이 자주 사용됩니다. 이 경우 @Configuration 클래스가 프록시로 감싸지는 CGLIB 프록시 메커니즘을 통해, 스프링 컨테이너가 빈의 싱글톤을 보장할 수 있습니다. 하지만 static 메서드에 @Bean 어노테이션을 직접 사용하는 경우는 프록시로 인한 싱글톤 보장과 같은 추가적인 스프링 컨테이너 관리 기능을 받을 수 없으므로, 주의해서 사용해야 합니다.

실무에서는 주로 스프링의 DI(Dependency Injection) 기능을 활용하여 빈을 관리하는 것이 일반적입니다. 그러나 특정한 조건이나 제약으로 인해 스프링 컨테이너 밖에서 객체를 생성하거나 관리해야 할 때, 정적 팩토리 메서드를 사용할 수 있습니다. 이는 예를 들어 특정한 설정 값에 따라 다른 타입의 인스턴스를 반환하거나, 생성 비용이 큰 객체를 캐싱하는 등의 경우에 유용하게 적용될 수 있습니다.

실무 사용 사례에 관해서는, 정적 팩토리 메서드 사용이 필요한 특수한 상황이 아닌 이상, 스프링의 @Bean 메서드와 같은 일반적인 스프링 컨테이너 관리 기능을 활용하는 것이 권장됩니다. 외부 라이브러리나 특정 조건 하에서 오브젝트를 생성해야 할 때 유용하게 쓰이기는 하지만, 대부분의 경우 스프링이 제공하는 기능을 최대한 활용하여 객체 관리를 수행하는 것이 바람직합니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

작성자 없음

작성자 정보가 삭제된 글입니다.

질문하기