T_era
WAS에서의 Thread 사용 본문
Thread 기반 순차 실행
애플리케이션 코드는 기본적으로 하나의 스레드 내에서 순차적으로 한 줄씩 실행된다. Java에서 main 메서드를 실행하면 main이라는 이름의 스레드가 생성되어 코드를 위에서부터 아래로 차례대로 수행한다. 만약 동시에 여러 작업을 처리해야 한다면, 개발자는 명시적으로 추가적인 스레드를 생성하고 관리해야 한다.
Servlet 객체의 호출과 스레드
클라이언트로부터 HTTP 요청이 WAS로 전달되면, WAS는 해당 요청을 처리하기 위해 스레드를 할당하고, 할당된 스레드가 해당 요청을 처리할 Servlet 객체의 메서드를 호출한다.
단일 요청 - Single Thread 방식 (일반적인 웹 서버의 기본적인 동작 방식과 유사)
[클라이언트 요청 및 TCP/IP 연결]
↓
[Thread 할당 후 Servlet 호출]
↓
[응답 후 Thread 반환]
하나의 클라이언트 요청이 들어오면 하나의 스레드가 생성되어 Servlet 객체의 service() 메서드 등을 실행하여 요청을 처리한 후 스레드를 반환한다.
동시 요청 - Single Thread 방식의 문제점 (WAS에서 이렇게 동작하지 않음)
[첫 번째 요청] → [Single Thread 작업 중...]
[두 번째 요청 연결 완료] → [대기]
[세 번째 요청 연결 완료] → [대기]
...
[첫 번째 요청 작업 완료] → [첫 번째 스레드 반환] → [두 번째 요청 스레드 할당 및 작업 수행] → ...
만약 WAS가 각 요청마다 새로운 스레드를 생성하지 않고 단일 스레드로 모든 요청을 처리한다면 다음과 같은 문제점이 발생한다.
- 첫 번째 요청의 작업이 완료될 때까지 이후의 모든 요청은 작업을 시작하기 위해 순차적으로 대기해야 한다.
- 만약 첫 번째 요청의 처리가 지연되거나 오류가 발생하여 멈추게 되면, 이후의 모든 요청이 타임아웃 오류를 겪게 되어 서비스 전체가 마비될 수 있다.
Multi Thread : WAS의 동시 요청 처리 방식
WAS는 이러한 단일 스레드 방식의 문제점을 해결하기 위해 Multi Thread 방식을 지원한다. 즉, 각각의 클라이언트 요청마다 새로운 스레드를 생성하여 요청을 처리한다.
[첫 번째 요청] → [Thread 1 생성 및 작업 수행]
[두 번째 요청] → [Thread 2 생성 및 작업 수행] (Thread 1과 동시에)
[세 번째 요청] → [Thread 3 생성 및 작업 수행] (Thread 1, 2와 동시에)
...
[각 요청 처리 완료] → [해당 Thread 종료]
장점:
- 동시에 여러 클라이언트의 요청을 처리할 수 있어 응답성을 향상시킨다.
- 하나의 스레드에서 지연이나 오류가 발생하더라도 다른 스레드는 정상적으로 동작하여 서비스의 안정성을 높인다.
단점:
- 요청마다 스레드를 생성하는 것은 비용이 많이 드는 작업이며, 생성 가능한 스레드 수에는 제한이 있다.
- 수많은 동시 요청이 발생하면 서버의 리소스 (CPU, Memory 등) 부족으로 인해 서버가 다운될 수 있다.
- 스레드를 사용하면 Context Switching이라는 비용이 발생한다.
멀티 태스킹의 진실과 Context Switching
운영체제는 여러 개의 프로세스나 스레드를 동시에 실행하는 것처럼 보이게 하지만, 실제로는 매우 짧은 시간 동안 각 작업들을 번갈아 가며 실행하는 것이다. 이 과정에서 현재 실행 중인 작업의 상태를 저장하고, 다음 실행할 작업의 상태를 불러오는 과정을 Context Switching이라고 한다.
[Task 1 실행] → [Task 1 상태 저장] → [Task 2 상태 로딩] → [Task 2 실행] → [Task 2 상태 저장] → [Task 1 상태 로딩] → [Task 1 실행 (이전 상태부터)] → ...
Context Switching은 CPU가 다른 작업을 처리하기 위해 현재 작업의 정보를 저장하고 새로운 작업의 정보를 불러오는 과정에서 발생하는 일종의 오버헤드이다. 잦은 Context Switching은 시스템 성능 저하의 원인이 될 수 있다.
Thread Pool
WAS는 요청마다 새로운 스레드를 생성하는 방식의 단점을 보완하기 위해 Thread Pool이라는 기법을 사용한다. Thread Pool은 미리 생성된 여러 개의 스레드를 관리하는 풀(Pool)과 같다.
[Thread Pool (미리 생성된 스레드들이 대기)]
↓ [요청 1 도착]
[Thread Pool에서 스레드 1 할당] → [요청 1 처리]
↓ [요청 2 도착]
[Thread Pool에서 스레드 2 할당] → [요청 2 처리] (요청 1과 동시에)
↓ [스레드 사용 완료]
[스레드 1 반납] → [Thread Pool로 복귀]
[스레드 2 반납] → [Thread Pool로 복귀]
요청이 들어오면 Thread Pool에서 놀고 있는 스레드를 꺼내어 요청 처리에 사용하고, 요청 처리가 완료된 스레드는 다시 Thread Pool에 반납하여 재사용될 수 있도록 한다.
정리:
- WAS는 Multi Thread를 지원하여 동시 요청을 효율적으로 처리한다.
- 개발자는 Multi Thread 관련 코드를 직접적으로 고려할 필요는 거의 없지만, Multi Thread 환경에서의 싱글톤 객체 (Servlet, Spring Bean 등)의 공유 변수 사용에 주의해야 한다 (Thread-safe 하지 않은 코드는 예상치 못한 문제를 발생시킬 수 있다).
- WAS는 스레드 생성 및 관리 비용을 줄이고 안정적인 서비스 운영을 위해 Thread Pool을 사용하여 스레드를 효율적으로 관리한다.
- Thread Pool에는 생성 가능한 스레드의 최대치가 설정되어 있으며 (Tomcat 기본 200개, 변경 가능), 성능 테스트를 통해 적절한 스레드 풀 크기를 설정하는 것이 중요하다.
Thread Pool의 장점:
- 요청마다 스레드를 생성하고 종료하는 비용을 절약하여 응답 속도를 향상시킨다.
- 미리 생성된 스레드를 재사용하므로 자원 관리 효율성을 높인다.
- 생성 가능한 스레드 최대치를 제한하여 과도한 요청으로 인한 서버 다운을 방지하고 안정적인 서비스를 유지할 수 있다.
Thread Pool의 단점:
- Thread Pool의 최대 스레드 수를 너무 낮게 설정하면 동시에 처리할 수 있는 요청 수가 제한되어 응답 지연이 발생할 수 있다.
- 최대 스레드 수를 너무 높게 설정하면 많은 요청이 몰릴 때 여전히 리소스 부족으로 서버가 다운될 위험이 있다
'이론 > 백엔드 개념정리' 카테고리의 다른 글
| SSR과 CSR (0) | 2025.05.04 |
|---|---|
| Multi Thread를 사용할 때 싱글톤 객체 사용 및 처리 방법 (0) | 2025.05.04 |
| Servlet이란? (0) | 2025.05.04 |
| Web Server와 Web Application Server의 차이점 (0) | 2025.05.04 |
| HTTP Header와 Restful API의 성숙도 (1) | 2025.05.04 |