

개발자가 비즈니스 로직만 작성할 수 있게 나머지 단계를 자동화해준다.
@WebServlet(name="helloServlet", urlPatterns="/hello")
public class HelloServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) {
}
}
HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServletRequest
HTTP 응답 정보를 편리하게 사용할 수 있는 HttpServletResponse
서블릿을 지원해주는 WAS = 서블릿 컨테이너
웹 브라우저가 WAS에 요청을 하면 서블릿 호출.
서블릿이라는 것을 도대체 누가 호출하느냐??
-> 쓰레드!
단일 쓰레드?
-> 요청이 여러개 오면 모두 time out
요청마다 쓰레드 생성?
✅ 쓰레드 풀!

풀 안에 미리 갯수 제한하여 만들어놓음
쓰레드 다 쓰면 다시 풀에 반납
쓰레드 풀에 0개이면 쓰레드 대기, 거절
장점
- 필요한 쓰레드를 쓰레드 풀에 보관, 관리
- 쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리.
- 톰캣은 최대 200개 기본 설정
- CPU 절약되고, 응답 시간이 빠름
- 최대치가 정해져있으므로 많은 요청이 들어와도 안전하게 처리 가능
최대 쓰레드(Max thread)를 튜닝했을때 극적인 효과를 볼 확률이 높음
👉🏻 최대 쓰레드 값이 너무 낮으면?
- 서버 리소스는 여유롭지만, 클라이언트는 금방 응답 지연
👉🏻 최대 쓰레드 값이 너무 높으면?
- 동시 요청이 많으면 CPU, 메모리 리소스 임계점 초과로 서버 다운
✅ 클라우드? -> 서버 늘리고 이후에 튜닝, 아니면 그냥 열심히 튜닝
✅ 적정 숫자? -> 애플리케이션 로직의 복잡도, CPU, 메모리 상황에 따라 다름.
-> 최대한 실제 서비스와 유사하게 성능 테스트
(툴:아파치, nGrinder, 제이미터)
-> 부하 테스트로 TPS(Transaction Per Second)를 측정한 뒤, 적정 스레드 수를 설정
| 규모 | 예상 maxThreads |
|---|---|
| 소규모 서비스 | 100~200 |
| 일반 사용자 대상 중규모 서비스 | 200~500 |
| 트래픽 많은 대규모 서비스 (배달의 민족, 쿠팡 등) | 400~1000 (하지만 여러 서버로 분산) |
멀티쓰레드에 대한 부분은 WAS가 처리
개발자는 멀티 쓰레드 관련 코드를 신경쓰지 않아도 됨
개발자는 마치 싱글 쓰레드 프로그래밍을 하듯이 편리하게 소스코드 개발
멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 주의해서 사용
-> 싱글톤 객체에 멀티 쓰레드(쓰레드 여러 개)의 호출이 들어옴
-> 멤버변수이기 때문에 주의 필요