✅ 김영한 님의 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술을 공부하며 정리한 글입니다.
웹서버 vs. 웹애플리케이션서버
📌 웹서버는 정적 리소스 제공, 웹애플리케이션서버는 애플리케이션 로직 실행
- WAS는 애플리케이션 코드를 실행하는 데 특화됨!
- Java는 서블릿 컨테이너 기능을 제공하면 WAS
웹서버
- HTTP 기반으로 동작하는 서버로, 주로 정적 리소스를 제공함
- ex. NGINX, APACHE
웹애플리케이션서버 (WAS)
- 프로그램 코드를 실행해서 애플리케이션 로직 실행 ▶️ 사용자마다 다른 결과 제공 가능
- 동적 HTML, HTTP API/서블릿, JSP, Spring MVC
- ex. Tomcat
웹 시스템 구성하기
- WAS, DB로 구성된 경우 (WAS만 가지고 시스템 구축하는 경우)
WAS : 1. 애플리케이션 로직
2. HTML, CSS, JS, 이미지 등의 정적 리소스
- 단점:
- 너무 많은 역할을 맡게 된다 -> 이는 서버 과부하로 이어질 수 있음
- WAS가 죽으면 접근 안됨 (오류 화면조차 노출 불가)
- WEB, WAS, DB 구성 (개선)
웹서버: 정적 리소스 처리
WAS: 애플리케이션 로직 (동적인 처리)
- 장점:
- WAS/DB 단에서 장애가 나더라도 WEB서버는 오류 화면(정적 HTML)을 표출할 수 있음
- 프로그램 특성 상 정적 리소스가 많이 필요하면 웹서버 증설, 애플리케이션 리소스가 더 필요하면 WAS 증설
서블릿
WAS를 직접 구현하는 경우, 백엔드 개발자는 1. HTTP 요청 메시지 파싱해서 읽기
, 2. 비즈니스 로직 구현 (DB에 저장 요청 등)
, 3. HTTP 응답 메시지 생성
을 해줘야 함 👉 여기서 의미 있는 작업은 2
서블릿은 2. 비즈니스 로직 구현 (DB에 저장 요청 등)
을 제외한 모든 일을 해준다!!
즉, request 읽어 들이고 response 생성 👉 개발자는 가져다 쓰기만 하면 OK!
서블릿 컨테이너와 서블릿 객체
- 서블릿 컨테이너는 생성, 초기화, 호출, 종료 등 서블릿 객체의 생명 주기 관리를 주로 함
- 서블릿 객체는 singleton으로 관리됨
⚠️ 주의: 공유변수 사용
- 동시요청을 위한 멀티스레드 처리 지원은 WAS가 알아서 해줌
❓ 서블릿 객체를 누가 호출?? = 쓰레드
쓰레드
애플리케이션 코드 하나하나 실행하는 단위 ▶️ 동시처리 하려면? 여러개의 쓰레드 필요
- 요청마다 쓰레드 생성하는 경우
➕ 동시요청 처리 가능, 하나의 쓰레드가 지연되더라도 나머지 정상 작동
➖ 쓰레드 생성 비용 큼, context switching 비용 발생, 쓰레드 생성의 제한이 없어서 서버가 죽을 수 있다
그래서 나온 게..
쓰레드 풀
(여러 쓰레드가 놀고 있는 pool을 생각하면 된다)
- 필요할 때 갖다쓰고, 다 쓰면 반납
- 쓰레드가 모두 사용 중이면 -> 거절 or 대기
- 쓰레드풀에 생성가능한 쓰레드의 최대치를 관리할 수 있다
➕ 쓰레드를 미리 생성하기 때문에 생성, 종료 비용 절약, 응답시간이 빠르다
WAS의 멀티쓰레드 지원
- 개발자는 비즈니스 로직만 신경 쓰면 됨
- 단, 멀티쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링빈) 주의해서 사용 (공유변수)
HTML, HTTP API, CSR, SSR
HTML
- 정적 리소스: 정적 HTML, CSS, JS, 이미지 등
- 동적 리소스: 동적 HTML 페이지
HTTP API
html 전달이 아닌, data를 전달
👉 다양한 시스템에서 사용된다!
- 웹 클라이언트 to 서버
- 앱 클라이언트 to 서버
- 서버 to 서버 (주문서버 to 결제서버, MSA 연관지어 생각하면 됨)
⭐️ 여기서 백엔드 개발자의 고민 point는 세가지다!
- 정적 리소스를 어떻게 제공할 것인가?
- 동적 HTML 페이지를 어떻게 제공할 것인가?
- HTTP API를 어떻게 제공할 것인가?
SSR (Server-Side Rendering)
서버에서 동적으로 HTML을 생성 (만드는 과정 서버단에서 끝!)
CSR (Client-Side Rendering)
javascript로 HTML을 동적으로 생성
- 동적인 웹페이지 만들 때 ex. 구글 지도
- React, Vue.js
JAVA 웹 기술 역사
- 서블릿 - HTML 생성이 어려움
- JSP - HTML 생성은 편리하지만 비즈니스 로직까지 넣으면,,🤦🏻♀️ 유지보수 HELL 파티 개장
- MVC 패턴의 등장 (JSP + 서블릿)
Model, View, Controller 관심사의 분리 (비즈니스 로직과 뷰의 분리)
- MVC 프레임워크 춘추전국시대였다가
- Annotation 기반 Spring MVC 등장!
- 스프링부트의 등장 - 서버 내장, 스프링 편리하게 사용할 수 있게 도와줌