본문 바로가기

Spring

[Spring] @Bean, 싱글톤, ThreadLocal

Spring은 Bean객체를 싱글톤으로 관리한다.

(ApplicationContext)

 

더보기

싱글톤이란?

 : 객체의 인스턴스가 오직 1개만 생성되는 패턴

 > 서버가 클라이언트의 요청을 받을 때마다 클래스의 인스턴스를 생성하게 되면 JVM메모리의 부하를 감당못할 수 있다.

 

문제) 동시성 중복 문제?

: 같은 인스턴스의 필드를 여러 쓰레드가 동시에 같은 인스턴스의 필드 값을 변경하면서 발생하는 문제.

 > 스프링이 빈을 싱글톤으로 관리하기 때문에 발생할 수 있는 일.

 

조건

1. 멀티 쓰레드 환경이다.

2. 다순 '조회'가 아닌 '수정'을 하는 작업을 한다.

 

더보기

Thread란?

 : 프로세스 내에서 실제로 작업을 수행하는 주체

 

더보기

Multi Thread란?

 : 일반적으로 하나의 프로세스는 하나의 스레드를 가지고 작업을 수행하게 된다.

멀티 스레드는 하나의 프로세스 내에서 둘 이상의 스레드가 동시에 작업을 수행하는 것을 의미한다.

  • 전역 변수의 공간 or 힙 영역을 이요하여 데이터를 주고받을 수 있다. (스택 영역만 비공유)

 

해결

: ThreadLocal

> 각 쓰레드마다 별도의 내부 저장소를 제공한다. 따라서 같은 인스턴스의 쓰레드 로컬 필드에 접근해도 문제가 없다.

 

ex)

1. thread-A >  set("userA")  >  쓰레드 로컬  >  thread-A 전용 보관소 (userA)

2. thread-B >  set("userB")  >  쓰레드 로컬  >  thread-B 전용 보관소 (userB)

 

각 사용자의 요청이 끝났을 떄 쓰레드 로컬의 값을 ThreadLocal.remove()를 통해 반드시 제거해야한다.