springframework

Multi-Thread 환경에서의 Spring Bean , ApplicationContext

Jungsoomin :) 2020. 7. 16. 12:39

이 글의 참고는 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