Spring MVC - 웹 애플리케이션 이해
1. 웹 서버(Web Server)
- HTTP 기반으로 동작
- 정적 리소스 제공
- 정적(파일) HTML, CSS, JS, 이미지, 영상
- 예) NginX, 아파치
2. 웹 애플리케이션 서버(WAS - Web Application Server)
- HTTP 기반으로 동작
- 웹 서버 기능을 포함
- 프로그램 코드를 실행해서 애플리케이션 로직 수행
- 동적 HTML, HTTP API(JSON)
- 서블릿, JSP, 스프링 MVC
- 예) 톰캣
3. WAS vs Web Server
둘의 관계는 모호하기 때문에 간략하게 구분하자면, 웹 서버는 정적 리소스 파일을 제공하는 서버이고, WAS는 웹서버가 하는 일 + 애플리케이션 로직(db 연결, 동작 수행, 데이터 제공 등등)까지 제공하는 서버입니다.
자바 진영에서는 서블릿 컨테이너 기능을 제공하면 WAS라고 합니다.
보통은 웹 시스템이 위와 같이 구성됩니다.
정적 리소스는 웹 서버가 처리하고, 웹 서버는 애플리케이션 로직같은 동적인 처리가 필요하면 WAS에 요청을 위임합니다.
WAS는 중요한 애플리케이션 로직을 전담하게 됩니다.
4. 서블릿
웹 애플리케이션 서버(WAS)는 그림의 왼쪽부분을 모두 구현해야 합니다.
하지만 개발자가 이 모든 내용 구현하기는 매우 힘들고, 실질적으로 의미있는 로직은 초록색 박스 표시부분 입니다.
이 문제때문에 서블릿 이 등장합니다.
서블릿은 그림의 왼쪽부분에서 초록색 박스부분을 제외한 모든 것을 자동화해줍니다.
현재 우리가 Spring에서 사용하는 내장 톰캣 서버가 서블릿은 지원하는 WAS입니다.
예시
urlPattern의 URL이 호출되면 서블릿 코드가 실행됩니다.
개발자는 HTTP 요청과 응답 정보를 편리하게 HttpServletRequest, HttpServletResponse를 이용하여 사용 가능합니다.
서블릿 컨테이너
서블릿을 지원하는 WAS 안에는 서블릿 컨테이너가 존재합니다.
서블릿 컨테이너는 서블릿 객체를 자동으로 생성하주고, 초기화, 호출, 종료하는 생명주기를 관리합니다.
서블릿 객체는 싱글톤 으로 관리됩니다.
따라서 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용하게 됩니다.
동작 과정
- URL 요청
- WAS는 URL 요청을 기반으로 Request, Response 객체를 새로 생성하고 서블릿 객체 호출
- 개발자는 Request 객체를 꺼내서 사용하고, Response 객체를 사용하여 응답 정보 입력
- WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성하고 반환
멀티 쓰레드
WAS 는 동시 요청을 위한 멀티 쓰레드 처리를 지원합니다.
- 특징
- 필요한 쓰레드를 쓰레드 풀에 보관하고 관리합니다.
- 쓰레드 풀에 생성 가능한 쓰레드 최대치를 관리하는데 톰캣은 최대 200 개를 기본 설정으로 갖고 있습니다.(변경 가능)
- 사용
- 쓰레드가 필요하면, 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내서 사용합니다.
- 사용을 종료하면 쓰레드 풀에 해당 쓰레드를 반납합니다.
- 최대 쓰레드가 모두 사용중이라면 기다리는 요청에 대해서는 거절하거나 대기 시킬 수 있습니다.
- 장점
- 쓰레드가 미리 생성되어 있으므로, 쓰레드를 생성하고 종료하는 비용이 절약되고 응답 시간이 빠릅니다.
- 생성 가능한 쓰레드의 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있습니다.
실무 팁
WAS의 주요 튜닝 포인트는 최대 쓰레드(Max Thread)수 입니다.
동시 요청이 많을 때 이 값을 너무 낮게 설정하면, 서버 리소스는 여유롭지만 클라이언트는 응답이 지연되게 됩니다.
반대로 값을 너무 높게 설정하면 CPU, 메모리 리소스 임계점 초과로 서버가 다운됩니다.
따라서 적정값을 찾는게 가장 중요한데, 클라우드라면 일단 서버를 늘리고 이후에 튜닝하도록 하고 아니라면 평상시에 열심히 튜닝해야 합니다.
쓰레드 풀의 적정 숫자는 상황에 따라 다 다르기 때문에 성능 테스트를 통해 적정 숫자를 찾아야 합니다.
본 포스팅은 인프런 김영한님의 ‘스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술’ 강의를 듣고 정리한 내용을 바탕으로 복습을 위해 작성하였습니다. [강의 링크]