웹 서버, 웹 애플리케이션 서버
웹 서버(Web Server)
- HTTP 기반으로 동작
- 정적 리소스(정적 HTML, CSS, JS, 이미지, 영상) 제공
웹 애플리케이션(WAS - Web Application Server)
- HTTP 기반으로 동작
- 웹 서버 기능 포함(정적 리소스 제공)
- 프로그램 코드를 실행해 애플리케이선 로직 수행
--> 동적 HTML, HTTP API, 서블릿, JSP, 스프링 MVC
- 톰캣(Tomcat)
둘의 경계가 모호하지만, WAS는 애플리케이션 코드를 실행하는데 더 특화되어 있다.
웹 시스템 구성 - WEB,WAS, DB

- 웹 서버는 정적 리소스를 처리, WAS는 중요한 애플리케이션 로직 처리
--> 효율적인 리소스 관리
- WAS, DB 장애가 발생하면, 웹 서버가 오류 화면을 제공할 수 있다.
서블릿
HTTP 요청이 왔을 때, 의미있는 비지니스 로직을 제외하고, 나머지 업무들을 서블릿을 지원하는 WAS가 처리해준다.

간단한 서블릿 관련 코드 
- urlPatterns : url("/hello")가 호출되면서 서블릿 코드가 실행
- HttpServletRequest : HTTP 요청 정보 편리하게 사용
- HttpServletResponse: HTTP 응답 정보 편리하게 사용
서블릿 HTTP 요청, 응답 흐름
- HTTP 요청시, WAS Request, Response 객체를 새로 만들어서 서블릿 객체를 호출
- Request 객체에서 HTTP 요청 정보와, Response 객체에 HTTP 응답 정보를 편리하게 사용
- WAS가 Response 객체에 담겨있는 내용으로 HTTP 응답 정보 생성

서블릿 컨테이너
- 서블릿을 지원하는 WAS
- 서블릿 객체를 생성, 초기화, 호출, 생명 주기 관리
- 싱글톤으로 관리 ( 요청마다 생성이 이루어지면 비효율적, 최초 로딩 시점에 미리 만들어서 재활용한다 --> 모든 고객 요청은 동일한 서블릿 객체 인스턴스 접근)
- request, response 객체는 항상 새로 생성
- 멀티 쓰레드 처리 지원
멀티 쓰레드
쓰레드(Thread)
- 어플리케이션 코드를 하나 하나 순차적으로 실행(하나의 코드 라인만 수행)
- 자바 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행
- 쓰레드가 없으면, 자바 어플리케이션 실행 불가능
- 동시 처리가 필요하면, 쓰레드 추가 생성
쓰레드 생성의 비용이 매우 비싸며, 요청마다 쓰레드를 생성하게 되면, 응답 속도가 느려지고, 너무많은 요청이 오면 CPU, 메모리 임계점이 넘어서 서버가 죽을 수 있다.
--> 이를 해결 하기 위해 쓰레드 풀을 사용한다
쓰레드 풀
필요한 쓰레드를 미리 생성해서 쓰레드 풀에 보관하고 관리한다.

쓰레드 풀에 쓰레드를 미리 생성해두고 쓰레드를 사용하고 반납하고 형태로 사용한다.
⇒ 동시요청허용갯수를 정해둔 것과 같다. (생성해둔 쓰레드 수)
⇒ 일정 수 이상을 넘으면 쓰레드 [대기] 또는 [거절]로 처리한다. (tomcat은 최대 200개 기본)
WAS 주요 튜닝 포인트는 최대 쓰레드(Max Thread) 수
- 낮게 설정 시, 서버 리소스가 여유로운 반면 클라이언트는 적은 요청에도 지연응답
- 높게 설정 시, CPU, 다수의 요청 시 메모리 리소스 임계점 초과로 서버 다운될 수 있음.
쓰레드가 미리 생성되어 있어, 쓰레드를 생성하고 종료하는 비용과 시간이 절약된다. 생성 가능한 쓰레드의 최대치가 있으므로 너무 많은 요청이 들어와도 안전하게 처리할 수 있다.
멀티 쓰레드에 대한 부분은 WAS가 처리하며, 싱글 쓰레드 프로그래밍을 하듯이 편리하게 소스 코드를 개발하면 된다.
HTML, HTTP API, CSR, SSR
HTML
- 정적 리소스 : 웹 서버에 요청하여 HTML파일, CSS, JS, 이미지, 영상 등을 제공
- HTML 페이지 : WAS에 요청하여 DB에 조회한 정보를 동적으로 HTML 파일을 생성해 JSP, 타임리프를 통해 제공
HTTP API
- WAS에 요청하여 DB에 조회한 정보를 HTML이 아니라 JSON 형식의 데이터를 전달
- 데이터만 주고 받아서 UI 화면이 필요하면, 클라이언트가 별도로 처리
EX) {"주문번호": 100, "금액": 5000}
CRS - 클라이언트 사이드 렌더링
- HTML 결과를 자바스크립트를 사용해 웹 브라우저에 동적으로 생성해서 적용
- 주로 동적인 화면에 적용
SSR - 서버 사이드 렌더링
- 서버에서 최종 HTML을 생성해서 클라이언트에 전달
- 주로 정적인 화면에서 사용
- JSP, 타임리프 사용
자바 백엔드 웹 기술 역사
에노테이션 기반의 스프링 MVC
스프링 부트의 등장(스프링을 더 편리하게 사용할 수 있게 해줌)
- 서버를 내장(톰캣)
→ 스프링 부트는 빌드결과(Jar)에 WAS서버가 포함됨 → 빌드 배포가 단순화됨
자바 뷰 템플릿 역사(HTML 생성 뷰 기능)
- 타임리프
내추럴 템플릿: HTML 모양을 유지하면서 뷰 템플릿 적용 가능(html 태그에서 사용하므로 깔끔)
스프링 MVC와 강력한 기능 통합