이 글의 참고는 https://beyondj2ee.wordpress.com/ [BeyondJ2EE] 분의 블로그입니다.
스프링 빈이 싱글톤을 가지고 있고, ApplicationContext라는 스프링 컨테이너가 static Sharing Pool을 생성한다는 것은 알고 있으나, Thread에 Safe 한지는 모르는 와중, 궁금증이 생겨 서문에 기제한 개발자 분의 글에서 도움을 얻었습니다.
즉 멀티 쓰레드 환경에서 등록된 Bean들은 공유하게 되고. 여기까지는 ...아는데.
문제는 다음입니다. Component 들은 ComponentScan 에 의해 springBean으로 등록되는데, @Component들의 멤버변수들은 Sharing 되는가? 가 궁금증이었습니다.
예제를 타이핑하면서 @Autowired된 빈 객체들만 사용해보았지, 멤버변수는 사용해보지 않았기 때문입니다.
이후로는 시간나면 계속 읽어보기 위해 글을 담았습니다.
@Service
public class MemberController{
@Autowired
private UserRepository userRepository;
private Member member = new Member();
public void createUser(String id, String name) throws Exception {
member.setID(id);
member.setName(name);
userRepository.insertUser(member);
}
}
Bean 객체의 자동 주입말고 Member 라는 인스턴스 멤버가 선언되어 있는데, Bean객체 생성시 초기화 및 의존 주입을 할 것이고, 그다음부터 해당 멤버들은 createUser 라는 메서드에서 계속 재사용이 될텐데, createUser 메서는 Thread -Safe 하나 Member라는 인스턴스 멤버는 Thread - Safe 한가? 라는 것이 핵심 문제라고 해주셨습니다.
그리고 리펙토링을 기재해주셨는데,(감사합니다)
메소드 안에 로컬변수로 선언하신 것이 보입니다. 메모리에 부담이 가는 것이 아니라 자연스럽게 GC(가비지컬렉터)의 대상이 된다고 합니다.
@Service
public class MemberController{
@Autowired
private UserRepository userRepository;
public void createUser(String id, String name) throws Exception {
Member member = new Member();
member.setID(id);
member.setName(name);
userRepository.insertUser(member);
}
}
자세한 내용은 해당 기재 글에서 계속 읽어볼 예정이며, 문제가 있을시, 언제든 지우도록 하겠습니다.
'springframework' 카테고리의 다른 글
paging 기법. (0) | 2020.07.29 |
---|---|
@ComponentScan 의 사용. 필터링 추가, 및 제외. (0) | 2020.07.27 |
Servlet과 Thread-safe (0) | 2020.07.16 |
.do 확장자의 사용..? (0) | 2020.07.16 |
Test 과정 (0) | 2020.07.14 |