필자가 배운 내용을 정리하고자 함에 의의를 뒀으니 비유적인 표현이 많고 개념을 정의함에 있어서 정석적인 정의가 아님을 인식해주었으면한다.
피드백 절대환영!!!
http://naver.com/a.png
-> a.png라는 자원을 요청http://naver.com/picture/a
-> picture이라는 식별자로 a라는 picture(사진)을 요청서블릿 컨테이너란 스프링의 내장 톰캣 서버를 의미한다.
그렇다면 서블릿 컨테이너는 클라이언트의 요청을 어떻게 처리할까?
첫번째 요청시
init()
을 호출Service()
호출 직전에 새로운 스레드 생성Service()
안의 http 메서드(get, post, put, delete, patch 등) 실행하여 DB연결, 데이터 html에 담아서 응답두번째 요청시
Service()
호출 직전에 새로운 스레드 생성해 http 요청에 따라 메서드실행다수의 요청이 동시접근할 수 도 있다.
이럴때 요청의 개수만큼 스레드를 생성한다.
그러나 컴퓨터 성능에 따라 스레드를 생성할 수 있는 개수가 다르다.
이럴 경우에는 스레드를 재사용(pooling)한다.
ex) 20개의 요청이 동시에 서블릿 컨테이너에게 전달됐다고하자.
그러면 서블릿 컨테이너는 20개의 스레드를 생성하여 20개의 요청을 동시에 처리할 수 있다.
만약 내 컴퓨터는 20개의 스레드까지만 생성할 수 있는데 동시에 25개의 요청이 들어오면
5개는 대기를 시키고 20개 중 할 일을 마친(요청에 reponse한) 스레드를 소멸시키지않고(원래 할 일을 마친 스레드는 소멸된다) 대기중인 요청을 위해 재사용한다.
스레드를 재사용하는 것을 pooling이라고한다.
생성 가능한 스레드의 개수를 늘리는 방법도 있다
예를 들어 1000->10000개로 늘리고 싶다면
자바의 메모리 영역에는 static, heap, stack이 있다.
만약 A 클래스의 hello() 메서드가 있다고 하자.
만약 각각 다른 3명의 클라이언트가 hello()를 호출했다고 하면, heap에 A클래스 객체를 1개만 올려 사용하지만, 각각의 요청에 대한 hello() 메서드는 stack 메모리에 3개의 공간을 차지하게 된다.
즉, 객체는 공통으로 쓰지만 호출된 메서드는 각각의 독립적인 메모리 공간을 가진다.
좋은 글 감사합니다!