Skip to content

Latest commit

 

History

History
29 lines (19 loc) · 2.1 KB

65.md

File metadata and controls

29 lines (19 loc) · 2.1 KB

65. Spring Web MVC에서 요청 마다 Thread가 생성되어 Controller를 통해 요청을 수행할텐데, 어떻게 1개의 Controller만 생성될 수 있을까요?

엘리

배경 지식

스프링 빈(Spring Bean)은 기본적으로 싱글톤 스코프로 생성됩니다. 따라서, 따로 스코프를 지정하지 않고 컨트롤러(Controller)를 빈으로 등록하면 단 1개의 컨트롤러가 생성됩니다.

Spring MVC와 함께 많이 사용하는 WAS인 Tomcat의 경우, 요청들에 대해 각각의 스레드(Thread)를 할당하여 작업을 수행하는 구조를 가집니다.

그렇다면 "단 1개의 Controller로 어떻게 수많은 Thread를 Thread-Safe하게 처리할 수 있을까요?"
비밀은 JVM의 메모리 구조에 숨어있습니다😸

Thread들은 어떻게 1개의 Controller를 공유할까?

JVM의 런타임 메모리 구조를 살펴보면, 컨트롤러 클래스에 대한 정보(필드, 메서드 등의 정보)는 메서드 영역에 로드되고, 싱글톤으로 생성된 1개의 컨트롤러 객체는 힙 영역에 생성됩니다. 스레드들 간에는 메서드 영역과 힙 영역을 공유하기 때문에 수많은 스레드들은 하나의 컨트롤러 객체를 이용할 수 있게 되는 것입니다.

상태 NO!!

주의해야할 것이, 스레드들은 공유하고 있는 컨트롤러의 필드와 메서드들을 사용할 뿐!! 사용 과정에서 락(Lock)을 걸지 않습니다. 따라서 스프링에서 컨트롤러를 생성할 때 (물론 다른 스프링 빈들도 마찬가지!!) 절대로 상태를 가지게 해서는 안됩니다. 상태를 가지지 않을 때만 Thread-Safe 함을 보장할 수 있습니다.

참고 자료