[Spring MVC] 1. Servlet&Thread

yoons(이윤서)·2025년 4월 3일
post-thumbnail

서블릿(Servlet)

개발자가 비즈니스 로직만 작성할 수 있게 나머지 단계를 자동화해준다.

@WebServlet(name="helloServlet", urlPatterns="/hello")
public class HelloServlet extends HttpServlet {
	@Override
    protected void service(HttpServletRequest request, HttpServletResponse response) {
    }
}

HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServletRequest
HTTP 응답 정보를 편리하게 사용할 수 있는 HttpServletResponse

📍Servlet HTTP 요청, 응답 흐름

  • HTTP 요청시
  1. WAS는 Request, Response 객체를 새로 만들어서
  2. 서블릿 객체 호출
  3. 개발자는 Request 객체에서 HTTP 요청 정보 편리하게 꺼내서 사용
  4. Response 객체에서 HTTP 응답 정보 편하게 입력
  5. WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보 생성
  6. 웹 브라우저에 전송
  7. 웹 브라우저가 html 랜더링해서 화면에 띄움

Servlet Container

서블릿을 지원해주는 WAS = 서블릿 컨테이너

  1. 서블릿 객체를 서블릿 컨테이너가 자동으로 생성해준다.
  2. 서블릿 객체 생성, 초기화, 호출, 종료등 생명주기도 관리해줌
  3. 서블릿 객체는 싱글톤으로 관리
    • 싱글톤: 객체를 하나만 생성해놓고 하나를 모두가 공유해서 쓰는 것
    • response, request 객체는 요청마다 다 다르게 새로 만들어짐.
    • 그러나 helloServlet이라는 것은 다시 만들 필요가 없음
    • 그래서 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용
    • 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근
    • 공유변수(멤버변수) 사용 주의
    • 서블릿 컨테이너 종료시 함께 종료
  4. JSP도 서블릿으로 변환되어 사용
  5. 동시 요청을 위한 멀티 쓰레드 처리 지원
    • WAS가 멀티쓰레드 자동으로 처리해줌

📍동시 요청 - 멀티 쓰레드

웹 브라우저가 WAS에 요청을 하면 서블릿 호출.
서블릿이라는 것을 도대체 누가 호출하느냐??
-> 쓰레드!

쓰레드

  • 애플리케이션 코드를 하나하나 순차적으로 실행하는 것이 쓰레드
  • 자바 main 메서드 처음 실행 -> main이라는 이름의 쓰레드가 실행
  1. 단일 쓰레드?

    -> 요청이 여러개 오면 모두 time out

  2. 요청마다 쓰레드 생성?

    • 쓰레드는 생성 비용이 매우 비쌈
    • 요청 올 때마다 생성하면 응답 속도 늦어짐
    • 쓰레드 간 전환(컨텍스트 스위칭)에 비용 발생
    • 쓰레드 생성에 제한이 없어진다.
      -> 고객 요청이 너무 많이 오면, CPU 메모리 임계점을 넘어 서버 죽음.
  3. 쓰레드 풀!

풀 안에 미리 갯수 제한하여 만들어놓음
쓰레드 다 쓰면 다시 풀에 반납
쓰레드 풀에 0개이면 쓰레드 대기, 거절

장점
- 필요한 쓰레드를 쓰레드 풀에 보관, 관리
- 쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리.
- 톰캣은 최대 200개 기본 설정
- CPU 절약되고, 응답 시간이 빠름
- 최대치가 정해져있으므로 많은 요청이 들어와도 안전하게 처리 가능

⭐실무 Tip

최대 쓰레드(Max thread)를 튜닝했을때 극적인 효과를 볼 확률이 높음

👉🏻 최대 쓰레드 값이 너무 낮으면?
- 서버 리소스는 여유롭지만, 클라이언트는 금방 응답 지연

👉🏻 최대 쓰레드 값이 너무 높으면?
- 동시 요청이 많으면 CPU, 메모리 리소스 임계점 초과로 서버 다운

✅ 클라우드? -> 서버 늘리고 이후에 튜닝, 아니면 그냥 열심히 튜닝
✅ 적정 숫자? -> 애플리케이션 로직의 복잡도, CPU, 메모리 상황에 따라 다름.

-> 최대한 실제 서비스와 유사하게 성능 테스트
(툴:아파치, nGrinder, 제이미터)
-> 부하 테스트로 TPS(Transaction Per Second)를 측정한 뒤, 적정 스레드 수를 설정

규모예상 maxThreads
소규모 서비스100~200
일반 사용자 대상 중규모 서비스200~500
트래픽 많은 대규모 서비스 (배달의 민족, 쿠팡 등)400~1000 (하지만 여러 서버로 분산)



🔑 WAS의 멀티 쓰레드 지원

멀티쓰레드에 대한 부분은 WAS가 처리
개발자는 멀티 쓰레드 관련 코드를 신경쓰지 않아도 됨
개발자는 마치 싱글 쓰레드 프로그래밍을 하듯이 편리하게 소스코드 개발
멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 주의해서 사용
-> 싱글톤 객체에 멀티 쓰레드(쓰레드 여러 개)의 호출이 들어옴
-> 멤버변수이기 때문에 주의 필요

profile
개발공부하는 잠만보

0개의 댓글