Spring Web MVC에서 요청 마다 Thread가 생성되어 Controller를 통해 요청을 수행할텐데, 어떻게 1개의 Controller만 생성 될 수 있을까요?
생성한 Controller 클래스에 대한 정보가 JVM 메모리 영역 중 Method Area(메서드 영역)에 올라가기 때문입니다.
Controller 객체는 Heap(힙)에 생성 되지만, 해당 클래스의 정보(메소드 처리 로직, 명령들)는 Method Area(메서드 영역)에 생성 됩니다.
따라서 결국 모든 Thread가 객체의 메서드를 공유할 수 있기 때문에 Controller는 1개만 생성됩니다.
그렇게 되면 의문이 생길 수 있다. 애초에 요청별로 Thread가 따로 생성된다고 했는데 그렇다면 이에 따라서 ServletContext를 가진다는 것이다.
어떻게 Controller가 1개만 생성되는 것이고 어떻게 처리를 한다는 것일까? 🤔
이 Thread들은 실상 싱글톤으로 생성된 Bean들을 참고하여 일을 한다.
-> 즉 이 Bean들은 기본적으로 Singleton으로 생성 및 관리된다.
공유되는 정보를 이용하고자 Controller 객체를 사용하는 Thread나 Controller 객체 자체를 동기화를 굳이할 필요가 없다.
결론은 Thread는 Controller 객체의 메소드를 공유하고, 제각각 호출하기만 하면 되기 때문에 굳이 동기화가 필요가 없다.
그렇기 때문에 1개의 Controller를 이용해서 요청 마다 Thread가 생성되어 해당 요청들을 수행할 수 있었다.
💡 이럴 수 있었던 이유들은 ¹싱글톤으로 Bean들이 관리되었고, ² Bean이 상태정보를 가지지 않았기 때문에 Thread들 간에 동기화가 필요없었던 것이였다.
그렇다면 Thread간의 동기화를 통해 상태정보 업데이트가 필요했을 것이다. 그리고 이로인해 오버헤드가 발생했을 것이다.
=> 결론적으로 Controller 객체 1개만을 이용해 컨테이너에서 단순히 꺼내쓰던 장점이 사라졌을 것이다.