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()를 통해 반드시 제거해야한다.
'Spring' 카테고리의 다른 글
[Spring] 프록시 패턴, 데코레이션 패턴 (0) | 2022.08.29 |
---|---|
[SpringBoot] 컴포넌트스캔 (0) | 2022.08.29 |
[Spring] Spring MVC 프로젝트 XML로 초기 세팅하기 (1) | 2022.01.02 |
[Spring] Missing artifact javax.servlet.jsp.jstl:jstl:jar:1.2 오류 (0) | 2022.01.02 |
@PostConstruct, @PreDestroy (0) | 2021.10.29 |