😁 쓰레드란?
thread란 프로세스 내에서 실제로 작업을 수행하는 주체를 의미한다.
모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행합니다.
쓰레드는 한줄씩 코드를 실행한다.
쓰레드는 멀티 태스킹에서 쓰이는 워크플로우의 최소 단위이다.
왜 쓰레드가 존재하는 지 그리고 쓰레드를 하나만 있을 때 문제점을 보고, 어떻게 해결할 지 함께 아래 글을 보며 생각해보자!
쓰레드 하나일 때를 가정하고, 단일 요청이 들어왔을 때
1. 아무런 요청이 없을 때 쓰레드는 휴식을 취하고 있다.
2. 요청이 들어오면 휴식하고 있던 쓰레드가 있으니 할당해준다. 그 이후 쓰레드는 servlet을 호출하여 코드를 실행한다.
3. 쓰레드를 할당 후 코드를 실행하고 클라이언트에 응답을 보내준다.
4. http는 비연결성이다. 즉, 응답을 보낸 후 연결이 끊긴 후 쓰레드는 휴식 상태로 돌아간다.
🤔 다중 요청일 때 쓰레드가 하나인 경우
다중 브라우저로부터 요청이 들어오면, WAS 는 스레드를 할당한다. 그런데 만약 서블릿 객체에서 처리 지연이 발생하면, 모든 브라우저가 죽어버린다!
각 요청마다 스레드를 생성하는 방식은 각 스레드가 독립적으로 작동하기 때문에 하나의 스레드에서 처리 지연이 발생하더라도 다른 스레드에는 영향을 미치지 않습니다.
요청마다 쓰레드 생성 시 장단점
😄 장점
동시 요청을 처리할 수 있다.
리소스(CPU, 메모리)가 허용할 때 까지 가능하다. (자원을 모두 활용할 수 있다.)
하나의 스레드가 지연되어도 나머지 스레드는 정상 동작한다.
😑 단점
스레드 생성 비용은 매우 비싸다.
-> 고객의 요청이 들어올 때마다 스레드를 생성하면, 응답 속도가 늦어진다.
스레드는 컨텍스트 스위칭 비용이 발생한다.
스레드 생성에 제한이 없다.
-> 고객 요청이 너무 많을 경우, CPU와 메모리 임계점을 넘어서 서버가 죽을 수 있다.
요청마다 스레드 생성 단점 보안 - 스레드 풀
스레드를 생성/종료가 아닌 여러 스레드를 하나의 공간에서 미리 만들어놔서 필요할 때 빌려 쓰고 반납하는 형식으로 흘러간다.
만약 최대 스레드가 모두 사용중이어서 스레드 풀에 스레드가 없다면?
-> 스레드를 대기/거절로 설정할 수 있다.
스레드 풀 장단점
😄 장점
스레드를 생성/종료하는 비용 절약 & 응답 시간이 빠르다.
생성 가능한 스레드의 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있다.
🙄 생각할점
스레드 풀을 너무 적게하면 리소스를 너무 적게 사용할 수 있다.
-> cpu, memory가 거의 사용하지 않는데, 서버 요청을 처리하는 수가 적으면 백엔드 개발자로서 부끄러운 일이다.
스레드 풀을 너무 많게하면 리소스의 임계점을 넘어서 서버가 죽을 수 있다.
즉, ‘적당한’ 스레드 풀의 크기를 결정하는 것은 간단한 문제가 아니다. 이를 위해 성능 테스트와 모니터링이 필요하며, 이를 통해 시스템의 성능을 최적화할 수 있다.
Spring에서 Thread 흐름
Web Container가 쓰레드를 관리한다.
톰캣은 스레드 풀의 기본 max 갯수는 200개이다.
🎢 톰캣의 기본 설정의 흐름
1. 브라우저 요청을 보내면 톰캣은 쓰레드 풀에 휴식 쓰레드가 존재한다면, 그 쓰레드를 할당해준다.
1-1. 만약 휴식 쓰레드가 존재하지 않고, 현재 쓰레드 갯수가 200개 보다 작을 경우 쓰레드를 만든다.
1-2. 만약 휴식 쓰레드가 존재하지 않고, 현재 쓰레드 갯수가 200개라면 대기한다.
2. 쓰레드는 특정 서블릿의 service() 메소드를 실행하게 된다. 이 메소드를 HTTP 요청 메소드에 따라 doGet(), doPost() 등의 메소드를 호출한다.
3. 서블릿이 작업을 완료하면, 그 결과는 HttpServletResponse 객체에 저장된다. 이 객체는 웹 컨테이너에 의해 브라우저로 전송 된다. 웹 컨테이너는 이 응답을 HTTP 프로토콜에 맞게 포맷팅하고, 이를 클라이언트에게 전송한다.
4. 서블릿이 작업을 완료하고 응답을 보내면, 해당 스레드는 작업을 완료한 것으로 간주한다. 이 스레드는 휴식상태로 돌아가며, 다음 요청을 처리하기 위해 풀에 반환 된다.
출처
서블릿은 요청당 스레드: 멀티스레딩과 웹 애플리케이션
서블릿은 요청당 스레드
velog.io
https://mbc2579.tistory.com/37
서블릿, 동시 요청 - 멀티 쓰레드
서블릿이란? 웹 통신에서 요쳥과 응답을 처리하는 자바 객체이다. 주요 클래스로는 HttpServlet가 있다. 서블릿 특징 urlPatterns(/hello)의 URL이 호출되면서 서블릿 코드가 실행 HTTP 요청 정보를 편리하
mbc2579.tistory.com
웹 애플리케이션 이해
웹은 HTTP를 기반으로 동작한다.클라이언트-서버 간의 통신은 HTTP 를 기반으로 모든 동작이 이루어진다.서버-서버 간의 통신 역시 HTTP 를 사용한다.웹 서버는 HTTP 기반으로 동작하는 서버를 말한
velog.io
'BACKEND > Spring' 카테고리의 다른 글
[Spring Boot] 캐싱 모니터링 k6 + InfluxDB + Grafana (0) | 2024.05.28 |
---|---|
[Spring Boot] Redis로 캐싱 구현 하기 (0) | 2024.04.30 |
[Servlet] Spring은 왜 하나의 서블릿만 사용할까? (0) | 2024.04.03 |
[Servlet] Sevlet의 동작 흐름, 방식, 생명주기 (0) | 2024.04.02 |
[Spring Boot] JWT - Access Token, Refresh Token을 어디에 저장할까? feat. XSS, CSRF (0) | 2024.03.12 |