Servlet에 대해 배우기 전에 Web Server와 WAS를 먼저 집고 넘어가야한다.
출처 : https://velog.io/@neity16/6-%EC%8A%A4%ED%94%84%EB%A7%81-MVC-1-%EC%9B%B9-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%9D%B4%ED%95%B4-WAS-%EC%84%9C%EB%B8%94%EB%A6%BF-%EB%A9%80%ED%8B%B0-%EC%93%B0%EB%A0%88%EB%93%9C-CSR-SSR
Web Server는 Http 기반으로 동작하며 Http요청이 들어왔을시 정적 리소스(정적 HTML, CSS, 이미지, 영상)를 제공한다.
NGINX와 APACHE 등이 있다.
출처 : https://velog.io/@neity16/6-%EC%8A%A4%ED%94%84%EB%A7%81-MVC-1-%EC%9B%B9-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%9D%B4%ED%95%B4-WAS-%EC%84%9C%EB%B8%94%EB%A6%BF-%EB%A9%80%ED%8B%B0-%EC%93%B0%EB%A0%88%EB%93%9C-CSR-SSR
WAS는 Web Application Server의 줄임 말로써 web server와 마찬가지로 Http 기반으로 동작하며 web server의 기능을 포함하여 동적 리소스(동적 HTML, HTTP API(json), Servlet, JSP, Spring MVC)를 제공한다.
즉, 프로그램 코드를 실행해서 애플리케이션 로직을 수행한다.
Tomcat, Jetty 등이 있다.
Servlet이란 자바를 사용해서 클라이언트 요청을 처리하고 결과를 반환하는 자바 웹 프로그래밍 기술.
자바를 이용해서 웹 개발을 하기 위해서는 가장 필요한 기술이 Servlet이다.
출저 : https://velog.io/@neity16/6-%EC%8A%A4%ED%94%84%EB%A7%81-MVC-1-%EC%9B%B9-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%9D%B4%ED%95%B4-WAS-%EC%84%9C%EB%B8%94%EB%A6%BF-%EB%A9%80%ED%8B%B0-%EC%93%B0%EB%A0%88%EB%93%9C-CSR-SSR
init()
메서드를 통해 서블릿 컨테이너에 서블릿을 초기화한다.service()
메서드 호출시, Http 요청의 Http Method에 따라 doGet(), doPost()등의 메서드라 호출된다.destory()
메서드가 호출되며 종료시 처리해야 할 작업은 destory()를 오버라이드하여 구현하면 된다.JVM에서 호출 방식은 서블릿과 일반 클래스 모두 동일하지만, main()메서드로 직접 호출되는 일반 클래스와는 달리 서블릿은 main()에서 직접 호출되지 않고 서블릿 컨테이너에 의해 호출된다.
서블릿 컨테이너가 web.xml을 읽고 서블릿 클래스를 클래스 로더에 로드한다.
서블릿 컨테이너는 구현되어 있는 서블릿 클래스의 규칙에 맞게 서블릿 객체를 초기화, 호출, 종료 하는 생명주기
를 관리하고 클라이언트와 요청을 주고 받을 수 있도록 웹 서버와 소켓으로 통신
한다.
서블릿 컨테이너에서 관리하는 서블릿 객체는 싱글톤으로 관리된다.
싱글톤 패턴이기 때문에 thread-safe하지 않음으로 읽기 전용이나 동기화 처리된 구조로 설계해야한다.
톰캣과 같이 서블릿 컨테이너 기능을 제공해주는 WAS를 서블릿 컨테이너라고 편하게 많이 부르는것 같다.
출처 : https://velog.io/@neity16/6-%EC%8A%A4%ED%94%84%EB%A7%81-MVC-1-%EC%9B%B9-%EC%95%A0%ED%94%8C%EB%A6%AC%EC%BC%80%EC%9D%B4%EC%85%98-%EC%9D%B4%ED%95%B4-WAS-%EC%84%9C%EB%B8%94%EB%A6%BF-%EB%A9%80%ED%8B%B0-%EC%93%B0%EB%A0%88%EB%93%9C-CSR-SSR
우리가 클라이언트의 요청을 받아 비즈니스 로직을 처리하고 결과를 반환하는데는
많은 작업이 필요하다.
하지만 비즈니스 로직을 제외한 부분을 WAS에서 처리해주어 우리 개발자는 단지 HttpRequest를 받아서 비즈니스 로직을 만들고 결과를 HttpResponse에 실어 보내기만 하면 된다.
서블릿 컨테이너는 자바 스레드(Thread)
를 이용해 서블릿을 호출한다.
클라이언트 요청이 들어왔을 때 스레드를 생성하여 사용하는데, 다중 스레드를 사용함으로써 다중 요청을 효율적으로 처리할수 있다.
하지만 요청때마다 스레드를 생성하게 되면 CPU와 메모리 과부하로 인해 문제가 생길수 있다.
이러한 문제를 해결하기 위해 Thread Pool이라는 방법을 사용한다.
필요한 스레드의 개수를 정해놓고 요청시 thread pool에서 미리 생성해둔 스레드를 사용하고 반납하여 비용을 줄이는 방식이다.
최대 스레드 개수를 넘어가게 되면 대기 혹은 거절하는 방식이다.
(톰캣은 기본 최대 스레드 개수는 200개 이다.)
Thread Poll의 장점
위에서 설명했듯이 서블릿 컨테이너는 서블릿의 생명주기를 관리함으로써 클라이언트의 요청에 맞는 서블릿을 생성, 호출할수 있으며 서블릿을 종료하거나 서블릿 컨테이너가 종료될때 서블릿을 종료시킬수 있다.
보안관련 설정을 배포 서술자라는 xml문서를 사용함으로써 개발자가 보안 설정을 바꾸어도 자바 코드에는 영향을 미치지 않는다.
JSP 코드를 자바 코드로 변환해준다.
출처 : https://steady-coding.tistory.com/599
Spring MVC도 서블릿 컨테이너가 관리하는 서블릿이고 서블릿 컨테이너가 Bean에 접근하기 위해서는 Spring Container를 거쳐야 한다.
WAS의 설정은 최적화로 되어있기 때문에 웬만하면 수정을 하지 않는다.
하지만 WAS에서 수정을 한다면 아마 스레드 설정을 많이 건드리지 않을까 싶다.
특히 쓰레드의 최대 스레드(max Thread)가 서버의 효율성에 많은 영향을 끼치기 때문에 최적의 스레드를 찾아 서버를 돌려야한다.
그렇다면 적절한 스레드 개수는 어떻게 되는 것일까?
애플리케이션 로직의 복잡도 / CPU / 메모리 / IO 리소스, 네트워크 속도 등 여러가지 요소가 복합적으로 작용하기 때문에 일반화 할 수는 없다.
JVM에 PC레지스터가 있는데 거기서 스레드를 생성하고 스레드 컨텍스트가 저장이된다.
이 스레드를 가지고 메모리 크기, 네트워크 속도, 컨텍스트 스위칭 비용 등 모든걸 따져야 하기 때문에 성능 테스트 툴을 이용해 물리적으로 적절한 값을 찾아야한다.
naver에서 만든 nGrinder가 있다고 한다.
적정 스레드 : https://junshock5.tistory.com/147