Post

멀티쓰레드 개념

멀티쓰레드 개념

멀티 쓰레드(동시 요청) 정리

개요

웹 애플리케이션 서버(WAS)가 어떻게 동시 요청을 처리하는지, 그리고 멀티스레드와 스레드 풀(Thread Pool)에 대해 알아봅니다.
이를 이해하면 트래픽 급증 상황에서 안정적인 서비스 제공 방법과 성능 튜닝의 핵심 포인트를 파악할 수 있습니다.

요청 처리와 스레드(Thread)의 개념

  • 스레드(Thread): 애플리케이션 코드를 순차적으로 실행하는 최소 단위입니다.
    • 자바 애플리케이션은 최소 하나의 메인 스레드로 시작합니다.
    • 하나의 스레드는 한 번에 하나의 코드 흐름만 처리할 수 있습니다.

단일 스레드로 요청 처리 시 문제점

  • 요청 1개 → 스레드 1개로 처리 시 문제 없음
  • 요청이 2개 이상 동시 도착 시, 단일 스레드 환경에서는 두 번째 요청을 처리할 수 없음

한 요청이 오래 걸리면, 뒤따르는 요청들은 대기 상태에 빠져 서비스 전체가 마비될 수 있음

멀티 스레드 도입

  • 요청마다 새 스레드를 생성하면, 동시에 들어오는 요청을 독립적으로 처리 가능
  • 장점: 하나의 요청이 지연되어도 다른 요청은 별도 스레드에서 처리 가능
  • 단점: 요청마다 스레드 생성 시 비용이 매우 크며, 스레드 수가 폭증하면 CPU, 메모리 자원 고갈로 서버가 다운될 수 있음

스레드 풀(Thread Pool) 사용

  • 스레드 풀: 스레드를 요청할 때마다 새로 만들지 않고, 미리 정해진 수의 스레드를 만들어놓고 재사용하는 기법
  • 장점:
    • 스레드 생성/종료 비용 절감
    • 최대 스레드 수를 제한해 무한정 스레드 증가로 인한 자원 고갈 방지
    • 스레드 부족 시 대기열 또는 요청 거절 전략을 통해 서버를 안정적으로 운영

예: 최대 200개의 스레드를 미리 생성해두고, 요청이 들어오면 풀에서 스레드 1개를 할당하여 작업 처리 후 반환

WAS와 멀티스레드

  • WAS(Tomcat 등)는 기본적으로 멀티스레드를 지원하고, 내부적으로 스레드 풀을 사용
  • 개발자는 멀티스레드 로직을 직접 관리할 필요가 없음 (WAS가 알아서 처리)

개발 시 주의 사항:

  • 서블릿(Servlet) 및 스프링 빈(Bean)은 기본적으로 싱글톤으로 관리
  • 하나의 객체 인스턴스를 여러 스레드가 동시에 접근하므로 공유 변수(멤버 변수) 사용에 신중해야 함 (스레드 세이프티 고려)

성능 튜닝 관점

  • 맥스 스레드(max threads) 설정: WAS 튜닝의 핵심 포인트
    • 너무 작게 설정하면: CPU, 메모리 여유가 있어도 요청 대기가 늘어남 → 응답 지연 및 장애 발생
    • 너무 크게 설정하면: 자원 고갈로 서버 다운 위험 증가
  • 최적값 찾기: 애플리케이션 로직 복잡도, 서버 사양, 평균 트래픽 등을 고려한 성능 테스트를 통해 결정

결론

  • 멀티스레드 환경은 동시 요청 처리의 핵심
  • WAS가 멀티스레드, 스레드 풀 관리 기능을 제공하므로 개발자는 비즈니스 로직에 집중 가능
  • 공유 자원 접근 시 스레드 안전성 확보 필요
  • 성능 테스트와 적절한 스레드 풀 튜닝을 통해 안정적인 서비스 운영 가능

다음 시간에는 HTML, HTTP API, 클라이언트 사이드 렌더링, 서버 사이드 렌더링 관련 용어를 정리하겠습니다.

This post is licensed under CC BY 4.0 by the author.