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

신나는 라이언님의 프로필 이미지
신나는 라이언

작성한 질문수

스프링 핵심 원리 - 기본편

싱글톤 방식의 주의점

@configuration과 싱글톤 질문입니다

작성

·

258

·

수정됨

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
https://www.inflearn.com/questions/475367 
답변해주신 내용에서 "TestConfig 자체는 싱글톤 스코프 빈으로 컨테이너에 등록됩니다."
이 부분이 이해가 가지 않습니다. 
스프링 빈으로 등록되기는 하지만 결국 @Configuration 이 없으면 단순히 빈으로 등록하는거뿐 아닌가요? 
클래스 내부 @Bean 들과 다르게 TestConfig만 싱글톤으로 빈 등록이 되는건가요?
CGLIB없이 어떻게 싱글톤인지 모르겠습니다..

답변 2

0

안녕하세요. 신나는 라이언님, 공식 서포터즈 David입니다.

빈 자체가 별도로 스코프를 지정하지 않으면 기본 값인 싱글톤 스코프가 적용됩니다. 따라서 싱글톤 빈으로 등록됩니다.

감사합니다.

기본값이 싱글톤 스코프라면 @Configuration이 없을 때 클래스 내의 @Bean 들은 왜 싱글톤 적용이 아닌건가요?

@Configuration을 붙이지 않고 클래스 내에 @Bean을 사용하면 싱글톤이 '보장'되지 않습니다.

그 이유는 아래 답변을 참고해 주세요.

https://www.inflearn.com/questions/323589

 

혹시 @Configuration, @Bean, 빈, 빈의 스코프, 컨테이너에 대해 헷갈리시는 게 있다면 본 강의 섹션 4, 5, 9를 한 번 더 참고해 주세요.

@Configuration을 붙이지 않으면 TestConfig 자체와 @Bean 메서드들의 반환 객체를 싱글톤 빈으로 등록하지만 의존 관계에서의 객체 호출은 일반 객체를 생성한다.


@Bean의 일부가 return new Component2(component1()) 라면 Component2는 싱글톤 빈으로 등록되지만 의존 관계에서의 호출인 componenet1은 빈으로 등록이 안되고 일반객체가 생성된다.

https://www.inflearn.com/questions/475367
여기 답변에서 David님께서 "TestConfig 내 객체 생성 메서드의 경우 호출시 싱글톤을 보장하지 않고 매번 새로운 객체를 생성합니다." 라고 하셨는데 정확히는 "TestConfig 내 객체 생성 메서드의 경우 "의존 관계 주입된 객체" 호출시 싱글톤을 보장하지 않고 매번 새로운 객체를 생성합니다" 가 정확하다.

정리한 위 내용이 맞을까요?

"의존 관계 주입된 객체" 호출시

이 부분에 대해서 조금 더 자세히 설명해 주실 수 있나요?

return new Component2(component1) 이 실행될 때 component1 호출 시를 말합니다.

+애초에 본인 호출이 아닌이상 모두 의존 관계군요. 제가 헷갈렸습니다. 죄송합니다.

0

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

신나는 라이언님의 질문은 @Configuration 애노테이션의 역할과 싱글톤 빈 등록 과정에 대한 궁금증으로 이해했습니다. 스프링에서 @Configuration 애노테이션이 붙은 클래스는 특별한 역할을 하는데, 이는 스프링 컨테이너가 해당 클래스를 설정 정보로 사용하여 빈(Bean) 정의를 생성하고 관리하는 데 필요한 메타데이터를 제공한다는 점입니다.

클래스에 @Configuration 애노테이션이 붙어 있지 않다면, 그 클래스의 메서드에 붙은 @Bean 애노테이션을 통해 빈으로 등록한 객체들은 싱글톤으로 관리되지 않을 수 있습니다. 이는 스프링이 @Bean 애노테이션이 붙은 메서드를 호출할 때마다 새로운 인스턴스를 생성하기 때문입니다. 하지만 @Configuration이 붙은 설정 클래스는 스프링이 CGLIB를 이용해 클래스의 프록시(Proxy) 객체를 생성하고, 이 프록시는 빈 생성과 관리를 담당하여 싱글톤 패턴을 보장합니다.

그러나 질문에서 언급된 “TestConfig 자체는 싱글톤 스코프 빈으로 컨테이너에 등록됩니다.“에 대한 부분은 @Configuration 없이도 스프링 빈으로 등록되는 구체적인 메커니즘 또는 예외 상황에 대한 더 깊은 설명이 필요해 보입니다. @Configuration 없이도 컴포넌트 스캔을 통해 빈으로 등록되지만, 각 @Bean 메서드 호출 시 싱글톤이 보장되지는 않는다는 주된 차이점에 주목해야 합니다.

관련해서 다음 링크에서 유사한 궁금증에 대한 설명을 찾을 수 있습니다:

이는 @Configuration 애노테이션과 스프링 컨테이너에서 빈의 등록 및 관리 방식에 대한 궁금증을 해결하는 데 도움을 줄 수 있습니다.

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

신나는 라이언님의 프로필 이미지
신나는 라이언

작성한 질문수

질문하기