[cs - spring] 1개의 Controller가 어떻게 Thread들의 요청을 수행하는건가?

링딩·2023년 5월 2일
0

Computer Science

목록 보기
44/49

Q.

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


이 글을 참고하여 작성하였습니다.

A.

생성한 Controller 클래스에 대한 정보가 JVM 메모리 영역 중 Method Area(메서드 영역)에 올라가기 때문입니다.

Controller 객체는 Heap(힙)에 생성 되지만, 해당 클래스의 정보(메소드 처리 로직, 명령들)는 Method Area(메서드 영역)에 생성 됩니다.

따라서 결국 모든 Thread가 객체의 메서드를 공유할 수 있기 때문에 Controller는 1개만 생성됩니다.


그렇다면 Controller 1개로 여러가지의 요청을 어떻게 다 처리한다는건가?

그렇게 되면 의문이 생길 수 있다. 애초에 요청별로 Thread가 따로 생성된다고 했는데 그렇다면 이에 따라서 ServletContext를 가진다는 것이다.
어떻게 Controller가 1개만 생성되는 것이고 어떻게 처리를 한다는 것일까? 🤔


1. 싱글톤

이 Thread들은 실상 싱글톤으로 생성된 Bean들을 참고하여 일을 한다.
-> 즉 이 Bean들은 기본적으로 Singleton으로 생성 및 관리된다.

  • 이 Thread들은 1개의 Singleton Controller 객체를 공유한다.
    => 최종적으로 공유를 통해 1개의 Controller만 사용하는 것이다.
  • 곧 이 하나의 Singleton Controller가 힘겹게 들어오는 수많은 요청들을 처리하는 것이 아닌, 각각의 Thread가 singleton으로 생성된 1개의 Controller를 참고하여 실행한다고 보면 되는 것

2. Controller가 저장되는 곳

  • Controller 객체는 Heap에 생성된다.
    -> 그러나 해당 class에 대한 정보는 Heap이 아닌 Method Area(메서드 영역)에 저장된다.
  • 메소드 영역으로 모든 Thread가 접근이 가능하다.
    -> 이로인해 객체의 Binary Code정보를 공유할 수 있다.
    => Controller를 Thread들이 참고할 수 있다


3. 동기화를 하지 않아도 된다.

공유되는 정보를 이용하고자 Controller 객체를 사용하는 Thread나 Controller 객체 자체를 동기화를 굳이할 필요가 없다.

  • 원래 동기화를 해주는 이유는 프로세스(Thread)들간 알고있는 정보(상태)를 일치하기 위해서인데, Controller가 내부적으로 상태를 갖는 것이 없으니, 그냥 메소드 호출만 하면 된다.
    → 공유하는 데이터
    => 즉, 클래스변수, 전역변수를 컨트롤러에서 사용하지 않기 때문에 상태를 갖는 것이 ❌
    => 굳이 동기화가 필요 없네? A. 처리 로직만 공유되어 사용한다.

결론은 Thread는 Controller 객체의 메소드를 공유하고, 제각각 호출하기만 하면 되기 때문에 굳이 동기화가 필요가 없다.


결론

그렇기 때문에 1개의 Controller를 이용해서 요청 마다 Thread가 생성되어 해당 요청들을 수행할 수 있었다.

💡 이럴 수 있었던 이유들은 ¹싱글톤으로 Bean들이 관리되었고, ² Bean이 상태정보를 가지지 않았기 때문에 Thread들 간에 동기화가 필요없었던 것이였다.

만약 Bean이 상태정보를 가졌다면?

그렇다면 Thread간의 동기화를 통해 상태정보 업데이트가 필요했을 것이다. 그리고 이로인해 오버헤드가 발생했을 것이다.
=> 결론적으로 Controller 객체 1개만을 이용해 컨테이너에서 단순히 꺼내쓰던 장점이 사라졌을 것이다.




profile
초짜 백엔드 개린이

0개의 댓글