작성
·
1.3K
0
답변 1
0
안녕하세요. jhc님, 공식 서포터즈 David입니다.
1. 프로토타입 사용 이유는 아래 글 답변을 참고해주세요.
https://www.inflearn.com/questions/415649
2. 두번째 질문은 어떤 것을 말씀하시는지 조금 더 자세하게 알려주실 수 있으실까요?
올려주신 코드를 기준으로 말씀드리자면, 상태를 가지고 그 상태를 변경하는 로직을 가진다면 동시성 문제가 발생할 수 밖에 없습니다.
감사합니다.
1. 네, 맞습니다.
2. 말씀하신 부분을 방지하기 위해 상태를 가지지 않거나 가지더라도 쓰레드세이프한 구조를 가지게 코드를 작성하여 빈으로 등록하는 것입니다. 즉, 빈이 Client A나 B의 정보(상태)를 갖지 않도록 설계하는 것입니다. 다만, 메서드 내에서 사용되는 지역변수의 경우 쓰레드 별로 저장공간이 분리되어 있으므로 해당되지 않습니다. 이 부분은 싱글톤 패턴, 동시성에 대해 학습하시면 해결되실 것 같습니다.
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로 불렀을 때 그 정보를 가지고 오는 것 처럼되지 않을까 생각되어서 질문 드립니다.
감사합니다!