웹서버와 WAS는 보통 정적 리소스와 동적 리소스 제공의 차이로 구분된다.
사실, 웹서버와 WAS의 용어 및 경계는 매우 모호하다.
Java의 경우, Servlet Container를 제공하면 이를 WAS로 볼 수 있다.
WAS만 사용하게 된다면 WAS가 너무 많은 역할을 담당하게 된다.
WAS에서 정적 리소스 처리보다 더 중요한 작업은 보통 애플리케이션 로직 수행이다.
WAS가 정적 리소스 처리와 동적 리소스 처리를 모두 담당할 경우,
WAS에 장애가 발생했을 때 오류 화면조차 노출되지 않을 수 있다.
보통은 웹 서버를 WAS 앞단에 두어 함께 사용한다.

이렇게 구성하면:
1. 정적 리소스 요청이 많은 경우, 웹 서버를 증설.
2. 애플리케이션 로직 요청이 많은 경우, WAS를 증설.
단독으로 WAS나 웹서버가 모든 역할을 담당할 경우:
- 정적 리소스 요청만 많은 상황에서도 서버를 증설해야 하므로 리소스 낭비가 발생한다.
위와 같은 시스템을 구성하면:
왼쪽 상자의 경우 서버-클라이언트의 통신 흐름을 보여준다. HTTP로 통신하기 때문에 HTTP스펙에 맞게 요청 메시지를 구성하고 서버로 날려 비즈니스 로직을 처리하고 결과에 따른 응답메세지를 구성하여 클라이언트에게 응답한다.
실제로 HTTP 메시지를 작성하고, 이를 분석하여 내용을 판단하는 작업은 매우 지루하고 번거로운 일이다.
이 작업은 어느 정도 반복성도 존재한다.
이러한 불편함을 해소해주는 것이 바로 Servlet이다.
Servlet의 기능
위 그림의 초록색 상자 부분만 프로그래머가 처리하고,
- 요청은
Request객체로,- 응답은
Response객체로 서블릿이 생성하여 제공한다.
HTTP 메시지를 다루는 번거로운 작업 대신, 프로그래머는:
1. 요청 분석 (Request 활용)
2. 응답 생성 (Response 활용)
을 통해 더욱 간편하게 작업할 수 있다.
백엔드 엔지니어에게 가장 중요한 작업은 비즈니스 로직 작성이다.
사실, 더 우수한 방법이 존재한다.
Spring Web Framework를 사용하면:
Request와 Response를 다루는 작업조차 더욱 자동화되고 효율적으로 처리할 수 있다.스프링 부트를 설치하면 기본적으로 포함되는 Apache Tomcat을 기준으로 아래와 같은 프로세스가 작동한다.
웹 브라우저 요청
톰캣에서 요청 처리
request, response 객체 생성.WAS 처리
request, response를 주입.서블릿 객체 처리
request를 이용한 요청 처리. response를 구성하여 응답 메시지 생성.WAS 응답 송신
response 객체를 통해 응답 메시지를 생성하고, 웹 브라우저로 송신.굵게 표시된 부분
request)의 내용 처리.response) 메시지 구성.따라서 HTTP에 대한 지식은 중요하다.
이런 이해가 있어야만 효율적인 도구를 훌륭하게 사용할 수 있다.
프로그래머는 생략된 과정 속에서 이루어지는 보이지 않는 처리를 이해해야 한다.
서블릿 컨테이너란, Tomcat과 같이 서블릿을 지원하는 WAS를 말한다.
쓰레드는 애플리케이션 코드의 실행 단위를 담당하며, 동시 처리가 필요할 때 추가로 생성될 수 있다.
단일 요청
동시 요청
효율적인 쓰레드 관리가 중요하다:

만약 위의 예시대로 200개의 쓰레드가 모두 사용중인 상황에서 추가 요청이 들어올 경우 요청들은 대기되거나(대기열) 거절된다.
톰캣의 경우 쓰레드 풀의 쓰레드 200개가 기본 설정이다. 디폴트이니 만큼 적당한 수를 잘 설정해준걸까? 아래 문단에서 이를 확인할 수 있다.
실무 최적화 과정에서 가장 효과를 크게 볼 수 있는 작업은
max thread(최대 쓰레드) 값을 적절히 설정하는 것이다.
최대 쓰레드가 너무 낮은 경우
최대 쓰레드가 너무 높은 경우
적절한 쓰레드 수는 상황에 따라 달라진다.
성능 테스트를 통해 적정 값을 찾아야 한다.
테스트를 통해 서버의 자원 사용량, 응답 시간, 처리량 등을 분석하여 최적의 설정값을 도출한다.
서버 사이드 렌더링(Server-Side Rendering)은 HTML 최종 결과를 서버에서 생성하여 웹 브라우저에 전달하는 방식으로, Spring MVC에서는 뷰 템플릿(Thymeleaf, JSP 등)을, Django에서는 템플릿 시스템을 활용하는 MTV 패턴으로 구현된다. 보통 작은 프로젝트에서 많이 사용되며, 동적으로 HTML을 생성하여 전달하는 과정에서 프론트엔드 렌더링 작업까지 백엔드 엔지니어가 처리하는 방식이다.
CSR(Client-Side Rendering)은 서버가 HTML이 아닌 JSON 데이터를 전달하며, React나 Vue.js 같은 프론트엔드 라이브러리가 이를 받아 복잡하고 동적인 UI를 클라이언트에서 렌더링하는 방식이다. 과거에는 SSR(Server-Side Rendering)을 풀스택, CSR을 백엔드로 오해하기도 했지만, SSR도 백엔드 작업의 일환이며 CSR은 전문적으로 프론트엔드의 역할을 강조하는 방식이다. 백엔드 개발자는 JavaScript에 능숙할 필요는 없지만, 동적인 HTML 리소스를 간단히 제공할 수 있는 SSR 능력을 갖추는 것이 중요하다.