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

김윤식님의 프로필 이미지
김윤식

작성한 질문수

스프링 핵심 원리 - 기본편

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

헷갈리는게 있어 질문드리려고 합니다

해결된 질문

작성

·

207

0

안녕하세요

좋은 강의 제공해주시는 김영한 선생님과 항상 답변해주시는 서포터즈분들께 진심으로 감사드립니다.

행복한 연말 되시길 바라며, 질문 시작하겠습니다.

 

과거 test/singleton/StatefulService.java

파일을 설명해주시면서

스프링 빈은 항상 무상태로 설계해야한다.

공유필드를 사용하는 것은 좋지 않다.

스레드 공유로 인해 두 유저가 동시에 서비스를 이용할 경우 한 유저의 사용중이던 데이터가 다른 유저의 활동에 영향을 미칠 수 있다라고 말씀해주신것으로 기억합니다!

 

Singleton Bean과 프로토타입 스코프를 동시에 사용하는 경우 발생하는 문제가 위의 Stateless로 설계해야 했던 Singleton Bean에서의 주의사항과도 연관이 있다고 생각해도 될지 질문드리고자합니다

 

현재 문제의 코드 설계(Singleton과 Prototype scope를 동시에 사용함으로 발생하는 문제)는 Stateful한 특성을 갖고 있다고 생각하는데 제 생각이 맞는지도 여쭤보고 싶습니다!

 

그리고 싱글톤에서의 공유 필드가 문제가 발생했다면

여기서는 공유 클래스(같이 생긴 것으로...)로 인해 문제가 발생한다고 이해해도 될까요?

 

내일이 크리스마스네요

항상 감사드리며, 행복한 크리스마스 되시길 기원합니다!

남은 연말도 따뜻하고 행복하시길 바랍니다!

감사합니다

답변 1

1

안녕하세요, 김윤식 님. 공식 서포터즈 codesweaver 입니다.
.
싱글톤 객체에 멤버 변수를 사용하면서 생기는 문제는 동시성 문제라고 할 수 있습니다.

.

싱글톤 객체가 프로토타입 스코프 객체를 들고 있어 생기는 문제는 싱글톤 객체의 특성 떄문에 발생하는 문제 입니다.

싱글톤 객체가 생성될 때 필드에 있는 멤버들의 초기화를 진행합니다(0또는 null에 준하는 값). 그리고 DI를 위해 프로토타입 스코프 객체를 스프링 컨테이너에서 찾게 되는데 이 때 프로토타입 스코프 객체는 기존 객체를 재활용하는것이 아니라 새로운 객체를 생성하여 반환합니다.

 

문제는 싱글톤 객체의 경우 한번 생성된 이후엔 애플리케이션이 종료될때까지 보통 그 값이 계속 유지됩니다. 즉 다시 초기화 할 일이 생기지 않습니다. 그래서 프로토타입 스코프 객체에게 새로운 객체를 요청하지 않고 기존의 들고 있던 값을 재활용하게 됩니다. 이것은 프로토타입 스코프 객체를 사용하는 의미가 훼손됩니다.

 

이 두가지 문제는 미묘하게 다른 문제이긴 한데 제가 정확히 설명을 드렸나 모르겠습니다.

행복한 크리스마스 되십시요.
.
감사합니다.

김윤식님의 프로필 이미지
김윤식
질문자

그 미묘하게 다른 부분이 어떤 점인지 궁금해서요....!

단순히 멀티스레드는 동시성 문제로 인해 발생하는 문제고 싱글톤 객체, 스코프 객체의 혼용은 싱글톤 객체 구동 과정상 문제로 인해 발생하는 문제로 이해하고 넘어가면 될까요! 감사합니다!

안녕하세요 김윤식 님!

네, 맞습니다.

김윤식님의 프로필 이미지
김윤식
질문자

크리스마스 중에도 답변 주셔서 감사합니다 :)

잘 이해되었습니다. 날씨가 정말 춥네요 감기 조심하세요~

김윤식님의 프로필 이미지
김윤식

작성한 질문수

질문하기