inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 핵심 원리 - 기본편

스프링으로 전환하기

static Factory method로 빈 생성

226

작성자 없음

작성한 질문수 0

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 에 영향을 받지 않고, 프록시를 생성하지 않아 여러 기능들을 쓸 수 없다고 생각이 들었습니다.

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

spring 객체지향

답변 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 인턴

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

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

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

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

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

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

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

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

구현체가 동적으로 정해질 때, 팩토리 기법을 사용하나요?

0

47

2

MemberService의 인터페이스를 왜 사용하는지 궁금합니다.

0

72

1

롬복 @Setter를 써야 하는 상황이 있는건가요?

0

87

1

빈 등록 메서드의 파라미터가 빈이 아니어도 되나요?

0

79

1

테스트 속도가 나중에 영향이 있을까요?

0

75

1

gradle 설정 안떠서 질문 남깁니다!

0

116

2

build.gradle로 프로젝트를 여는 이유

0

81

1

provider 사용하는 이유

0

85

1

다음 강의 뭘 들어야 할까요

0

123

2

프로토타입 빈, 직접 destroy 호출 안 할 경우

0

62

1

beanB

0

79

2

퀴즈다시풀기

0

63

1

Gradle로 바꿔도 오류가 똑같이 발생하네요 ㅠㅠ

0

90

2

"중복 등록과 충돌" 강의에서 강사님과 다른 에러가 발생합니다.

0

63

3

run 실행했는데 결과창이 이렇게 뜨네요 왜 그런건가요>

0

102

2

도메인의 정의?

0

57

1

ApplicationContext 질문입니다.

0

60

1

@Scope의 proxyMode를 사용할때 단위 테스트 방법

0

86

2

ai api 선정하기 관련 질문

0

115

2

생성자 자동주입 관련해서

0

60

1

생성자 직접 호출 vs 팩토리 메서드 패턴

0

93

2

Spring에서 SessionScope와 RequestScope는 함께 사용되나요?

1

63

1

12:25

0

74

2

appConfig.xml 오류

0

125

1