이때 서블릿은 싱글톤으로 생성되어 관리되기 때문에 공유 변수를 사용하게 되면 유저 정보가 노출되는 등 문제가 발생할 수 있기 때문에 주의해야 한다.
자바 코드로는 이렇게 나타낼 수 있다.
물론 이렇게 그대로 쓰진 않고 이미 스프링에서 사용하기 편리하도록 구현이 다 되어 있다. 하지만 나름 위 코드도 개발자들이 더 쉽게 HTTP 스펙을 사용할 수 있도록 고민한 결과이다.
서블릿 사용시 싱글톤으로 관리된다고 했는데, 그럼 한 요청이 해당 서블릿을 사용중이면 다른 요청은 기다려야 할까? 당연히 아니다. 동시 요청을 처리하기 위해 멀티 쓰레드로 처리한다. 그래서 공유 변수를 사용하지 말라는 말...
처음스프링 어플리케이션을 실행하면, 즉 main 메서드를 실행하면 수많은 main 쓰레드들이 실행되는걸 볼 수 있다.
오른쪽 끝에 나오는 정보가 쓰레드를 의미한다.
그러면 요청이 올때마다 이렇게 쓰레드를 생성해서 제공하는 것일까? 당연히 아니다. 쓰레드 생성 비용이 매우 비싸고 필요할 때마다 생성하면 응답 속도도 느려지기 때문이다. 그리고 요청이 너무 많이 오면? 쓰레드가 너무 많아져 서버가 터질수도 있다. 그래서 쓰레드를 관리하기 위해 쓰레드 풀 방식을 사용한다.
인프런 김영한 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
미리 쓰레드를 만들어 놓고 쓰레드가 필요할 때 쓰레드 풀에서 꺼내 사용한다. 물론 다 쓰면 다시 반납해야 한다. 그러면 쓰레드 풀에 쓰레드가 없으면? 쓰레드를 기다리거나 요청을 거부할 수 있다.
어쨌든 WAS는 이러한 멀티 쓰레드 처리부분까지 모두 담당하여 개발자가 쉽게 WAS를 개발할 수 있도록 해준다.