0. 서블릿 컨테이너의 멀티스레딩
한 대의 서버 프로세스 안에서 수많은 요청을 동시에 처리하기 위해 컨테이너가 스레드를 이용해 내부적으로 작업을 분산시키는 것.
1. 멀티스레딩
스레드(Thread) : 한 프로세스 내에서 독립적으로 실행되는 흐름의 단위
멀티스레딩 : 여러 스레드를 동시에 가동시켜 병렬로 작업을 수행하는 방식
멀티스레딩을 사용하는 이유
1. 동시처리
만약 여러 요청이 동시에 온다면 한 스레드로만 처리하기에 쉽지 않음.
하지만 멀티스레드로 나누면 각각 독립적으로 실행되기 때문에 지연을 최소화할 수 있음
2. 서비스안정성
특정 요청이 오류로 인해 멈추게 되더라도 다른 스레드는 계속해서 동작함.
2. 스레드 풀
매 요청이 들어올 때마다 새롭게 스레드가 생기고 또 이게 종료된다고 하면 스레드 생성 및 소멸 시 비용이 큼
심지어 동시접속이 폭주하게 된다면 스레드 오버헤드 문제로 인해 서버가 느려지거나 서버가 다운될 가능성도 있음
따라서 이러한 멀티스레딩이라는 메커니즘을 더 효율적으로 운영하기 위해 스레드풀이라는 기법을 사용.
또한 동시 작업 개수를 제한 시키면 요청이 폭주하더라도 스레드를 무한정 만들어서 서버가 나가는 일이 없어짐
3. 서블릿 컨테이너의 스레드 모델
싱글톤 서블릿 인스턴스
: 컨테이너가 서블릿 클래스를 한 번만 메모리에 올려 init() 을 거쳐 하나의 객체를 생성
- 객체를 한 번만 생성하면 된다는 점을 통해 객체 생성시 드는 비용을 절감시킬 수 있음.
- 다만 하나의 객체를 여러 스레드가 동시에 사용하므로, 필드에 값을 저장하면 스레드 간 충돌이 발생할 수 있음
- 따라서 저장은 지역변수나 동기화로 처리해야 안전함.
요청별 스레드
: 요청이 들어올 때마다 컨테이너가 스레드 풀을 통해 service(request, response) 호출을 담당할 스레드를 배정함
- 수많은 사용자가 동시에 접속하더라도, 각각의 요청은 별도로 각 스레드에서 병렬로 처리 됨.
- 따라서 하나의 요청이 오래 걸리더라도 다른 요청에 영향을 끼치지 않음.
- 다만 스레드 풀에서 꺼낸 스레드를 쓰고 나면 반드시 해당 스레드를 반납해야 함.
- 스레드가 계속 살아있다면 리소스에 좋지 않기 때문
4. 세션관리
세션이란. 해당 요청이 어떤 곳에서 왔는지 기억하기 위해 저장하는 곳
한 요청이 올 때 web.xml 의 session-config에 의해 자동으로 고유한 세션 ID가 생성됨
클라이언트가 재요청을 할 시 쿠키를 응답헤더에 추가해서 다시 보냄
이는 로그인 상태나 장바구니 정보 등 사용자 별로 상태가 다른 것을 유지시키기 위해 필수적으로 필요한 기능
5. 필터
: 서블릿이 요청을 처리하기 전과 응답을 내보낸 뒤 개발자의 코드를 넣을 수 있는 장치.
예를 들어 모든 요청에 대하여 문자 인코딩을 UTF-8로 강제시키거나,
로그인 여부를 체크하여 인가권한이 없는 사용자의 접근을 차단할 수 있음
이를 통해 중복된 요청 전 후 처리 로직을 서블릿 마다 매번 넣지 않을 수 있고,
해당 코드를 일관되게 한 곳에서 관리할 수 있기 떄문에 유지보수가 쉬움
6. 리스너
: 애플리케이션, 세션 요청과 같은 서블릿 컨테이너 내부의 이벤트가 생길 때 자동으로 호출되는 후킹 포인트.
전역 리소스를 초기화 하거나 세션이 생성 및 소멸될 때 동시 접속자 수를 집계하고, 요청이 시작 및 종료될 떄마다 시간을 측정하는 등 작업을 할 수 있음.
보통 어노테이션으로 @WebListener를 클래스 위에 붙이면 자동으로 등록됨
이를 통해 언제 호출되어야 할지 시점을 코드에 달아둔다면, 별도로 호출 코드를 작성하지 않아도 자동으로 실행할 수 있음
또한 공통적으로 할 초기화, 정리 로직, 통계 수집, 보안 검사와 같은 기능을 핵심 기능에서 분리하여 관리할 수 있음
'BackEnd > Spring' 카테고리의 다른 글
| JWT + WebSocket + Stateless 환경에서 실시간 채팅 구현 시 알아야 할 핵심 정리 (0) | 2025.11.25 |
|---|---|
| 서블릿 / 서블릿 컨테이너 (0) | 2025.06.30 |
| [Java] Interface (0) | 2025.03.26 |