BackEnd/Spring

서블릿 컨테이너 심화 (멀티스레딩, 부가기능)

bora-ovo 2025. 7. 7. 20:25

0. 서블릿 컨테이너의 멀티스레딩 

한 대의 서버 프로세스 안에서 수많은 요청을 동시에 처리하기 위해 컨테이너가 스레드를 이용해 내부적으로 작업을 분산시키는 것.

 

 

1. 멀티스레딩

스레드(Thread) : 한 프로세스 내에서 독립적으로 실행되는 흐름의 단위

멀티스레딩 : 여러 스레드를 동시에 가동시켜 병렬로 작업을 수행하는 방식

 

멀티스레딩을 사용하는 이유

1. 동시처리

만약 여러 요청이 동시에 온다면 한 스레드로만 처리하기에 쉽지 않음. 

하지만 멀티스레드로 나누면 각각 독립적으로 실행되기 때문에 지연을 최소화할 수 있음

 

2. 서비스안정성

특정 요청이 오류로 인해 멈추게 되더라도 다른 스레드는 계속해서 동작함.

 

 

 

 

2.  스레드 풀

매 요청이 들어올 때마다 새롭게 스레드가 생기고 또 이게 종료된다고 하면 스레드 생성 및 소멸 시 비용이 큼

심지어 동시접속이 폭주하게 된다면 스레드 오버헤드 문제로 인해 서버가 느려지거나 서버가 다운될 가능성도 있음

 

따라서 이러한 멀티스레딩이라는 메커니즘을 더 효율적으로 운영하기 위해 스레드풀이라는 기법을 사용.

또한 동시 작업 개수를 제한 시키면 요청이 폭주하더라도 스레드를 무한정 만들어서 서버가 나가는 일이 없어짐

 

3. 서블릿 컨테이너의 스레드 모델

싱글톤 서블릿 인스턴스 

: 컨테이너가 서블릿 클래스를 한 번만 메모리에 올려 init() 을 거쳐 하나의 객체를 생성

  • 객체를 한 번만 생성하면 된다는 점을 통해 객체 생성시 드는 비용을 절감시킬 수 있음.
  • 다만 하나의 객체를 여러 스레드가 동시에 사용하므로,  필드에 값을 저장하면 스레드 간 충돌이 발생할 수 있음
  • 따라서 저장은 지역변수나 동기화로 처리해야 안전함.

요청별 스레드

: 요청이 들어올 때마다 컨테이너가 스레드 풀을 통해 service(request, response) 호출을 담당할 스레드를 배정함

  • 수많은 사용자가 동시에 접속하더라도, 각각의 요청은 별도로 각 스레드에서 병렬로 처리 됨.
  • 따라서 하나의 요청이 오래 걸리더라도 다른 요청에 영향을 끼치지 않음.
  • 다만 스레드 풀에서 꺼낸 스레드를 쓰고 나면 반드시 해당 스레드를 반납해야 함.
  • 스레드가 계속 살아있다면 리소스에 좋지 않기 때문

 

 

4. 세션관리

세션이란. 해당 요청이 어떤 곳에서 왔는지 기억하기 위해 저장하는 곳

한 요청이 올 때 web.xml 의 session-config에 의해 자동으로 고유한 세션 ID가 생성됨

클라이언트가 재요청을 할 시 쿠키를 응답헤더에 추가해서 다시 보냄

 

이는 로그인 상태나 장바구니 정보 등 사용자 별로 상태가 다른 것을 유지시키기 위해 필수적으로 필요한 기능

 

 

5. 필터

 : 서블릿이 요청을 처리하기 전과 응답을 내보낸 뒤 개발자의 코드를 넣을 수 있는 장치.

 

예를 들어 모든 요청에 대하여 문자 인코딩을 UTF-8로 강제시키거나,

로그인 여부를 체크하여 인가권한이 없는 사용자의 접근을 차단할 수 있음

 

이를 통해 중복된 요청 전 후 처리 로직을 서블릿 마다 매번 넣지 않을 수 있고,

해당 코드를 일관되게 한 곳에서 관리할 수 있기 떄문에 유지보수가 쉬움

 

6. 리스너

 : 애플리케이션, 세션 요청과 같은 서블릿 컨테이너 내부의 이벤트가 생길 때 자동으로 호출되는 후킹 포인트.

전역 리소스를 초기화 하거나 세션이 생성 및 소멸될 때 동시 접속자 수를 집계하고, 요청이 시작 및 종료될 떄마다 시간을 측정하는 등 작업을 할 수 있음.

 

보통 어노테이션으로 @WebListener를 클래스 위에 붙이면 자동으로 등록됨

 

이를 통해 언제 호출되어야 할지 시점을 코드에 달아둔다면, 별도로 호출 코드를 작성하지 않아도 자동으로 실행할 수 있음

또한 공통적으로 할 초기화, 정리 로직, 통계 수집, 보안 검사와 같은 기능을 핵심 기능에서 분리하여 관리할 수 있음