※ 본문은 김영한 선생님의 인프런 '스프링 MVC 1편' 강의를 듣고 정리한 내용임을 알립니다.
▶ 웹 서버
- HTTP 기반으로 동작
- 정적 리소스 제공, 기타 부가기능
- 정적 HTML, CSS, JS, 이미지, 영상
- ex) NGINX, APACHE
▶ 웹 애플리케이션 서버 (WAS)
- HTTP 기반으로 동작
- 웹 서버 기능 포함 + (정적 리소스 제공 가능)
- 프로그램 코드를 실행해서 애플리케이션 로직 수행
- 동적 HTML, HTTP, API(JSON), 서블릿, JSP, 스프링 MVC
- ex) 톰캣, Jetty, Undertow
※ 웹 서버와 웹 애플리케이션 서버(WAS)의 차이
: 웹 서버는 정적 리소스(파일), WAS는 애플리케이션 로직
: 사실 두 용어의 경계 자체가 모호함
: 자바의 경우, 서블릿 컨테이너 기능을 제공하면 WAS
: WAS는 애플리케이션 코드를 실행하는 데에 더 특화됨
※ 일반적인 웹 시스템 구성 방식

- 정적 리소스는 웹 서버가 처리
- 웹 서버는 애플리케이션 로직 같은 동적인 처리가 필요하면 WAS에 요청을 위임
- WAS는 중요한 애플리케이션 로직 처리를 담당
- 웹 서버는 잘 죽지 않는 반면, WAS는 잘 죽음 → WAS, DB 장애 발생 시 웹 서버가 오류 화면 제공 가능
▶ 서블릿

@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) {
//애플리케이션 로직
}
}
- urlPatterns의 URL이 호출되면 서블릿 코드 실행
- 개발자는 HTTP 스펙을 매우 편리하게 사용
- 중요! 개발자는 기본적인 HTTP 스펙 정도는 인지하고 있어야 함
▶ 서블릿 컨테이너
: 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 함
- 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기 관리
- 서블릿 객체는 싱글톤으로 관리 (공유 변수 사용에 주의해야 함)
- JSP도 서블릿으로 변환되어 사용
- 동시 요청을 위한 멀티 쓰레드 지원
▶ 쓰레드
: 애플리케이션 코드를 하나하나 순차적으로 실행하는 것
- 자바 메인 메소드를 처음 실행하면 main이라는 이름의 쓰레드 실행
- 쓰레드가 없다면 자바 애플리케이션 실행 불가능
- 쓰레드는 한번에 하나의 코드 라인만 수행 (동시 처리가 필요하면 쓰레드를 추가 생성)
★ 요청마다 쓰레드를 생성할 경우
- 장점
└> 동시 요청을 처리할 수 있다.
└> 리소스(CPU, 메모리)가 허용할 때까지 처리 가능
└> 하나의 쓰레드가 지연되어도 나머지 쓰레드는 정상 동작한다.
- 단점
└> 쓰레드 생성 비용이 매우 비싸다 (응답 속도가 늦어질 수 있음)
└> 쓰레드는 컨텍스트 스위칭 비용이 발생한다.
└> 쓰레드는 생성 제한이 없다. (요청이 너무 많으면 CPU, 메모리 임계점을 넘어서 서버가 죽을 수 있다.)
▶ 쓰레드 풀
: 풀 안에 쓰레드를 미리 만들어놓는 개념 (쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리)
: 요청마다 쓰레드를 생성하는 경우의 단점 보완

- 쓰레드가 필요하면 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내서 사용
- 사용을 종료하면 쓰레드 풀에 해당 쓰레드 반납
- 최대 쓰레드가 모두 사용중일 경우, 다른 요청은 거절하거나 특정 숫자만큼만 대기하도록 설정 가능
- 장점1 : 쓰레드가 미리 생성되어 있으므로, 쓰레드 생성 및 종료 비용(CPU) 절약, 응답시간 빠름
- 장점2 : 쓰레드 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리 가능
★ 실무 Tip. WAS의 주요 튜닝 포인트는 최대 쓰레드(max thread) 적정값을 찾는 것
→ 적정값은 애플리케이션 로직의 복잡도, CPU, 메모리, IO 리소스 상황에 따라 다름
→ 최대한 실제 서비스와 유사하게 성능 테스트 / 아파치 ab, 제이미터, nGrinder 등의 툴 이용할 것!
▶ WAS의 멀티 쓰레드
- 개발자가 멀티 쓰레드 관련 코드를 신경쓰지 않도록 해줌
- 개발자는 마치 싱글 쓰레드 프로그래밍을 하듯 편리하게 소스 코드 개발
- 멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 주의해서 사용
▶ HTTP API

- 주로 JSON 형태로 데이터 통신
- UI 클라이언트 접점
→ 앱 클라이언트 (아이폰, 안드로이드, PC 앱)
→ 웹 브라우저에서 자바스크립트를 통한 HTTP API 호출
→ React, Vue.js 같은 웹 클라이언트
- 서버 to 서버
→ 주문 서버와 결제 서버 간의 통신
→ 기업 간 데이터 통신
▶ SSR (서버 사이드 렌더링)
- HTML 최종 결과를 서버에서 만들어서 웹 브라우저에 전달
- 주로 정적인 화면에 사용
- 관련기술 : JSP, 타임리프
▶ CSR (클라이언트 사이드 렌더링)
- HTML 결과를 자바스크립트를 사용해 웹 브라우저에 동적으로 생성해서 적용
- 주로 동적인 화면에 사용, 웹 환경을 마치 앱처럼 필요한 부분을 변경할 수 있음
- ex) 구글 지도, Gmail, 구글 캘린더
- 관련기술 : React, Vue.js

※ 참고 1 : React, Vue.js를 CSR + SSR 동시에 지원하는 웹 프레임워크도 있음
※ 참고 2 : SSR을 사용하더라도 자바스크립트를 사용해서 화면 일부를 동적으로 변경 가능