스프링부트 강좌 with JPA 10강 - 서블릿 객체의 생명주기를 알려줘요!
1. 스프링부트 동작원리
(1) 내장 톰켓을 가진다. 톰켓을 따로 설치할 필요없이 바로 실행가능하다.
(2) 서블릿 컨테이너
클라이언트가 요청을 한다.
요청을 하면? 서블릿 컨테이너 즉, 톰켓이 요청을 받고
최초요청이면? 객체를 생성하고
아니면? 객체를 생성하지 않고, 이미 생성된 객체를 재사용한다.
위 그림에 대해서 자세히 알아보자.
정적인 파일을 요청하게 되면? 아파치가 동작! 톰켓이 일을 안한다.
예를 들어, html, css, png파일 등
그렇다면? 자바 파일을 요청을 할 때, 톰켓이 일하게 됨.
▷URL은? 자원에 직접 접근할때(Location) 요청하는 방식
▷URI는? 식별자(Identifier)를 통해서 요청하는 방식
요청시, URL로 접근하는 방식을 스프링은 다 막아놓았다!
그래서 식별자를 통해서 요청해야하는데,,,
특정한 파일 요청을 할 수 없다. 요청시에는 무조건 자바를 거쳐야한다!!!
무조건 아파치는 톰켓에게 제어권을 넘겨주게 되어있다.
URL 주소는 보통, http://naver.com/a.png이렇게 되어있다
URI 주소는? http://naver.com/Picture/a이렇게 되어있다.
/Picture/a이렇한 식별자가 들어오면? 실제로 응답해주는 건 a.png파일이다. 하지만 URL로 직접요청은 불가!
이렇게 요청하는 건, 톰켓이 다 가로채게 되어있다!!
다시 위 그림을 보면?
요청이 들어왔을때, 서블릿 컨테이너가 객체를 생성하는 방식을 알아보자
클라이언트가 request하게 되면(자바 관련 코드 요청), 서블릿이 만들어져야 함.
그런데,
(참고로, 서블릿은 자바코드로 웹을 할 수 있는 것!)
서블릿 컨테이너는? 자바 코드로 웹을 할 수 있는 것을 모아놓은 것! 이걸 톰켓이라 함
요청했을 때, 최초 요청이 들어오면?
요청을 받을 때, 쓰레드를 하나 만든다. 그리고 해당 스레드가 서블릿 객체를 하나 만든다.
이걸 1번 스레드라고 하자. 이 서블릿 객체에서 수많은 일들을 한다.
DB connection도 하고,,데이터도 가져오고,,,그리고 마지막에 html로 바꿔서 응답해주고,,,
스레드를 만드는 이유는? 요청을 수만명이 동시에 들어올 수 있기 때문에! 그때마다 스레드를 만든다
그리고 새로운 서블릿 객체를 만들어준다.
하나의 서블릿객체에서 DB로 접근해서 데이터 가져오는데에 3초 걸린다고 하자.
만약 다른 스레드를 만들지 않았다면? 다른 요청들은 3초씩 다 기다려야한다. 딜레이되는...
동시 접근을 허용하게 해주려고 스레드를 만드는 것!
스레드가 무한정 만들어지는 게 아니라, 정해놓은 스레드를 20개라고 하면?
21번째 요청이 들어왔을때, 다른 스레드가 아직 응답을 다 하지 않은 상태라고 하면?
21번째 스레드를 만들지는 않고,, 대기한다.
서버 성능에 맞게 최적의 스레드 갯수를 설정해놓아야한다.
첫번째 스레드가 응답을 해주고 일을 다한 상태라면?
http통신은 연결지속이 아니라, 한 번 응답을 해주면 끝나는 것임! stateless
이제 첫번째 스레드는 사라지는게 아니라!! 재사용된다! 21번째 요청을 처리하게 된다.
그리고 이미 만들어진 서블릿객체를 재사용! 만들고 삭제하고 만들고 삭제하고가 아닌 것!!!
재사용하니까 속도가 빨라진다.
< 정리 >
클라이언트가 요청하게 되면! 스프링은 URI요청만 가능하므로,
서블릿 컨테이너(톰켓)가 동작할 수 밖에 없게된다!
최초 요청시, 아무것도 없기 때문에 메모리 로딩-서블릿객체 생성-실행
최대 20번째 요청까지 새로운 객체를 생성되다가 21번째부터는 기존 객체를 재사용!
그리고 최종으로 만들어지는게 ,, HttpServletRequest, HttpServletResponse 객체!
이건 톰켓이 만들어주는 들고있는 객체이다! 여기에 대해서는 다음시간에...