728x90
Section 1 - 웹 애플리케이션 이해
웹 서버
- http 프로토콜을 사용하여 서버와 클라이언트는 데이터를 주고 받음
- 정적 리소스를 제공한다.
- 아파치, nginx
웹 애플리케이션 서버 WAS
- 정적 리소스를 제공한다.
- 프로그램 코드를 실행하여 애플리케이션 로직 수행
- 사용자마다 다른 화면을 보여줄 수 있다.
- 동적 HTML, HTTP API
- 서블릿, JSP, 스프링 MVC
- 애플리케이션 로직 : DB 조회, 동적으로 html 생성
- 톰캣
웹 서버와 WAS 차이
- 웹 서버는 정적 리소스를 제공하고, WAS는 정적 리소스 제공과 애플리케이션 로직 수행
- WAS는 애플리케이션 코드를 실행한다는 특징이 있다.
- 자바에서는 서블릿 컨테이너 기능을 제공하면 WAS이다.
웹 시스템 구성
![Untitled]
Web Server
- 정적 리소스 제공
WAS
- 애플리케이션 로직 수행
- 동적인 처리가 필요할 경우, 웹 서버는 WAS에게 클라이언트의 요청을 위임한다.
필요 시, 웹 서버와 WAS 각각 스케일 아웃(서버 개수를 늘림, 서버 증설)하여 효율적으로 리소스를 관리할 수 있다.
서블릿
WAS가 해야 할 일
- 서버 TCP/IP 연결 대기, 소켓 연결
- HTTP 요청 메세지를 파싱하여 읽기
- http method(get, post)방식 확인, 요청 url 확인
- content-type 확인 (http 메세지 바디에 관한 정보)
- 요청 url에 맞는 프로세스 실행
- 비즈니스 로직 실행
- DB 조회
- HTTP 응답 메세지 생성 시작
- http 시작 라인 생성
- header 생성
- body에 html 생성
- TCP/IP에 응답 전달, 소켓 종료
- 서블릿은 6 비즈니스 로직 실행을 제외한 나머지 부분을 자동화하여 개발자가 http 스펙을 편리하게 사용할 수 있게 한다.
서블릿 특징
- “/hello” 라는 Url Pattern의 URL이 호출되면 서블릿 코드가 실행된다.
서블릿 흐름
- 클라이언트(웹 브라우저)로부터 요청이 들어온다.
- WAS는 http 메세지를 기반으로 request, response 객체를 생성한다.
- 서블릿 객체(서블릿 컨테이너)를 호출한다.
- 개발자는 request 객체와 response객체를 사용하여 비즈니스 로직을 수행한다.
- 개발자는 response 객체에 http 응답 정보를 담는다.
- WAS는 response 객체에 담겨 있는 내용을 기반으로 http 응답 정보를 생성한다.
서블릿 컨테이너
- 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.
- 서블릿 컨테이너는 서블릿 객체의 생성, 초기화, 호출, 종료하는 생명주기를 관리한다.
- 서블릿 객체는 싱글톤으로 관리된다.
- 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용한다.
- 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근한다.
- 서블릿 컨테이너 종료 시 서블릿 객체도 함께 종료된다.
- JSP도 서블릿으로 변환되어 사용된다.
- 동시 요청을 위한 멀티 쓰레드를 지원한다.
- request, response 객체는 요청이 들어올 때마다 항상 새로 생성된다.
멀티 쓰레드
쓰레드 Thread
프로세스
컴퓨터에서 연속적으로 실행되고 있는 컴퓨터 프로그램
메모리에 올라와 실행되고 있는 프로그램 인스턴스
운영체제로 부터 시스템 자원을 할당받는 자원의 단위
프로세스는 각각 독립된 메모리 영역(Heap, Stack, Data, Code)를 할당받는다.
기본적으로 프로세스 당 1개의 메인 스레드를 가지고 있다.
쓰레드
- 프로세스 내 실행되는 여러 흐름의 단위
- 프로세스가 할당받는 자원을 이용하는 실행의 단위
- 같은 프로세스 내 여러 스레드는 Heap 영역을 공유한다.
- 쓰레드는 한 번에 하나의 코드 라인을 수행한다.
- 동시 처리가 필요하면 쓰레드를 추가로 생성한다.
단일 스레드
- 클라이언트의 요청이 들어오면 대기 중인 WAS와 연결을 한다.
- WAS는 쓰레드를 생성하여 할당한다.
- 쓰레드는 서블릿을 호출하여 코드를 실행한다.
- 응답 후, 쓰레드는 휴식을 한다.
요청마다 스레드 생성
- 요청마다 스레드를 생성하여 요청을 처리한다.
- 장점
- 동시 요청을 처리할 수 있다.
- 리소스(CPU, 메모리)가 허용할 때까지 처리할 수 있다.
- 하나의 스레드가 지연되어도 다른 스레드는 정상 동작한다.
- 단점
- 스레드 생성 비용이 비싸다.
- 요청이 올 때마다 스레드를 생성하면 응답 속도가 느려진다.
- 스레드 컨텍스트 스위칭이 필요하다.
- CPU는 스레드를 한 번에 하나씩 수행하고, 빠른 속도로 전환하며 수행하여 동시에 여러 스레드를 실행하는 것처럼 보인다.
- 스레드 생성에 제한이 없으면 CPU와 메모리 임계치를 초과하여 서버가 죽을 수 있다.
- 스레드 생성 비용이 비싸다.
스레드 풀 Thread Pool
- 스레드 풀
- 이미 생성되어 있는 스레드들 모임
- 클라이언트 요청이 들어오면 스레드 풀에서 스레드 할당을 요청한다.
- 사용 후 스레드를 스레드 풀에 반납한다.
- 스레드 풀에 스레드가 부족하다면 스레드 할당을 대기하거나 클라이언트 요청을 거절한다.
- 장점
- 스레드가 이미 생성되어 있으므로, 스레드 생성과 종료 비용을 절약할 수 있고, 응답 속도가 빠르다.
- 생성 가능한 스레드의 최대 값이 있으므로 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있다.
Max Thread
- 스레드 풀에 생성 가능한 스레드 최대치
- 즉, 동시 요청 처리 가능 개수
- 너무 낮을 경우
- 서버 리소스는 여유롭지만, 다른 클라이언트는 응답 지연이 된다.
- 너무 높을 경우
- 서버 리소스(CPU, 메모리) 임계점 초과로 서버가 다우 ㄴ된다.
- 적절하게 설정
- 성능 테스트, 튜닝
정리
- WAS는 멀티 스레드 처리를 지원한다.
- 개발자가 멀티 스레드 관련 코드를 신경쓰지 않아도 된다.
- 멀티 스레드 환경이므로 싱글톤 객체(서블릿 객체, 스프링 빈)을 주의하여 사용하여야 한다.
[Refs]
728x90
'TIL' 카테고리의 다른 글
[TIL] 모든 개발자를 위한 HTTP 웹 기본 지식 - Section 3 (0) | 2024.04.12 |
---|---|
MyBatis foreach 반복문에 List 자료형 parameterType 사용하기 (1) | 2024.01.28 |
[Spring] Exception Handler, Controller Advice (0) | 2024.01.25 |
[TIL] Git 잘못된 브랜치에서 작업했을 때, 작업 내용을 다른 브랜치로 옮기기 (0) | 2023.11.27 |
[AWS] AWS 가입, EC2 인스턴스 생성 (0) | 2023.11.23 |