결과적으로 클라이언트가 요청하고 was가 응답하는건 알겠는데 was에서 tcp/ip로 클라이언트와 연결되고나서 도대체 누가 servlet을 호출해주는걸까? 그 중간다리가 뭘까? -> 쓰레드가 연결해준대! 근데 쓰레드는 뭐야?
애플리케이션 코드를 순차적으로 하나식 실행하는것. 자바의 main()도 쓰레드임.
was와 연결되고나서 맞는 쓰레드를 할당해주고 그 쓰레드가 servlet을 호출함.
한 스레드가 지연될때마다 새로운 스레드를 만들어서 지연되는동안 다른 스레드에서 작업을 하려고 하면 어떤 일이 발생할까
스레드 생성이 제한이 없어서 문제라면 그 제한만큼 미리 스레드를 만들어놓고 그 스레드만 사용하면 되지 않을까? -> 스레드 풀 등장!
사용하지 않는 미리 만들어놓은 스레드들을 스레드 풀에 넣어놓고 필요할때마다 꺼내서 스레드를 사용함. 모든 스레드가 사용중이라서 스레드 풀에 있는 스레드가 없다면 스레드를 다 써서 다시 반납될때까지 요청은 대기하거나 거절당하는 상태에 처함.
그러므로 was의 주요 튜닝 포인트는 최대 스레드로 설정하는 것임. 너무 적게 설정하면 서버 리소스는 여유로운데 클라이언트 요청은 너무 오래 지연되고, 반대로 너무 높게 설정하면 서버가 죽어버림.
그럼 이 적절한 수는 어떻게 찾을까?
was의 가장 큰 좋은점은 멀티 스레드를 지원해준다는 점인데 개발자는 스레드 풀에서 최대 스레드의 수만 잘 설정해주기만하면 그외 나머지 미리 스레드 할당이라던가 요청마다 스레드 할당해주는 모든 작업들은 was가 알아서 처리해줌.
하지만 멀티 스레드를 지원해주므로 개발자는 서블릿이나 스프링 빈같은 싱글톤 객체를 주의해서 사용해야됨