웹 세상에서는 모든 데이터를 HTTP를 통해서 주고 받는다.
웹 서버란? HTTP 기반으로 동작하며, 정적 리소스 제공, 기타 부가 기능을 제공하며 관련된 서버로는 nginx, apache가 있다.


웹 애플리케이션 서버(WAS)란 ? HTTP 기반으로 동작하며, 웹 서버의 기능 + 정적 리소스 제공이 가능하다. 
프로그램 코드를 실행해서 애플리케이션 로직을 수행하며, 관련된 서버로는 톰캣, Jetty, Undertow가 있다.


웹 서버 vs 웹 애플리케이션 서버(WAS)
정적 리소스 vs 애플리케이션 로직을 실행이 가장 큰 차이며 경계가 모호하기 때문에 애플리케이션 로직에 특화되어 있다 라고 하면 WAS라고 생각하면 된다.

 


웹 시스템 구성

2계층(WAS, DB)으로 구성이 될 때, WAS가 너무 많은 역할을 담당하여 서버에 과부하가 우려된다.
비싼 애플리케이션 로직이 정적 리소스 때문에 수행이 어려울 수 있어서 구분이 필요하다.

이로 인해 3계층(WEB, WAS, DB) 구조를 사용하며, 정적 리소스 -> WEB / 애플리케이션 로직 -> WAS에 요청하여 처리한다.
필요에 따라 WEB 서버 / WAS 서버를 증설하여 효율적인 리소스를 관리할 수 있다. 

 

서블릿

HTTP 통신을 하기 위해 소켓 연결/종료, HTTP 요청 메시지 파싱, 응답 메시지 생성 등을 지원하는 프로그래밍 기술이다.
이를 통해 백엔드 개발자는 의미 있는 비즈니스 로직에 집중할 수 있다. 

HTTP 요청 시에 아래 과정을 수행한다. 

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


서블릿 컨테이너

톰캣 처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.

서블릿 컨테이너의 특징

  • 서블릿 객체를 생성,초기화, 호출, 종료하는 생명주기를 관리
  • 서블릿 객체를 싱글톤으로 관리
  • 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용
  • 모든 사용자가 공유하기 때문에 공유 변수 사용에 주의해야함
  • JSP도 서블릿으로 변환되어서 사용함
  • 동시 요청을위한 멀티 쓰레드 처리를 지원한다.



쓰레드 

자바의 코드를 실행하는 작업 단위이며, 쓰레드가 없다면 자바 애플리케이션 실행이 불가능하다. 
1개의 쓰레드는 1개의 명령어만 실행 가능하며, 동시 처리가 필요하다면 쓰레드를 추가로 생성해야한다.
동시에 처리하기 위해 요청 마다 쓰레드를 생성하여 사용한다면 동시에 여러 요청을 독립적으로 처리할 수 있고, 리소스가 허용할 때까지 처리가 가능하다. 
하지만 쓰레드의 생성 비용은 매우 비싸기 때문에 쓰레드 초기화 시간으로 많은 시간이 할당되고, 쓰레드 생성에 제한이 없다면 서버가 과부화가 걸릴 수 있다.

이러한 단점을 보완하기 위해 쓰레드 풀이라는 개념이 나왔다.
필요한 쓰레드를 쓰레드 풀에 보관하고 관리하며, 생성 가능한 최대치를 관리한다. (톰캣 기본 설정은 최대 200개)

사용 방식

  1. 쓰레드가 필요하면, 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내서 사용
  2. 사용을 종료하면 쓰레드 풀에 해당 쓰레드를 반납
  3. 사용할 수 있는 쓰레드가 없다면 기다리는 요청을 거절하거나 대기 요청 수를 설정할 수 있음


장점 

  • 쓰레드가 미리 생성되어 있으므로, 쓰레드를 생성하고 종료하는 비용이 절약되고, 응답이 빠름
  • 최대치가 설정되어 있기 때문에 많은 요청이 와도 기존 요청에 대해서는 안전하게 처리 가능하다.


실무 팁

  • WAS의 주요 튜닝 포인트는 최대 쓰레드 수이다.
    • 너무 낮으면 동시 요청이 많은 경우 서버 리소스는 여유롭지만, 클라이언트는 응답 지연 발생 가능
    • 너무 높으면 동시 요청이 많은 경우 CPU, 메모리 리소스 임계점 초과로 서버 다운 
  • 적정 숫자를 찾는 방법 - 아파치 ab, 제이미터, ngrinder 등 테스트 도구를 사용

→ WAS가 멀티 쓰레드를 지원하며, 개발자는 멀티 쓰레드 관련 코드를 신경쓰지 않아도된다. 



리소스 제공 방식

  • 정적 리소스 - 고정된 HTML 파일, CCS, JS, 이미지, 영상 등을 제공
  • HTML 페이지 - 동적으로 필요한 HTML 파일을 생성해서 전달
  • HTTP API - json 형태로 데이터만 주고 받으며 화면 필요 시 클라이언트가 별도 처리
    • UI 클라이언트 접점
      • 앱 클라이언트 - 아이폰, 안드로이드, PC 앱
      • 웹 브라우저 - 자바스크립트를 통한 HTTP API 호출
      • 웹 클라이언트 - React, Vue.js
    • 서버 to 서버 
  • SSR(서버 사이드 렌더링) - 서버에서 최종 HTML를 만들어서 웹 브라우저에 전달하며, 주로 정적인 화면에서 사용
  • CSR(클라이언트 사이드 렌더링) - HTML 결과를 자바스크립트를 통해 웹 브라우저에서 동적으로 생성해서 적용 (구글 지도, Gmail, 캘린더 등)

+ Recent posts