Spring

[Spring] 스프링 빈은 무조건 Thread-safe 할까?

찐팡민 2021. 12. 23. 01:04

스프링 빈은 Thread-safe 할까?

Spring Bean의 기본 Scope는 싱글톤입니다.

그러면 싱글톤 객체(Bean)를 멀티 쓰레드 환경(Spring)에서 다루게 되면 해당 객체는 Thread-safe 한 상태 일까요?

즉, Spring은 싱글톤 객체(Bean)에 대해서 Thread-safe를 보장합니까?

 

결과적으로, Spring은 Bean에 대해서 Thread-safe를 보장하지 않습니다.

즉, 개발자가 스프링 빈을 Thread-safe하게 개발해야 합니다.


기본적으로 쓰레드는 각각 Stack 영역을 소유하며, 공유하는 Heap 영역이 있습니다. 

각 쓰레드에서 싱글톤 객체(Bean)에 접근할 때, 싱글톤 객체는 자신의 Heap 영역(전역 변수)에는 불변 변수를,

Stack 영역(지역 변수)에는 가변 변수를 사용하면 Thread-safe 하게 빈이 구성되어 사용된다고 볼 수 있습니다.

무의식적으로 사용하고 있지만, 생각해보면 Bean을 구성할 때, 전역변수에는 주로 스프링 빈(@Controller, @Service, @Repository, @Component 어노테이션이 달린 객체 등)과 같은 불변 객체들이 있지 VO, DTO, Map 같은 가변 객체를 선언하지 않습니다. 만약 있다면 synchronized 키워드나 concurrent 패키지의 클래스들을 사용하여 동시성 문제를 해결했을 것입니다. 


참고 자료

 

스프링 빈은 Thread-safe 할까?

초기에 스프링을 공부할 때 스프링 빈의 기본 Scope는 싱글톤이고, 스프링 환경은 멀티 쓰레드이라는 것을 알았습니다. 그런데 '왜 하나의 공유자원(싱글톤 객체)을 여러 쓰레드에서 다루는데 

alwayspr.tistory.com