HTTP 프로토콜을 통해서 대부분의 데이터를 주고 받는다.
웹 서버란?
HTTP 를 기반으로 동작하며 정적 리소스 (HTML, CSS, JS, 이미지, 영상, 등)를 제공
웹 애플리케이션 서버란?
HTTP 기반으로 동작하며 웹 서버 기능을 포함한다. 프로그램 코드를 실행해서 애플리케이션 로직을 수행해서 동적인 HTML을 생성하며, HTTP API (JSON)도 제공이 된다
서블릿, JSP, 스프링 MVC가 WAS 서버에서 동작.
웹 시스템 구성
-> WAS, DB만 구성할 수 있긴함
WAS가 정적인 리소스까지 담당하게 되기 떄문에 너무 많은 역할을 담당하게 되어 과부하가 우려됨
WAS 가 장애가 오면 정적 리소스 노출도 불가능해짐
서버끼리 데이터만 주고 받는 API 의 경우에는 WAS 서버만으로도 ok.
-> WEB Server, WAS, DB 로 구성
정적 리소스는 웹서버가 처리하고, WAS는 중요한 애플리케이션 로직을 담당
업무 분담!
시스템 리소스를 효율적으로 관리
정적 리소스 관리가 필요 -> WEB Server 증설
애필리케이션 로직 담당 필요 -> WAS 증설
만약 WAS 서버가 죽으면 WEB Server는 오류화면 HTML을 뿌리도록 설정
웹 애플리케이션 서버를 직접 구현하려면...?
HTTP 메세지가 클라이언트에서 만들어져서 서버로 전송되면,
만약에 우리가 웹 애플리케이션 서버를 전부 다 구현해야 한다면
HTTP 메세지를 쭉 풀어 해쳐야 함
-> POST /save HTTP/1.1 이었을 경우
TCP/IP 연결 대기 후 소캣 연결
HTTP 메세지도 사실 하나의 텍스트기 때문에 잘라서 파싱을 일일히 해야함
정보를 파싱한 뒤에 POST 방식, URL 인지
Content-Type 확인, HTTP 메세지 바디 내용 파싱,,
/save URL 이었기 때문에 저장 프로세스 실행
비즈니스 로직 실행 (데이터 베이스 저장 요청)
HTTP 응답 메세지 생성 시작
HTTP 시작 라인 생성
Header 생성
메세지 바디에 HTML 생성해서 입력
TCP/IP 응답 전달, 소캣 종료...
전세계 개발자가 이걸 개발하고 있으면 비효율 적
이걸 서블릿이 가운데 비즈니스 로직 빼고 다 해줌
서블릿을 제공하는 WAS들이 이 기능을 다 지원해준다.
urlPatterns(/hello) 의 URL이 호출되면 서블릿 코드가 실행.
HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServletRequest
HTTP 응답 정보를 편리하게 제공할 수 있는 HttpServletResponse
HTTP 요청이 오면
WAS는 Request, Response 객체를 새로 만들어서 서블릿 객체 호출
개발자는 Request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용
개발자는 Rseponse 객체에 HTTP 응답 정보를 편리하게 입력
WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성
서블릿 컨테이너
WAS 안에 서블릿 컨테이너
서블릿 컨테이너가 자동으로 생성, 호출, 종료
생명 주기 관리!
서블릿 객체는 싱글톤으로 관리!!
request, response 객체는 항상 요청이 올때마다 새로 생성해야 함
그러나 서블릿은 같은 기능을 수행하므로, 고객의 요청이 올 때 마다 new 해서 객체를 새로 생성하는 것은 비효율
최초 로딩 시점에 서블릿 객체를 미리 만들어 두고 재활용
공유 변수 사용 주의!
참고) JSP 도 서블릿으로 변환되서 사용
동시 요청을 위한 멀티 쓰레드 처리 지원!!
** 스레드란?
애플리케이션 코드 하나하나 순차적으로 실행하는 것은 쓰레드
(자바 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행)
동시처리가 필요하다면 쓰레드 추가 생성
요청마다 쓰레드 생성한다면..?
장점 : 동시 요청을 처리 가능, 리소스가 허용될 때 까지 처리 가능, 하나의 쓰레드가 지연되도 나머지 쓰레드는 정상 동작
단점 : 쓰레드 생성 비용은 비쌈
쓰레드 컨텍스트 스위칭 비용이 발생
쓰레드 생성에 제한이 없어서 고객의 요청이 너무 많이 오면 CPU, 메모리 임계점을 넘어서 서버가 죽어버림
그래서 쓰레드 풀 사용! (요청 마다 쓰레드 생성의 단점 보완)
쓰레드 들이 있는 풀장이라고 생각
쓰레드 풀에 있는 쓰레드를 사용하고 사용 후에 반납하는 방식
쓰레드 풀에 쓰레드가 없으면 대기 or 거절
쓰레드가 미리 생성되어 있으므로, 쓰레드를 생성하고 종료하는 비용이 절약되고 응답시간이 빠르다
너무 낮게 설정 : CPU 적게 사용.. 동시 요청이 많으면, 서버 리소스는 여유롭지만 클라이언트는 금방 응답 지연
너무 높게 설정 : 동시 요청이 많으면 CPU, 메모리 리소스 임계점 초과로 서버 다운
적정 숫자는 성능 테스트를 시도해서 찾는다.
--
결론은 멀티 쓰레드에 대한 부분은 WAS가 처리하므로 개발자가 멀티 쓰레드 관련 코드를 신경쓰지 않아도 된다.
개발자는 마치 싱글 쓰레드 프로그래밍을 하듯이 편리하게 소스코드 개발
멀티 쓰레드 환경이므로 싱글톤 객체 (서블릿, 스프링 빈)는 주의해서 사용!
출처 : 인프런, 김영한 강사님의 스프링 MVC 1편