웹 서버 vs WAS
-
서버간에 데이터를 주고받을때 http를 대부분 사용
-> 바야흐로 http의 시대!
-
웹서버란 ? http 기반으로 동작하는 서버.
- 정적 리소스(html, css, js, 이미지 등) 제공
- 예 ) nginx, apache
-
웹 애플리케이션 서버 (WAS) ? http 기반으로 동작하는 서버.
- 웹 서버 기능 포함
- 프로그램 코드를 실행하여 애플리케이션 로직 수행
- 동적 html, html api
- 서블릿, jsp, 스프링 mvc
- 톰캣, undertow ..
-
웹 서버 vs WAS?
- 웹 서버는 정적 리소스, WAS 는 애플리케이션 로직
- 웹 서버도 프로그램 실행하는 기능 포함/ WAS도 웹 서버의 기능 제공
- 자바는 서블릿 컨테이너 기능을 제공하면 WAS
- WAS는 애플리케이션 코드를 실행하는데 더 특화됨!
-
웹 시스템 구성을 WAS, DB로만 하면 생기는 문제!
- WAS가 너무 많은 역할을 담당해서 서버 과부하 우려
- WAS 장애시 오류 화면도 노출 안됨
- 값비싼 애플리케이션 로직이 정적 리소스 때무에 수행 어려울 수가 있음.
=> WEB, WAS, DB의 형태로 구성하게 됨.
- 정적 리소스는 웹서버가 처리 -> 잘 안죽음
- 웹 서버는 동적인 처리가 필요하면 WAS에게 요청 위임 -> WAS는 잘 죽음
- WAS는 중요 애플리케이션 로직 처리만 담당.
- 효율적인 리소스 관리
∴ 웹서버는 잘 안죽음 + WAS는 잘 죽음 = WAS, DB 장애 시 웹서버가 오류 화면 제공 가능
서블릿
-
클라이언트에서 서버로 요청이 왔을때 비즈니스 로직 외에 파싱 등의 모든 동작을 해줌
(개발자가 Http 스펙을 매우 편리하게 사용가능)
-
웹 브라우저에서 localhost:8080/hello 요청을 보내면?
- WAS 서버에서 요청메세지를 기반으로 request, response 객체 생성
- 서블릿 컨테이너 내의 서블릿 객체 호출
- 개발차가 request 메세지를 보고 response 메세지를
- 만들어둔 response 객체에 담겨있는 내용으로 http 응답 정보 생성
-
WAS 가 지원하는 서블릿 컨테이너.
서블릿 컨테이너가 서블릿 객체를 자동으로 생성해줌.
(생성, 호출, 관리와 같은 생명 주기까지 관리해줌)
-
서블릿 컨테이너?
- 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 함
- 서블릿 객체 생성, 초기화, 호출, 종료하는 생명주기 관리
- 싱글톤으로 관리
- 요청올때마다 생성하지 않고, 최초 로딩 시점에 미리 만들어서 재사용
- 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근
- 따라서 공유 변수 사용 주의!
- jsp도 서블릿으로 변환되어 사용
- 동시 요청을 위한 멀티 쓰레드 처리 지원함
동시요청-멀티쓰레드
- 서블릿 객체를 누가 호출하나요 ? 그것은 바로 쓰 레 드
- 요청이 올때마다 쓰레드 생성?
- 장점
- 동시 요청 처리 가능
- 리소스가 허용할때까지 처리 가능
- 하나의 스레드가 지연되어도 나머지 스레드 정상 동작 가능
- 단점
- 쓰레드 생성 비용이 비쌈
- 컨텍스트 스위칭 비용이 발생
- 생성 제한이 없음 (-> 고객 요청이 많이 오면 cpu/메모리 임계점을 넘어서 서버가 죽을 수 있음)
- 단점을 없애기 위해 ! 쓰레드 풀 사용
-> 쓰레드를 매번 생성하지 않고, 쓰레드를 미리 만들어서 풀에 넣어둠
-> 쓰레드 풀에 쓰레드가 없는데 요청이 더 들어오면 쓰레기 대기 or 거절함
- 쓰레드 생성/종료 비용 절약, 응답 시간 빠름
- 너무 많은 요청 들어와도 기존 요청은 안전하게 처리 가능
🎈 실무 팁!
- WAS의 주요 튜닝 포인트 = 최대 쓰레드 수
- 너무 낮게 설정하면 ? 동시 요청이 많으면, 서버 리소스는 여유롭지만 클라이언트는 금방 응답지연
- 너무 높게 설정하면 ? 동시 요청이 많으면, CPU, 메모리 리소스 임계점 초과로 서버 다운
- 장애 발생 시 ? 클라우드면 서버부터 늘리고 이후 튜닝 / 클라우드 아니면 열심히 튜닝..
그럼 쓰레드풀 적정 숫자는 어떻게 찾나요?
- 애플리케이션 로직의 복잡도, CPU, 메모리, IO 리소스 상황에 따라 다름
- 최대한 실제 서비스와 유사하게 성능 테스트
- tool : 아파치ab, jMeter, nGrinder
🎈 핵심!
- WAS가 멀티쓰레드 기능을 지원해줌! (-> 개발자가 안해도 된다는 장점)
- 멀티쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 주의해서 사용
HTML, HTTP API, CSR, SSR
-
http api 사용 상황(3가지) : 앱/웹클라이어트(js)/서버 to 서버
-
SSR? 서버사이드렌더링 : 서버에서 최종 html을 생성해서 클라이언트에 전달.
- 정적 화면에서 주로 사용
-> ex. jsp, 타임리프 (BE 개발자)
-
CSR? 클리이언트사이드렌더링 : html결과를 자바스크립트를 사용해 웹브라우저에서 동적으로 생성하여 적용
- 동적 화면에서 주로 사용
-> ex. react, vue,js (FE 개발자)
자바 백엔드 웹 기술 역사
🎈최신 기술.
스프링 웹플럭스(webFlux)
- 장점
- 비동기 넌블러킹 처리
- 최소 쓰레드로 최대 성능 - 쓰레드 컨텍스트 스위칭 비용 효율화
- 함수형 스타일로 개발하기 때문에 동시처리 코드 효율화
- 서블릿 기술 사용 안함
- 단점
- 기술적 난이도 매우 높음
- RDB 지원 부족, 실무에서 아직 많이 사용 안함
- 일단MVC의 쓰레드 모델도 충분히 빠름