
클라이언트-서버 모델에서 클라이언트와 서버간의 요청과 응답을 규정하는 규약.
대표적인 특징으론 statless라는 점이다. 각 요청은 독립적이며 서버는 이전 요청에 대한 정보를 유지하지 않는다.
URL을 통해 특정 리소스에 접근할 수 있으며 URL은 서벗에서 리소스의 특정 위치를 나타낸다.
HTTP 요청에 응답하여 정적 데이터 (이미지, 파일, 텍스트 등)를 클라이언트에 제공하며, IIS(Window 전용 웹서버), Nginx 등이 포함된다.
알고리즘, DB 조회, 비즈니스 로직 등을 처리하여 동적 컨텐츠를 제공한다.
웹 서버와 웹 컨테이너 로 구성된다.
Spring 은 독립 실행형 애플리케이션을 만들기 위해 애플리케이션 서버(Apache Tomcat)를 내장하고 있고, 따라서 스프링 서버라함은 일반적으로 스프링에 내장된 WAS를 지칭한다.
웹 컨테이너란?
동적인 데이터를 처리하여 정적인 데이터로 생성해주는 소프트웨어 모듈
서블릿과 JSP를 실행하는 환경을 제공하며, 서블릿 컨테이너라고도 불린다.
서블릿이란 동적 웹 페이지를 만들 때 사용되는 자바 기반의 웹 어플리케이션 프로그래밍 기술이다.
서블릿은 웹 요청과 응답의 흐름을 간단한 내장 메서드의 호출만으로 체계적으로 다룰 수 있게 해준다.
서블릿 컨테이너가 서블릿 객체를 생성하고 관리하며, 이는 WAS에 포함되어 있다.
서블릿 또한 자바 클래스이므로 초기화부터 소멸까지 생명주기 과정을 거치며, 싱글톤으로 관리된다.
요청이 들어올 시 서블릿 인스턴스가 메모리에 존재하지 않으면 서블릿 컨테이너는 해당 서블릿을 로드하고 init() 메소드를 통해 초기화한 후 적재한다.
이미 서블릿 인스턴스가 존재하면 service() 메소드를 통해 요청에 대한 응답이 doGet(), doPost()로 나뉘어 response가 생성된다.
컨테이너가 서블릿을 종료시킬때에는 destroy()를 통해 종료된다.
서블릿 컨테이너와 WAS는 종종 혼용되어 사용되지만 약간의 차이점이 있다.
Web Server와 Web Container(Sevlet Container)를 합친 것이 WAS이며,
서블릿 컨테이너는 서블릿 클래스를 관리하며 HTTP 요청에 따라 HttpServletRequest, HttpServletResponse 두 객체를 생성하여 post, get여부에 따라 동적인 페이지를 생성하여 응답하는 역할을 한다.
WAS는 수많은 클라이언트 요청을 동시에 처리해야하므로 멀티 쓰레딩을 사용하여 병렬처리한다.
이를 통해 개발자는 멀티 쓰레드 관련 코드를 신경 쓰지 않아도 되며, (마치 싱글쓰레드 프로그래밍 하듯)
서버는 높은 동시성을 유지하면서 많은 수의 사용자 요청을 효율적을 처리할 수 있다.
쓰레드는 생성 비용이 매우 비싸다.
WAS는 미리 생성된 일정 수의 쓰레드를 유지하고 들어오는 요청에 대해서는 사용 가능한 쓰레드를 할당한다.
이를 통해 쓰레드 생성 비용을 줄일 수 있다.
따라서 WAS의 주요 튜닝 포인트는 최대 쓰레드 수가 된다.
너무 낮으면 서버 리소스는 여유롭지만 클라이언트에 대한 응답이 지연될 수 있고, 너무 높으면 동시 요청이 많을 때 임계점 초과로 서버가 다운될 수 있다.