Web Server
Web Server는 HTTP 기반으로 동작하며 정적 리소스를 제공함
Web Server의 구조

WAS (Wep Application Server)
HTTP 기반으로 동작하며 웹 서버의 기능을 포함한다.
추가적으로 코드를 실행해서 Application 로직을 수행하고 DB와 상호작용하여 동적 컨텐츠를 생성한다.
WAS의 구조

Web Server와 WAS의 차이점
- Web Server도 Application 로직을 포함할 수 있음
- WAS는 Application 코드를 실행하는 것에 더욱 특화됨
- Java에서는 Servlet Container 기능을 제공하면 WAS 이다.
Web System 구조
Web Server, WAS를 활용해서 Web System을 효율적으로 구성하는 방법을 알아보자.
WAS만 사용하여 구성

- WAS가 너무 많은 역할을 담당함
- Application 로직이 정적 리소스로 인해 수행되지 않을 수 있음
- WAS에 장애가 생기면 아무런 화면도 보여주지 못함
실제 Web System의 구성

- 정적 리소스는 Web Server에서 처리함
- Web Server는 Application 로직이 필요한 요청만 WAS에 전달함
장점
- 효율적으로 리소스를 관리할 수 있음
- 정적 자원이 많이 사용되면 Web Server를 Scale Out함
- Application의 자원이 많이 사용되면 WAS를 Scale Out함
- 오류 화면을 제공할 수 있음
- Web Server는 오류가 발생할 확률이 아주 낮음
- WAS는 오류가 발생할 확률이 아주 높고, 자주 장애가 발생함
- WAS는 DB와 상호작용하기 때문에 DB에 문제가 생겨도 WAS에서 문제가 발생함
Servelt
Servlet은 HTTP 프로토콜 기반 요청(Request) 및 응답(Response)을 처리하는데 사용된다.
쉽게 말해 Java에서 Request, Response를 쉽게 다루게 해주는 객체이다.
JAVA에서 Sevlet은 HttpServlet 클래스를 상속받아 구현되며, 웹 애플리케이션 개발의 핵심 기술 중 하나이다.
Servlet의 역할
POST /api/users HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
(Empty Line)
userId=아이디&pssword=비밀번호
HTTP/1.1 200 OK
Content-Type: text/html;charset=UTF-8
Content-Length: 3423
(Empty Line)
<html>
<body>
...
</body>
</html>
서버에서 처리할 작업
- 서버와 TCP/IP 연결
- HTTP Request Message 필요한 형태로 변환하여 읽기
- HTTP Method 및 URL 분석
- HTTP Header 분석
- HTTP Message Body 읽기 및 변환
- 분석한 결과를 통해 프로세스 실행
- 비지니스 로직 실행
- HTTP Response Message 생성
- HTTP Start Line 생성
- Header 생성
- HTTP Message Body에 응답 데이터를 요청한 형식에 맞춰 응답
- 처리가 불가하다면 예외처리
- 응답 전달
- 연결 종료
- Servelt을 지원하는 WAS를 사용한다면?
- 1~3번, 5~7번의 과정을 할 필요 없이
비즈니스 로직 에만 집중하면 됨
Servelt 동작 순서
HTTP 프로토콜 기반 요청 및 응답을 처리해주는 Servlet은 어떤 순서로 동작하는지 알아보자.
예시 코드
- URL(
/example)이 호출되면 service() 메소드가 실행됨
@WebServlet(name="ExampleServlet", urlPatterns = "/exmaple")
public class ExampleServlet extends HttpServlet {
@Override
protected void service(
HttpServletRequest request,
HttpServletResponse response
) {
}
}
동작 순서

- WAS는 HTTP 요청 메세지를 기반으로 새로운 Request, Response 객체 생성
- WAS는 만들어진 Request, Response 객체를 서블릿 컨테이너에 넘겨주며 ExampleServlet 객체 호출
- ExampleServlet에서 비지니스 로직 처리
- 응답에 필요한 정보를 개발자가 입력
- WAS는 Response 객체 정보(개발자가 입력한 정보)로 HTTP 응답 메세지 생성
- 여기서 우리가 하는 일
- Request 객체에 담겨져있는 HTTP 요청 정보를 꺼내서 사용한다.
- 요청 정보(URL, Method, Message Body)를 통해 필요한 기능(비지니스 로직)을 수행한다.
- 생선된 Response 객체에 HTTP 응답 정보를 입력한다.
Servlet Container
Servlet을 지원하는 WAS 내부에는 서블릿 컨테이너가 있다.
서블릿 컨테이너는 서블릿을 초기화, 생성, 관리, 호출, 종료하는 역할을 수행한다.
Servlet 객체를 싱글톤으로 관리한다.
Servlet의 생명주기
- Servlet은 서블릿 컨테이너가 생성 및 관리한다.
- WAS(서블릿 컨테이너 포함)가 종료될 때 Servlet도 함께 종료된다.
Servlet 객체 생성시점
- 개발자가 직접 인스턴스화 하여 사용하는것이 아닌, 코드만 작성하면 서블릿 컨테이너가 생성한다.

