웹 서버, 웹 애플리케이션 서버

  • 웹 서버: HTTP 요청을 받아서 HTML, CSS, JS 파일 같은 정적 리소스를 클라이언트에게 보내줌
  • WAS(Web Application Server): 로그인, 회원가입 등의 동적인 요청을 처리하는 로직을 수행함
  • 즉, 웹 서버는 정적 리소스, WAS는 애플리케이션 로직을 실행하는 서버
  • 정적 리소스만 제공하는 웹 서버는 잘 죽지 않고, 애플리케이션 로직이 동작하는 WAS 서버는 잘 죽음.
  • WAS가 죽으면, 웹 서버에서 오류화면 HTML을 제공 가능함.

 

일반적인 웹 시스템 구성 - WEB, WAS, DB

 

 

 

서블릿

  • 클라이언트의 HTTP 요청을 받아서, Java 코드로 처리하고, 다시 HTTP 응답을 만들어 돌려주는 역할을 함.
  • WAS(Tomcat 등) 에 의해 실행되며, JVM 안에서 객체로 재사용되기 때문에 빠르고 안정적임.
  • HTTP 요청이 오면 WAS가 request, response 객체를 새로 만들어서 서블릿 객체를 호출.
  • 개발자는 Request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용.
  • 개발자는 Response 객체에 HTTP 응답 정보를 편리하게 입력하고, WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성함.

서블릿 동작 구조

 

 

 

 

 

서블릿 컨테이너

  • 서블릿을 관리하고 실행해 주는 실행 환경이자, WAS의 핵심 구성 요소. 서블릿을 지원하는 WAS를 서블릿 컨테이너 라고 함.
  • 서블릿은 싱글톤으로 관리되고, 서블릿 객체 생성, 초기화, 호출, 종료하는 생명주기를 관리해줌.
  • 클라이언트로부터 HTTP 요청이 들어오면, 컨테이너가 그걸 파싱해서 적절한 서블릿에게 전달해줌.
  • 요청이 동시에 여러 개 들어오면, 각각 쓰레드로 처리해주는 멀티쓰레딩 처리를 해줌. 즉, 요청당 서블릿 객체 여러 개를 만드는 것 이 아님.

서블릿 컨테이너 동작 구조

 

 

 

 

쓰레드

  • HTTP 요청이 오면, 서블릿 컨테이너가 요청에 해당하는 서블릿을 결정하고, 요청(Request)과 응답(Response) 객체를 생성한 뒤, 쓰레드를 할당해 해당 서블릿의 메서드를 실행시킨다.
  • 쓰레드는 한 번에 하나의 코드 라인만 수행한다. 동시 처리가 필요하면 쓰레드를 추가로 생성한다.
  • 각 쓰레드는 독립적인 실행 흐름을 가지며, CPU는 동시에 여러 쓰레드를 실행하는 것처럼 보이도록 빠르게 컨텍스트 스위칭한다.
  • 요청 마다 쓰레드를 생성하면, 쓰레드 생성 비용 및 컨텍스트 스위칭 비용이 매우 커서 성능적으로 매우 비효율적.
  • 이를 해결하기 위해 WAS는 미리 생성된 쓰레드들을 유휴 상태로 유지하다가 요청이 들어오면 즉시 할당하여 처리하는 쓰레드 풀(톰캣의 기본 최대 쓰레드는 200로 설정) 구조를 사용한다.
  • WAS의 주요 튜닝 포인트최대 쓰레드 값의 적정 값 설정이다. -> 애플리케이션 로직의 복잡도, CPU, 메모리, IO 리소스 상황을 고려하고 성능 테스트를 통해 적정 값을 찾도록 함.
  • 멀티 쓰레드에 대한 부분은 WAS가 처리 해줘서, 개발자는 멀티 쓰레드 관련 코드를 신경쓰지 않아도 됨. 하지만 멀티 쓰레드 환경이므로, 싱글톤 객체처럼 공유 변수 사용에 극도록 주의해서 사용하자.

쓰레드 풀 동작 구조

 

 

 

 

HTML, HTTP API, CSR, SSR

  • 정적 리소스: 미리 만들어진 HTML, CSS, JS, 이미지, 영상 파일 등 그대로 전달됨
  • HTML: 서버에서 동적으로 HTML 페이지를 생성해 전달할 수 있음 (ex. JSP, Thymeleaf)
  • HTTP API: HTML이 아닌 데이터(JSON 등)를 전달, 클라이언트가 화면 구성
  • SSR (Server Side Rendering): 서버에서 최종 HTML을 생성해 클라이언트에 전달 - 주로 정적인 화면에 사용
  • CSR (Client Side Rendering): 서버는 데이터만 전달하고, 클라이언트가 JS로 HTML 구성 - 주로 동적인 화면에 사용

HTTP API

 

서버 사이드 렌더링

 

클라이언트 사이드 렌더링