Springboot 개념정리 - 서블릿 객체의 생명주기

Yuri Lee·2020년 9월 10일
0

Springboot 개념정리

목록 보기
6/10

스프링부트 강좌 with JPA 10강 - 서블릿 객체의 생명주기를 알려줘요!

서블릿 컨테이너? 클라이언트가 요청을 한다. 서블릿 컨테이너, 톰켓이라고 한다. 요청을 받고 최초 요청이면 객체를 생성하고 아니라면 재사용한다.

요청을 하게 되면 이 요청을 받을 때 정적인 파일을 요청하게 되면 아파치가 돈다. 톰켓이 일을 안한다. 무조건 아파치가 일을 한다.

얘가 요청을 할때 .html, css, png 가 아니라 java 파일을 요청할때 톰켓이 일을 한다.

스프링을 할때도 이런 파일들을 요청하면 톰켓이 일을 안한다고 생각할 수 있다. 맞다. 하지만 스프링은 이런 파일을 요청할 수 없다.

왜냐면

URL : 자원접근
URI : 식별자 접근

요청시에 이런 파일들을 직접 요청하는 url을 막아놨다. 스프링에서는.. 그럼 식별자를 통해서 접근해야 한다.

즉 특별한 파일 요청을 할 수 없다. 요청시에는 무조건을 자바를 거친다. 무조건 아파치는 톰켓에게 제어권을 넘겨주는 것이다.

URL은 http://naver.com/a.png
URI는 http://naver.com/picture/a 라고 함

요청이 왔을 때 서블릿 컨테이너가 객체를 생성하는 방식이 있다.

클라이언트가 request(자바관련) 하게 되면 서블릿이 만들어져야 한다.

서블릿은 단순하다. 자바코드로 웹을 할 수 있는 것을 말하고 이 서블릿 컨테이너는 자바코드로 웹을 할 수 있는 것들을 모아놓은 것이다.

최초의 요청이 들어오게 되면 요청을 받을때 스레드를 생성한다. 그리고 이 스레드 1이 서블릿 객체를 만든다. 이 서블릿 객체에서 수많은 일들을 한다. 디비 커넥션, 필요한 데이터 가져오기 등등 을 하고 html로 바꿔준다.

이게 왜 스레드가 만들어질까? request를 한명이서 하는 게 아니라 동시에 수천만, 수만명이 할 수 있기 때문이다. 동시 처리를 위해서 요청이 올때마다 스레드2 를 만든다. 그리고 새로운 서블릿 객체를 만든다.
또 요청이오면 새로운 스레드3 를 생성, 그리고 서블릿 객체를 또 만든다.

서블릿 객체에서 만약 db연결해서 데이터 가져올때 3초 걸린다면 다른 얘들이 딜레이가 된다. 그래서 스레드를 만든다. 동시접근 허용 위해.

근데 무한정이 아니라 정해놓을 수 있다. 스레드를 ..
만약 20개이면 21번째 요청이 들어오면 대기를 해야 한다. 스레드 1,2,의 응답이 아직 오지 않았을 경우....

그럼 스레드를 천개, 만개를 만들면 되는 거 아닌가요? 그럼 3초가 걸릴일이 6초가 될 것이다. 느려짐..

최적의 스레드를 서버의 성능에 맞게 생성해야 한다.

21번째 요청을 대기 하고 있다가 첫번째 스레드가 일을 다하고 응답을 해줬을 때
http 통신은 연결이 지속되어있는 게 아니라 한번 요청하고 응답을 해주면 끝나는 것이다. 그래서 stateless라고 했다.

응답을 했으니까 사라져야 할텐데...사라지지 않고 재사용된다. 21번째 요청이 일어났기 때문이다. 그래서 속도가 빠르다고 하는 것이다.

왜냐하면 스레드를 만들고, 삭제하고, 다시 요청이 들어올때 만들고,,그러면 만들고 날리고 하는 연산이 필요한데 적정하게 갯수를 정해놓고 지속적으로 재사용하면 속도는 빨라질 것이다.

클라이언트가 요청을 하게 될때 스프링같은 경우는 서블릿 컨테이너가 등장할 수 밖에 없는 구조이다. (URI)를 요청하기 때문에..
최초요청이 오면 아무것도 없기 때문에 서블릿 객체를 만들고 실행하고.. 쭈욱...

21번째까지는 No...기존에 있는 것을 재사용하기 때문에...

그래서 마지막으로 최종적으로 만들어진 게

HttpServiceRequest 객체와 HttpServiceResponse 객체이다. 이것은 스프링이 아니라 톰켓이 들고 있는 객체이다.

웹이라는 것은 request 와 response의 여행이다. 이 여행이 끝나면 웹은 종료되는 것이다.


-이 글은 유투버 겟인데어의 스프링 부트 강좌를 바탕으로 정리한 내용입니다.-

profile
Step by step goes a long way ✨

0개의 댓글