@WebServlet(name="ExampleServlet", urlPatterns = "/example")
public class ExampleServlet extends HttpServlet {
@Override
protected void service(
HttpServletRequest request,
HttpServletResponse response
) {
}
}
@WebServlet(name="Example2Servlet", urlPatterns = "/example2")
...
Servelt Container는 무슨 일을 하는가?
- 서블릿을 초기화, 생성, 관리, 호출, 종료하는 역할을 수행한다.
- 동시 요청에 대한 처리를 위해
Multi Thread 를 지원한다.
Multi Thread
싱글 쓰레드로 사용했을 때 여러 개의 요청이 들어오면 두 번째 요청은 첫 번째 요청이 끝날 때까지 계속해서 대기해야 한다.
WAS는 동시 요청 처리를 위해 멀티 쓰레드를 지원한다.
- 개발자가 Multi Thread 관련 코드는 고려하지 않아도 된다.
- Multi Thread 환경이므로 싱글톤 객체(Servlet, Spring Bean)는 주의해서 사용해야한다.
→ 공유변수 사용 조심 또 조심!
동시 요청 처리 방법
1. 요청마다 새로운 쓰레드 생성

- 요청이 들어올 때마다 쓰레드 생성
- 요청 처리가 완료되면 쓰레드 종료
- 장점
- 동시 요청을 처리할 수 있음
- 하나의 쓰레드에 문제가 발생해도 나머지 쓰레드는 정상 동작함
- 단점
- 쓰레드 생성에 제한이 없고, 생성 비용이 높음
- 동시 요청이 많을 때 리소스 부족으로 서버가 다운될 수 있음
- 문맥 교환 비용이 발생함
2. Thread Pool

- Thread는 Thread Pool에 보관 및 관리한다.
- Thread Pool에 생성 가능한 Thread 최대치를 관리한다. Tomcat은 최대 200개 기본 설정이 되어있다.(변경 가능)
- 성능테스트를 통해 적정 Thread 수를 찾으면 된다.
- 장점
- 요청 마다 Thread를 생성하는 단점을 보완하였다.
- Thread가 미리 생성되어 있어서 Thread를 생성, 종료하는 비용이 절약된다. → 응답이 빠름
- 생성 가능한 Thread 최대치가 제한되어 있어서 많은 요청이 들어와도 안전하게 처리할 수 있다.
- 단점
- Thread Pool의 최대 Thread 수를 낮게 설정한다면 응답이 지연된다.
- 최대 Thread 수가 너무 높으면 즉, 요청이 많아지면 리소스 부족으로 서버가 다운된다.
SSR (Server Side Rendering)
서버에서 동적으로 HTML을 만들어 클라이언트에게 제공하는 기술로 백엔드 개발자 영역에 속한다.
Java에서는 JSP, Thymeleaf가 대표적으로 사용된다.
서버에서 동적인 페이지를 완성하여 응답한 결과물을 브라우저에 출력한다.
SSR 동작 흐름

- 서버(WAS)에 HTML을 요청한다.
- 서버(WAS)에서 로직을 거친 후 DB를 조회한다.
- 조회 결과를 기반으로 HTML을 동적으로 생성한다.
- 생성된 HTML을 응답한다.
장점
- 초기 페이지 로드 시 서버에서 완전히 렌더링된 HTML을 반환하여 첫 페이지 로딩이 빠르다.
- 검색 엔진 크롤러가 완전한 HTML을 즉시 수집할 수 있어
SEO 에 유리하다.
SEO(Search Engine Optimization)란?
검색 엔진에서 상위에 노출될 수 있도록 최적화하는 과정을 말한다.
단점
- 모든 요청에 대해 서버가 페이지를 렌더링해야 하므로, 높은 트래픽 상황에서 서버의 부하가 크게 증가할 수 있다.
- 초기 페이지 이외의 페이지들도 렌더링 후 반환되기 때문에 속도가 느리다.
CSR (Client Side Rendering)
웹 브라우저에서 자바스크립트를 사용해 동적으로 HTML을 생성해서 적용하는 기술로 웹을 모바일 앱 처럼 부분 부분 변경할 수 있게 해준다.
프론트엔드 개발자 영역에 속하는 React, Vue가 대표적으로 사용된다.
HTTP API 통신으로 얻은 결과를 통해 브라우저에서 동적으로 화면을 출력한다.
CSR 동작 흐름

- HTML을 요청한다. 비어있는 HTML을 응답받는다. JS가 존재하는 주소 링크를 응답한다.
- 자바스크립트(클라이언트 로직, 렌더링 포함)를 요청한다.
- HTTP API 요청을 하고 화면에 필요한 데이터를 JSON 형태로 응답받는다.
- 응답받은 JSON 데이터로 HTML을 동적으로 그린다.
장점
- 클라이언트 측에서 렌더링하므로 사용자 인터랙션에 빠르게 반응할 수 있음
- 초기 로딩 후에는 서버와의 통신 없이 빠르게 페이지 간 전환이 가능합니다.
단점
- 초기 로딩 시 필요한 모든 자바스크립트 파일을 다운로드하고 실행해야 하므로, 초기 로딩 시간이 길다.
- 검색 엔진 크롤러가 자바스크립트를 제대로 실행하지 못하면 SEO에 불리할 수 있다.
참고자료
Spring 입문 - 1주차
- Web Application 1강
- Web Application 2강
- Web Application 3강
- Web Application 4강