요즘 시대에서는 대부분 HTTP프로토콜로 모든 데이터와 메시지를 전달한다
정적리소스(HTML,이미지 등)은 Web server가 처리하고 동적리소스 처리 같은게 필요하면 WAS가 처리하게끔 함
클라이언트가 요청-> 정적인것은 web server가 다 처리함/ 어 근데 동적인 로직이 필요하네? -> WAS한테 넘김
그렇게 하면 효율적으로 관리를 할 수가 있는데
정적리소스가 많다 싶으면 Web Server를 많이 두고
동적리소스가 많다 싶으면 WAS 를 많이 두면 된다
이 때 정적리소스만 제공하는 Web Server는 잘 죽지 않는다
반면에 애플리케이션 로직이 포함된WAS는 잘 죽는다
A servlet is a Java programming language class that is used to extend the capabilities of servers that host applications accessed by means of a request-response programming model. Although servlets can respond to any type of request, they are commonly used to extend the applications hosted by web servers. For such applications, Java Servlet technology defines HTTP-specific servlet classes. (오라클 공식문서)
서블릿이란 일종의 클래스인데 요청-응답 프로그래밍 모델을 통해 액세스하는 응용 프로그램을 호스팅하는 서버의 기능을 확장하는 데 사용되는 Java 프로그래밍 언어 클래스입니다.
서블릿은 모든 유형의 요청에 응답할 수 있지만 일반적으로 웹 서버에서 호스팅하는 응용프로그램을 확장하는 데 사용됩니다.
이런 웹 서버의 경우 Java Servlet 기술은 HTTP 특정 서블릿 클래스를 정의합니다.
HTTP 통신을 하게되면 위의 박스에 해당하는 내용들을 모두 채워서 응답을 해야하는데 매번 너무 번거롭습니다.
따라서 초록박스를 제외한 나머지 부분들은 자동으로 완성하도록 서블릿
이라는 클래스를 만들었고 서블릿을 지원하는 WAS가 저 빨간부분들을 다 처리해준다고 합니다.
서블릿은 request로 온 데이터들을 파싱한 데이터들을 좀 더 읽기쉽게끔 해주고 response 시 보내는 응답메시지도 만들어줍니다.
/url?username=hello&age=20
메시지 바디 없이, URL의 쿼리 파라미터에 데이터를 포함해서 전달
예) 검색, 필터, 페이징등에서 많이 사용하는 방식
content-type: application/x-www-form-urlencoded
메시지 바디에 쿼리 파리미터 형식으로 전달 username=hello&age=20
예) 회원 가입, 상품 주문, HTML Form 사용
메시지 바디에 원하는 데이터를 직접 넣어서 보내는 경우
텍스트도 보낼 수 있고 다 보낼 수 있는데 보통 JSON으로 많이 보냄
근데 자바코드로 html 코드를 다 써줘야 함..
이럴 바엔 차라리 html코드 사이사이에 자바코드를 넣는 템플릿 방식을 쓰자
그 중에 JSP로
톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 부르고
서블릿 컨테이너는 서블릿 객체를 생성,초기화,호출,종료하는 생명주기를 관리한다.
서블릿 객체는 싱글톤으로 관리하게 된다.
즉 객체 한 개만 만들어서 돌려쓴다고 보면 된다. 그래서 공유 변수에 주의해야함
서블릿 컨테이너는 동시요청을 위한 멀티쓰레드를 지원한다!
요청이 들어왔다! 그럼 최초에 한 개의 서블릿 객체가 생성이 되고 이 객체를 재활용(돌려쓴다) 라고 했다. 근데 이 서블릿 객체를 누가 호출하지??
쓰레드란
그래서 요청이 여러개 오면 쓰레드를 여러개 생성하며 되는데 단점이 있다.
쓰레드는 생성 비용이 비싸고 요청이 너무 많아 쓰레드가 너무 많이 생성되면 CPU와 메모리의 임계점이 넘어 서버가 죽을 수도 있다. (단점)
위와 같은 단점을 쓰레드 풀
로 해결한다.
쓰레드를 여러 개 만들어놓고( CPU 와 메모리가 견딜 수 있는 만큼의) 쓰레드 풀에서 놀게한다.
이 때 요청이 오면 쓰레드 풀에 요청을 해서 쓰레드 한 개를 배정받는다.
사용이 끝나면 다시 쓰레드 풀에 반납을 한다.
이제 쓰레드 풀에 들어갈 max thread
를 설정하게 될 건데
max thread가 너무 낮으면 서버는 여유롭지만 대기와 거부가 많이 생길 것이고
max thread를 너무 높게 잡으면 동시요청이 많을 때 CPU와 메모리 리소스 임계점초과로 서버가 다운될 수 있다.
이런 멀티쓰레드에 대한 부분은 WAS가 지원을 해줘서 개발자들은 신경을 쓰지않아도 된다!
https://docs.oracle.com/javaee/5/tutorial/doc/bnafe.html
김영한님의 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술