이 글을 다 읽으면 Servlet 이 뭐길래 Spring 할 때 알아야 할까? - 2 글을 읽는것을 추천한다.
Servlet은 Spring Boot를 배울때 굉장히 중요한 개념이라고 할 수 있다.
하지만, Spring Boot안에 Servlet 이 있는것이 아니라, Servlet을 편하게 사용할 수 있게 해주는것이 Spring Boot인것은 알아두어야 한다.
자바로 구현된 CGI(Common Gateway Interface)
웹 프로그래밍에서 클라이언트 요청을 처리하고 결과를 클라이언트로 전송하는 기술
Tomcat이 이해할 수 있는 순수 Java코드로 이루어진 서버용 클래스
Servlet이란 개념은 Spring을 하면서 정말 중요한 개념 중 하나이다.
여러 CGI언어 중 Java의 Servlet은 서버에 부하가 가장 적다는 장점이 있다. 왜 부하가 적은지는 뒤에서 다루도록 하겠다.
→ CGI
Servlet을 지원하는 WAS를 Servlet Container 라고 하는데, Tomcat이 대표적이다.
WAS는 다른 글에서 알아보도록 하겠다.
이 Servlet Container는 개발자가 개발한 비즈니스 로직만 실행하면 된다.
개발자에게 편리성을 제공해주는것이 Servlet Container 라고 한다.
여기서 Servlet Contaienr를 WAS라고 하겠다.
클라이언트의 요청이 들어오면 WAS는 요청에 맞는 Servlet이 메모리에 있는지 확인한다.
이 후로 Servlet을 사용할땐 쓰레드를 하나 생성하고, 그 쓰레드 위에서 service() 메서드를 실행을 한다.
그 전에 HttpServletReqeust 와 HttpServletResponse 객체를 WebServer에서 받는다.
해당 메서드 안에는 doGet(), doPost() 등의 메서드들로 비즈니스로직에 따라 제작된 페이지를 response객체에 담고, 이를 WebContainer(Servlet Container)로 보내 이 곳에서 Http Response로 바꾸어 WebServer에 전달한다.
이러한 동작이 끝나게 되면 웹서버에서 받은 Request와 Response를 삭제하고 쓰레드를 종료한다.
WAS가 꺼지거나 재배포를 위해 재부팅을 한다면 destory()가 실행된다.
Servlet객체는 싱글톤으로 관리되기 때문이다.
이게 무슨소리지?
Servlet객체가 요청할때마다 생성되는것이 아닌, 최초 로딩 시점에 객체가 한번 생성되고, 이 생성된 객체를 재활용하기 때문에 서버에 부하가 적다.
그리고, 동시 처리를 위해 멀티 쓰레드 처리를 지원한다.
아니 그런데 멀티쓰레드도 문제가 있지 않나요?
맞다, 여러 문제가 있다. 생성 비용과 Context Switching 문제와 쓰레드에 제한이 없으면 서버가 다운될 수 있다.
하지만, 쓰레드를 미리 생성해놓는 쓰레드풀을 이용하여 위의 단점을 보안하였다.
쓰레드가 필요하면 생성되어 있는 쓰레드를 꺼내서 사용하기 다 쓰면 풀에 반납한다.
쓰레드가 모두 사용중이라면, 요청거절 or 지정 숫자만큼 대기하도록 설정
Spring Boot를 하다보면 @RestController 라고 어노테이션을 작성한 적 있을것이다.
Spring Boot에서의 Servlet은 @RestContorller로 구현하고있는 비즈니스 로직이라고 할 수 있겠다.