HTTP 기반 동작, 정적 리소스 제공
(NGINX, APACHE)
역시 HTTP 기반 동작, 프로그램 코드를 실행하여 애플리케이션 로직을 수행.
(서블릿, JSP, 스프링 NVC)
모두 데이터를 HTTP로 통신한다. 둘의 경계는 모호하나, WAS는 애플리케이션 코드를 실행하는 데 특화되었다.
따라서 정적 리소스는 웹 서버가 처리하고, 동적 로직이 필요할 때 WAS에 위임하여 처리한다. (각각 서버를 확장하여 유동적이고 효율적인 리소스 관리 가능)
WAS를 구현할 경우 가장 먼저 해야 하는 것은 HTTP 메시지를 파싱하여 읽어내는 것이다.
이후 파싱된 메시지 내용의 비즈니스 로직을 실행한다. 로직 실행을 제외한 파싱 등의 공통 부분을 서블릿에서 자동화하여 제공한다.
서블릿 컨테이너는 서블릿 객체를 생성, 호출, 생성주기 관리까지 실행한다.
서블릿 객체를 실행하는 것은 쓰레드이다. 웹에서 여러 사용자들이 요청을 수행하면 한 쓰레드로 동시에 작업할 수 없기 때문에, 요청마다 멀티 쓰레드를 생성할 수도 있다. 다만 문제점이 존재한다.쓰레드 : 애플리케이션 코드를 순차적으로 실행하며, 한번에 하나의 코드만 실행한다.
생성 비용이 비싸며, 많은 쓰레드 동작시 응답 속도 늦어짐 + 스위칭 비용 발생
쓰레드 생성 제한이 없기에 임계점을 넘어 서버가 죽을 수 있음.
이러한 단점을 해결하기 위해 쓰레드 풀 의 개념을 사용한다. (= 대기열)
쓰레드를 죽이고 생성하는 것이 아닌 ‘대여’의 형식처럼 일정 개수를 운용한다.
응답 시간과 쓰레드 생성/종료 비용이 절약되며 과부하 문제에 상대적으로 안전하다.
쓰레드 풀의 적정 숫자를 찾기 위해 아파치 ab, 제이미터, nGrinder 등을 사용해 성능 테스트를 시도한다.
중요한 것은 WAS가 멀티 쓰레드 부분을 처리한다는 것이다. 개발자는 싱글 쓰레드를 사용하듯 소스 코드를 개발하되, 싱글톤 객체를 주의해서 사용하도록 해야 한다.
HTTP API : 데이터만 주고 받는다. (서버 to 서버 등) 주로 JSON 통신 사용
SSR : 타임리프, JSP 등의 기술. 서버에서 HTML을 생성해서 클라이언트에 전달
CSR : 클라이언트 사이드 렌더링