EP1. WAS, 서블릿, 멀티쓰레드
Web/MVC

EP1. WAS, 서블릿, 멀티쓰레드

웹서버 vs WAS

 

웹서버

  • HTTP 기반으로 동작
  • 정적 리소스 제공(HTML, CSS, JS, 이미지, 영상), 기타 부가 기능

 

웹 애플리케이션 서버 (WAS)

  • HTTP 기반으로 동작
  • 웹 서버 기능 포함 + 애플리케이션 로직 수행
    - 동적 HTML, HTTP API(JSON)
    - 서블릿, JSP, 스프링 MVC

WAS가 웹서버 기능까지 할 수 있지만 과부하 방지를 위해 분리한다.

 

클라이언트 -> 웹서버 -> WAS -> DB

 

WAS는 애플리케이션 로직만 전담하게된다.

그래서 정적 리소스가 많이 사용되면 웹서버 증설,

애플리케이션 리소스가 많이 사용되면 WAS 증설 하면된다.

 

 

서블릿

 

웹브라우저가 생성한 요청 HTTP 메시지와 응답 메시지를 편리하게 사용하게 도와준다.

그래서 개발자는 핵심 비즈리스 로직만 개발하면 된다.

 

정리

 

HTTP 요청시

  • WAS는 Request, Response 객체를 새로 만들어서 서블릿 객체를 호출한다.
  • 개발자는 Request 객체에서 HTTP 요청정보를 편리하게 꺼내 사용한다.
  • 개발자는 Response 객체에서 HTTP 응답정보를 편리하게 꺼내 사용한다.
  • WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성한다.

 

서블릿 컨테이너

  • 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.
  • 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리한다.
  • 서블릿 객체는 싱글톤으로 관리한다. (공유변수 사용을 주의해야한다.)
  • JSP도 서블릿으로 변환되어서 사용된다.

 

 

멀티 쓰레드

 

WAS에서 서블릿 객체를 호출하는데, 서블릿 객체는 누가 호출할까?

-> "쓰레드"

 

쓰레드

쓰레드는 애플리케이션 코드를 하나하나 순차적으로 실행한다.

 

 

 

다중요청 처리

쓰레드를 쓰레드풀에 여러개 만들어놓고 여러 요청이 왔을때 쓰레드를 할당한다.

 

 

 

장점

  1. 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내사용하기 때문에 쓰레드 생성, 종료비용이 발생하지 않는다.
  2. 서버가 대응 가능할만큼 쓰레드를 만들어놓으면 쓰레드보다 더 많은 요청이 왔을때 요청을 거절하거나 쓰레드 대기를 걸어둘 수 있다.

 

 

실무 팁

  • WAS의 주요 튜닝 쓰레드는 최대 쓰레드 수 이다.
    - 낮게 설정시 : 동시요청이 많을 때 서비스 장애가 난다.
    - 높게 설정시 : CPU 메모리 리소스 임계점 초과가 날 수 있다.
  • 장애 발생시
    - 클라우드면 일단 서버부터 늘리고 이후에 튜닝한다.
    - 클라우드가 아니면 열심히 튜닝한다.

 

 

 

쓰레드 풀 적정 숫자 찾기

  • 애플리케이션 로직의 복잡도, CPU, 메모리, IO 리소스 상황에 따라 결정한다.
  • 성능테스트를 최대한 실제 서비스와 유사하게 시도한다.

 

 

 

핵심

  • 개발자는 싱글 쓰레드 프로그래밍을 하듯이 편리하게 소스코드를 개발하면 된다.
  • 하지만 멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 주의해서 사용한다.

 

 

 

 

백엔드 개발자는

  1. 정적페이지(파일)
  2. 동적 HTML
  3. HTTP API

이 세가지를 어떻게 클라이언트에 제공할지를 고민해야한다.

 

 

 

 

 

CSR (Client Side Rendering) - 클라이언트 사이드 렌더링

  1. HTML을 요청한다. - 빈HTML과 자바스크립트 링크를 응답한다.
  2. 자바스크립트를 요청한다. - 자바스크립트 클라이언트 로직, HTML 렌더링 코드를 응답한다.
  3. HTTP API를 요청한다. - JSON 데이터를 응답한다.
  4. 자바 스크립트로 HTML 결과를 렌더링한다.