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

알고리즘가즈앙님의 프로필 이미지

작성한 질문수

스프링 핵심 원리 - 기본편

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

count1과 count2가 값이 다른이유

작성

·

39

0

@Test
void singletonClientUsePrototype(){
    AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(PrototypeBean.class,ClientBean.class);
    ClientBean clientBean1 = ac.getBean(ClientBean.class);
    int count1 = clientBean1.logic();
    assertThat(count1).isEqualTo(1);

    ClientBean clientBean2 = ac.getBean(ClientBean.class);
    int count2 = clientBean2.logic();
    assertThat(count2).isEqualTo(2);

    assertThat(clientBean1).isEqualTo(clientBean2);
    System.out.println("clientBean1 = " + clientBean1);
    System.out.println("clientBean2 = " + clientBean2);
    System.out.println("count1 = " + count1);
    System.out.println("count2 = " + count2);
}

clienBean1=clientBean2는 싱글톤으로 같은걸 알았는데

왜 count1과 count2는 값이 다른건가요?? count1에서 count2는 공유가되서 2가 되었는데 count2에서 count1은 공유가 안된건가요?

답변 2

0

안녕하세요. 알고리즘가즈앙님, 공식 서포터즈 코즈위버입니다.

질문하신 내용이 아래의 코드에서 왜 카운트 값이 다른가에 대한 질문인것으로 보입니다.

System.out.println("count1 = " + count1);
System.out.println("count2 = " + count2);

 

ClientBean 내부의 카운트 값은 clientBean2.logic()이 호출되었을때 2로 변경되었을 것입니다. 그러나 count1 값은 두번째 로직이 실행되기 이전에 미리 값을 받아 저장해두었으므로, count1과 count2를 서로 다른 값을 저장하고 있습니다.

 

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다. 알고리즘가즈앙님.

프로그래밍에서 싱글톤 빈과 프로토타입 빈의 사용에 따른 데이터 공유 문제에 대해 궁금한 점이 있으시네요. 이에 대한 유사한 질문과 답변이 이미 있어 링크를 공유드리겠습니다.

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

해당 글에서, 강사님은 프로토타입 빈이 싱글톤 빈에 주입될 때 발생하는 문제점을 자세히 설명하고 있습니다. ClientBean이 싱글톤으로 설정되어 있기 때문에, ClientBean 인스턴스는 하나만 생성되고, 이 인스턴스 안에 프로토타입 빈이 저장됩니다. 그러나 프로토타입 빈 자체는 요청할 때마다 새로 생성되기 때문에, clientBean1clientBean2 모두 같은 싱글톤 인스턴스를 공유하지만 PrototypeBean의 상태는 각각 달라질 수 있습니다.

예를 들어:
1. ClientBean clientBean1 = ac.getBean(ClientBean.class);에서 logic() 메서드를 호출할 때, PrototypeBean 인스턴스가 생성됩니다. 여기서 count1 값은 1이 됩니다.
2. 이후 ClientBean clientBean2 = ac.getBean(ClientBean.class);에서 logic() 메서드를 호출할 때도 동일한 ClientBean 인스턴스지만, PrototypeBeancount가 증가합니다. 이 count 값은 프로토타입 빈의 내부 상태이기 때문에 새로 요청한 PrototypeBean 인스턴스의 결과로 2가 됩니다.

이로 인해, count1은 1, count2는 2가 됩니다. 이는 싱글톤이지만 내부의 프로토타입 빈의 상태가 호출 될 때마다 다르게 갱신되기 때문입니다.

보다 구체적인 예는 다음 글에서도 확인하실 수 있습니다:
- 9 - 프로토 타입 스코프를 싱글톤 빈과 함께 사용시 문제점 강의중 질문
- 싱글톤과 프로토타입 빈 사용 시 질문입니다.

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