1. 웹 애플리케이션의 기본 구성
➡️ 웹 서버(Web Server)
- HTTP 기반으로 동작
- 정적인 리소스(HTML, CSS, JS, 이미지 등)를 클라이언트에게 제공
- ex) Nginx, Apache
단순히 요청받은 정적 파일을 그대로 응답해주는 역할이다.
➡️ 웹 애플리케이션 서버(WAS: Web Application Server)
- HTTP 기반으로 동작
- 동적인 데이터를 생성해 HTML 또는 JSON으로 응답
- 프로그램 코드를 실행해서 애플리케이션 로직 수행
- ex) Tomcat, Jetty
웹 서버 기능을 포함하고 애플리케이션 로직을 실행할 수 있는 서버이다.
➡️ WEB + WAS + DB 구성
실제 대규모 시스템은 웹 서버, WAS, DB가 각각 역할을 나누어 수행한다.
WAS + DB만으로 시스템 구성은 가능하지만 웹 서버는 정적 리소스를 제공하고 복잡한 처리는 WAS로 위임한다면
❗WAS 과부하 우려가 줄고
❗WAS, DB 장애시 WEB 서버가 오류 화면 제공 가능
2. 서블릿
서버는 HTTP 요청을 받으면 아래와 같이 처리해야할 업무가 매우 많다.
하지만 핵심은 초록색 박스가 의미있는 비즈니스 로직이라는 것이다.
이 업무를 대신해주는 것이 바로 서블릿이다.
👉 특징
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse res) {
}
urlPatterns(/hello)의 URL이 호출되면 서블릿 코드가 실행
- HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServletRequest
- HTTP 응답 정보를 편리하게 제공할 수 있는 HttpServletResponse
- 개발자는 HTTP 스펙을 매우 편리하게 사용
👉 HTTP 요청, 응답 흐름
📌서블릿 컨테이너
- 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.
- 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리한다.
- 서블릿 객체는 싱글톤으로 관리된다.
- So, 공유 자원은 주의해야한다.
- 최초 요청 시 서블릿 객체를 생성하고 이후 모든 요청은 해당 객체를 재사용한다.
- 동시 요청을 위한 멀티 쓰레드 처리를 지원한다.
3. 멀티 쓰레드
* 쓰레드는 한번에 하나의 코드 라인만 수행하기 때문에 동시 처리가 필요하면 쓰레드를 추가로 생성해야한다.
그럼 다중 요청 시 요청당 쓰레드를 생성해야할까❓
❌ 아니다!
- 쓰레드 생성/제거 비용과 컨텍스트 스위칭 비용이 발생한다.
- 응답 속도가 느려진다.
- 많은 요청이 오면 CPU, 메모리 임계점을 넘어서 서버가 죽을 수 있다.
➡️ 쓰레드 풀(Thread Pool)의 도입
- 필요한 쓰레드를 풀에 보관하여 필요할 때 꺼내어 사용하고 반납한다.
- 쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리한다. -> 톰캣은 최대 200개 기본 설정(변경 가능)
- 쓰레드 수가 초과되면 요청을 대기시키거나 거절할 수 있다.
- 쓰레드 생성/종료 비용이 절약되고 응답 시간도 빠르다.
- 최대치가 있어서 너무 많은 요청이 들어와도 안전하게 처리할 수 있다.
🌟 실무 Tip
- WAS의 주요 튜닝 포인트는 최대 쓰레드 (max thread) 수이다!
- 이 값을 너무 낮게 설정하면 -> 동시 요청 많을 시 응답이 지연되고
- 이 값을 너무 높게 설정하면 -> 동시 요청 많을 시 CPU, 메모리 리소스 임계점 초과로 서버 다운
- 장애 발생 시
- 클라우드면 일단 서버부터 늘리고 이후에 튜닝
- 클라우드가 아니면 열심히 튜닝
‼️개발자가 멀티 쓰레드 관련 코드를 신경쓰지 않아도 되며 이 부분은 WAS가 처리한다는 것이 핵심이다.
4. HTML, HTTP API, CSR, SSR
👉 정적 리소스
- 고정된 HTML 파일, CSS, JS, 이미지, 영상
👉 HTML 페이지
- 동적 HTML, JSP, 타임리프 등 서버에서 HTML을 동적으로 생성
👉 HTTP API
- HTML이 아니라
JSON 데이터를 주고받는 구조
- 다양한 시스템에서 호출 가능
- 웹 브라우저에서 자바스크립트를 통한 HTTP API 호출
- 앱 클라이언트
- React,Vue.js 같은 웹 클라이언트
- 서버 to 서버 (ex) 주문 서버 -> 결제 서버)
➡️ SSR (서버 사이드 렌더링)
- HTML 최종 결과를 서버에서 만들어 웹 브라우저에 전달
- 주로 정적인 화면에 사용
- 관련 기술 : JSP, 타임리프 -> 백엔드 개발자
➡️ CSR (클라이언트 사이드 렌더링)
- HTML 결과를 자바스크립트를 사용해 웹 브라우저에서 동적으로 생성해서 적용
- 주로 동적인 화면에 사용하고 웹 환경을 마치 앱 처럼 필요한 부분부분 변경 가능
5. 자바 웹 기술 역사
➕ 과거 기술
1997 서블릿 : HTML 생성이 불편
1999 JSP : HTML은 편리하나 비지니스 로직까지 너무 많은 역할 담당
- 서블릿, JSP 조합 MVC 패턴 사용 : 모델, 뷰 컨트롤러로 역할 나누어 개발
2000 MVC 프레임워크 춘추전국시대 : Spring MVC(과거버전), Struts 등
➕ 현재 기술
- 애노테이션 기반의 스프링 MVC 등장
- Spring Boot 등장 -> 서버 내장, Jar로 빌드 배포 단순화
➕ 최근 기술
- Web Servlet - Spring MVC
- Web Reactive - Spring WebFlux
- 비동기 넌 블러킹 처리/ 최소 쓰레드로 최대 성능/ 함수형 스타일 개발의 장점
- But, 난의도 매우 높고 RDS 지원 부족해 실무에서 거의 사용 X
➕ 뷰 템플릿 역사
- JSP: 느리고 기능 부족
- Freemarker, Velocity: 속도 문제 해결, 다양한 기능
- Thymeleaf
- HTML 구조를 유지하며 뷰 템플릿 적용 가능
- 스프링 MVC와 강력한 기능 통합
- 최선의 선택이지만 성능은 프리마커, 벨로시티가 더 빠름