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

hi님의 프로필 이미지
hi

작성한 질문수

스프링 핵심 원리 - 기본편

프로토타입 스코프 - 싱글톤 빈과 함께 사용시 문제점

@Autowired ApplicationContext DI 관련해서 질문드립니다.

작성

·

596

2

[질문 내용]

@Test
void singletonClientUsePrototype(){
    AnnotationConfigApplicationContext ac =
            new AnnotationConfigApplicationContext(PrototypeBean.class, ClientBean.class);

위 코드에서 스프링 컨테이너 1개 생성했고 ClientBean과 PrototypeBean을 빈으로 등록한 것으로 이해했습니다.

 

@Scope("singleton")
    static class ClientBean{

        private ApplicationContext applicationContext;

        public ClientBean(ApplicationContext applicationContext) {
            this.applicationContext = applicationContext;
            System.out.println("applicationContext = " + applicationContext);
        }

public int logic(){
            PrototypeBean prototypeBean = applicationContext.getBean(PrototypeBean.class);
        }

이 때 ClientBean 안에서 ApplicationContext를 선언해서 getBean하면 스프링 컨테이너가 한 개 더 생성되서 2개가 운용되는 게 아닌가하는 의문이 들었습니다.

 

  1. 첫번째 질문은 위에서 말했던 것과 같이 스프링 컨테이너가 2개가 생성되고 관리할 수 있는 것인지 질문 드립니다.

     

  2. 그러다 이전 질문 글을 봤는데요,

    [이전 질문] @Autowired ApplicationContext 확인좀 해주세요

    (https://www.inflearn.com/course/lecture?courseSlug=%EC%8A%A4%ED%94%84%EB%A7%81-%ED%95%B5%EC%8B%AC-%EC%9B%90%EB%A6%AC-%EA%B8%B0%EB%B3%B8%ED%8E%B8&unitId=55490&category=questionDetail&tab=community&q=735170)

     

    @Autowired가 작동하면서

    new AnnotaitonConfigAplicationContxt(ClientBean, PrototypeBean.class)가

    ApplicationcContext applicationContext;로 DI된다는 것에 맞다는 답변을 주셨습니다.

     

    그러면 스프링 컨테이너가 2개 생성되는 것이 아니라 SingletonClientUsePrototype() 메서드에서 ClientBean, PrototypeBean을 파라미터로 만든 컨테이너를 ClientBean의 생성자 파라미터로 주입받아서 결국엔 스프링 컨테이너 1개만 사용한다는 것인가요?

     

    그러면 ClientBean과 PrototypeBean 총 2개의 빈을 가지고 있는 스프링 컨테이너를 가져와 그 중 PrototypeBean만 가져와서 logic() 메서드에 사용한다는 것으로 이해하면 될까요?

질문 읽어주셔서 감사합니다.

 

 

 

 

 

답변 2

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. hi님

Q1: 컨테이너 숫자

new AnnotationConfigApplicationContext -> 이 부분이 바로 스프링 컨테이너를 생성하는 부분입니다.

ClientBean의 생성자에는 이미 생성된 스프링 컨테이너를 주입해줍니다. 따라서 스프링 컨테이너를 하나만 생성되었습니다.

Q2: 그러면 ClientBean과 PrototypeBean 총 2개의 빈을 가지고 있는 스프링 컨테이너를 가져와 그 중 PrototypeBean만 가져와서 logic() 메서드에 사용한다는 것으로 이해하면 될까요?

네 맞습니다.

감사합니다.

hi님의 프로필 이미지
hi
질문자

답변 감사합니다!!!

0

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

답변드리겠습니다. 해당 코드에서 ApplicationContext는 이미 스프링 컨테이너 안에서 빈으로 등록되어 있기 때문에, 빈으로 등록된 ClientBean 안에서 applicationContext를 @Autowired로 주입받는 것은 스프링 컨테이너 안에 있는 빈을 주입받는 것입니다. 실제로 스프링 컨테이너는 1개가 생성되고, 관리되며, 이 스프링 컨테이너에 ClientBean과 PrototypeBean이 빈으로 등록되어 관리됩니다.

따라서 위 코드에서 ApplicationContext를 선언해 getBean을 하는 방식은 스프링의 의존성 주입(DI) 방식을 따르고 있으며, 스프링 컨테이너 내에서 이미 등록된 빈을 사용하는 방식입니다. 즉, 스프링 컨테이너를 두 개 생성하는 것이 아니라, 스프링 컨테이너 내에서 등록된 빈을 이용하는 것입니다.

마지막으로, 당사자의 코드가 아닌 다른 분의 코드를 참고하신 것 같은데, 해당 부분의 코드를 자세히 보시고 있는 것이 좋을 것 같습니다. 이상이 없으시다면, 그대로 코드를 작성해도 문제 없을 것입니다.

추가적인 도움이 필요하시다면 언제든지 문의해주세요. 감사합니다.

hi님의 프로필 이미지
hi

작성한 질문수

질문하기