[Spring] 1개의 Controller가 어떻게 수많은 클라이언트의 요청을 처리하는가?
1. 멀티스레드에 대해 알고있는가? ( 왜 멀티스레드에서 스레드마다 '스택'만 따로 할당받는지, 공유되는 영역(힙,코드, 데이터)은 어디인지 )
2. 스프링의 싱글톤에 대해 알고있는가? ( Bean에 대해 알고있는지, Bean의 Default 스코프에 대해 알고있는지 )
3. JVM의 메모리 영역에 대해 알고있는가? ( Method Area, Heap, Stack, PCRegister, Native Method Stack)
- JVM의 Method Area : static키워드 , 클래스에 대한 메타데이터 정보
위와 같은 내용을 알고 있다면 글을 이해하는데 더 도움이 될것이라고 생각한다.
우리가 보통 스레드간 공유를 생각하면 가장먼저 동기화를 떠올린다. 운영체제에서 주구장창 배운것이 동기화,, lock 이기 때문이다.
그러나 이러한 스레드간의 동기화를 해줘야하는 이유가 뭘까?
동기화를 해주는 이유는 프로세스(스레드)들간 알고있는 정보(상태)를 일치하기 위해서이다!!
그러나 Controller는 상태가 없다.
내부적으로 상태를 갖지 않기때문에 스레드간의 동기화가 필요하지 않고, 스레드는 Controller의 메소드를 공유하고 제각각 호출할 수 있기 때문에 요청이 1개든 10만개이든 전혀 문제가 없는것이다.
스레드는 왜 Controller의 메소드를 어떻게 공유하는데??
-> Controller 객체를 생성하면 객체는 힙에 생성되지만 해당 클래스의 정보(메소드라면 메소드 처리 로직(명령들))는 메소드영역에 생성된다
- 결론적으로 싱글톤으로 관리되는 빈의 경우 상태 정보를 갖지 않기 때문에 요청의 수와 상관없이 싱글턴 객체의 장점을 이용할 수 있었던 것이다.
- 만약 빈이 상태정보를 갖게된다면 스레드들간의 동기화가 필요하고 오버헤드가 발생, 객체를 하나만 만들고 컨테이너에서 단순히 꺼내쓸수 있었던 장점을 잃게 된다.
출처: https://jeong-pro.tistory.com/204 [기본기를 쌓는 정아마추어 코딩블로그]