인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

jhc님의 프로필 이미지
jhc

작성한 질문수

스프링 핵심 원리 - 기본편

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

프로토타입 빈을 쓰는 이유

작성

·

1.3K

0

안녕하세요!
 
성장하고 싶은데 혼자 성장하기가 너무 힘드네요.
강의가 있어서 다행입니다. 차근 차근 공부해 볼 생각입니다!
 
부끄러운 질문이지만 잘 이해가 가지 않아서 질문 드립니다.
 
프로토타입 빈을 보면 그냥 new 클래스 해서 객체를 생성해서
쓰는 것과 같아 보이는데 이렇게 빈을 사용하는 이유는
DIP, OCP 때문인가요?
 
그리고 모든 객체를 빈을 생성하면 동시성 문제는 발생하지 않나요?
예를 들면
1. setMember(AAA);
2. getMember(); --> AAA
3. setMemer(BBB);
4. setMember(AAA);
5. getMember(); --> AAA ( BBB 는 없어진다. )
 
이럴 경우 한 인스턴스에서 같은 빈이라서 객체가 다 꼬일 것 같은데
멀티 쓰레드를 사용한다고 해도 한 인스턴스인데 어떻게 다르게 나오는지 궁금합니다.
 
실무에서 사용하고 있는데 정확한 원리를 몰라서 질문 드립니다.
너무 무식한 질문이라 부끄럽네요ㅠ

답변 1

0

안녕하세요. jhc님, 공식 서포터즈 David입니다.

1. 프로토타입 사용 이유는 아래 글 답변을 참고해주세요.

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

2. 두번째 질문은 어떤 것을 말씀하시는지 조금 더 자세하게 알려주실 수 있으실까요?

올려주신 코드를 기준으로 말씀드리자면, 상태를 가지고 그 상태를 변경하는 로직을 가진다면 동시성 문제가 발생할 수 밖에 없습니다.

 

감사합니다.

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

1. 프로토타입 사용 이유

결국은 스프링이 가진 여러가지 장점을 이용하기 위해서 라고 생각하면 될까요? 

스프링을 사용하는 이유가 의존관계를 형성해서 OCP, DIP를 쉽게 할 수 있기 때문으로 설명해 주신거 같은데 new 클래스() 로 하는 것보다 프로토타입으로 빈을 생성해서 만든다면 스프링에서 재공하는@Autowired같은 것들의 지원을 받을 수 있기 때문인건가요?

 

2. 두번째 질문은 너무 두서없어서 죄송합니다.

이부분은 구체적으로는 빈에 대한 질문인데요.

Client - Controller - Service  - DB의 구조를 가진 어플리케이션이 있다고 가정하고 스프링을 실행시켜 Controller와 Service를 빈으로 등록된 후의 상황입니다.

Client A가 디비에서 회원 정보를 조회한 이후 Client B가 디비에서 회원 정보를 조회 했습니다.

그러면 Client A는 딱 하나만 생성된 Controller와 Service를 통해 디비 정보를 받아 왔어요.

마찬가지로 Client B도 딱 하나만 생성된 Controller와 Service를 통해 디비 정보를 받아 왔어요.

그런데 이 순서를 보장하지 못하는 경우가 있을 때 데이터 정합성이 깨질수 있지 않는지가 궁금합니다.

왜냐하면 빈은 딱 하나만 생성되서 인스턴스가 하나이므로 동일한 객체를 사용하는 거잖아요?

Case A

Clinet A - Controller - Service - DB - Service - 지연 - 이 사이에 Client B의 서비스가 실행완료( Client B - Controller - Serivce - DB - Service - Controller - Client B 도착) - Client A 도착

Case A에서 Client A가 정보를 받아 오도록 보냈지만 지연이 생겼고 그 사이에 Client B가 DB에서 정보를 다 받아 오고 나면 그 빈에는 Client B의 정보가 남아 있으므로 Client A가 받는 정보는 Client B의 정보가 담겨 있을 수 있지 않을까 하는 생각에서 한 질문입니다.

마치 Setter로 데이터를 넣어 두면 다른 곳에서 Getter로 불렀을 때 그 정보를 가지고 오는 것 처럼되지 않을까 생각되어서 질문 드립니다.

감사합니다!

1. 네, 맞습니다.

2. 말씀하신 부분을 방지하기 위해 상태를 가지지 않거나 가지더라도 쓰레드세이프한 구조를 가지게 코드를 작성하여 빈으로 등록하는 것입니다. 즉, 빈이 Client A나 B의 정보(상태)를 갖지 않도록 설계하는 것입니다. 다만, 메서드 내에서 사용되는 지역변수의 경우 쓰레드 별로 저장공간이 분리되어 있으므로 해당되지 않습니다. 이 부분은 싱글톤 패턴, 동시성에 대해 학습하시면 해결되실 것 같습니다.

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

와 늦은 시간까지 답변 주시고 너무 감사합니다.

더 공부는 해야겠지만 의문이 풀렸습니다.

다시 한번 감사드립니다.

jhc님의 프로필 이미지
jhc

작성한 질문수

질문하기