웹 서버 (Web Server)
HTTP 기반으로 동작하며 정적 파일, HTML, CSS, JS, 이미지, 영상 등의 정적 리소스를 제공한다.
클라이언트가 HTTP 프로토콜을 통해 웹 서버에 이러한 리소스를 요청하게 되면 웹 서버가 제공하는 형식!
웹 애플리케이션 서버 (Web Application Server)
웹 서버 기능을 포함하며 추가적으로 프로그램 코드를 통해 애플리케이션 로직을 수행 가능하다.
ex) 동적 HTML, HTTP API(JSON), 서블릿, JSP, MVC
웹 시스템 구성 - ( Web, WAS, DB)
(클라이언트) --> (WebServer) --> (WAS) --> (DB)
클라이언트의 요청 중 일반적인 정적 리소스들은 웹 서버에서 처리를 한다. 추가로 애플리케이션 같은 동적인 처리가 필요할 경우에 WAS를 요청한다. 그 이유는
- WAS만 사용하게 되면 애플리케이션 로직의 오류와 같은 상황에서 오류 화면과 같은 등 아무런 웹페이지를 제공할 수 없기 때문이다.
- 효율적인 리소스 관리
- 정적 리소스가 많이 활용되면 WebServer 증설
- 동적 리소스가 많이 활용되면 WAS 증설
서블릿
HTTP 요청을 받았을 때
- WAS는 Request, Response 객체를 새로 만들어서 서블릿 객체를 호출한다.
- 개발자는 Request 객체에서 HTTP 요청 정보를 꺼내서 사용
- 개발자는 Response 객체에서 HTTP 응당 정보를 입력
- WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성
동시 요청 - 멀티 스레드
스레드란?
- 애플리케이션 코드를 하나하나 순차적으로 실행하는 것이며 스레드가 없다면 자바 애플리케이션이 실행 불가능하다.
- 스레드는 한 번에 하나의 코드 라인만 수행하므로 동시 처리가 필요하면 스레드를 추가로 생성해야 한다.
따라서 클라이언트의 요청이 두 개 이상이 될 경우에 스레드가 하나라면 오류가 생길 수 있다. 요청마다 스레드를 생성하면 이러한 문제가 해결되지만 단점이 있다.
- 스레드는 생성 비용이 매우 비싸다. ( 요청이 많아지면 응답속도가 늦어짐 )
- 콘텍스트 스위칭 비용이 발생한다. ( 코드를 스레드가 실행하고 다음 줄로 넘기는 것 )
- 스레드 생성에 제한이 없다. ( 과부하의 위험 )
스레드 풀
스레드를 미리 풀 안에 여러 개 생성해두어 요청에 따라 사용, 반납할 수 있도록 한다. ( Tomcat Max Connection : 200 )
- 최대 스레드가 모두 사용 중이어서 스레드 풀에 스레드가 없다면, 기다리는 요청을 거절하거나 특정 숫자만큼만 대기하도록 설정할 수 있으며 최대치가 있기 때문에 많은 요청이 들어와도 기존 요청을 안전하게 처리할 수 있다.
- 이는 스레드를 생성하고 종료하는 비용 절약과 응답 시간을 빠르게 할 수 있다.
최대 스레드(Max thread) 수
- 이 값이 너무 작다면!?
CPU 자원이 낭비된다. 다른 요청들이 계속해서 쌓이게 되며 장애가 생길 수 있다. - 이 값이 너무 높다면!?
동시 요청이 너무 많아버리면 메모리 리소스 임계점 초과로 장애가 생긴다.
애플리케이션 로직의 복잡도, CPU, 메모리, IO 리소스 상황에 따라 다르기 때문에 성능 테스트 후에 적정한 숫자를 설정해 주어야 한다.
WAS의 멀티 스레드 지원 기능 덕분에 개발자는 멀티 스레드 관련 코드를 신경 쓸 필요 없다.
※ 주의 : 싱글톤 객체(서블릿, 스프링 빈) 은 주의해서 사용하여야 한다. 멤버 변수가 스레드마다 공유되는 점.
HTTP API [ 데이터 ]
주로 JSON 형태로 데이터를 통신한다. 데이터만 주고 받는 형식
- 웹 클라이언트 to 서버
앱 클라이언트 or 웹 브라우저에서 JS를 통한 HTTP API 호출 - 서버 to 서버
ex) 주문서버 -> 결제서버
SSR과 CSR
- SSR - 서버 사이드 렌더링
주로 정적인 화면에 사용되며 HTML 최종 결과를 서버에서 만들어서 웹 브라우저에 전달
JSP, Thymeleaf -> 백엔드 개발 - CSR - 클라이언트 사이드 렌더링
HTML 결과를 자바스크립트를 사용해 웹 브라우저에서 동적으로 생성해서 적용
React, Vue.js -> 프론트엔드 개발