본문 바로가기
Spring/스프링 MVC

[스프링 MVC 1편] 1 - (3) 멀티스레드

by Poorm 푸름 2023. 10. 18.

1. Web Service Architecture 훑어보기

출처 https://velog.io/@dkfma3323

 

  1. Web Server : HTTP 요청 Web Container에게 위임
    * web.xml -> 어떤 URL과 Mapping되어 있는지 확인
    * Client(browser)의 요청 URL을 보고 해당 Servlet을 실행(Thread 생성)
    (web.xml에는 어떤 내용들이 구성되어 있는가?)
  2. Web Container : service() 메소드 호출 전 Servlet 객체 메모리 적재
    * Web Container는 적당한 Servlet 찾고 컴파일(.class 파일)
    * 컴파일(.class)된 파일을 메모리에 적재 (Servlet 객체 생성)
    * 메모리 적재 시, init() 메소드 실행

  3. Web Container : 요청이 올 때마다 Thread 생성
    * 각 Thread는 단일 객체에 대해 service() 메소드 호출

   [참고] Web Container가 생성하는 Thread의 정체?
    * 할당된 Thread는 doGet() 혹은 doPost() 메소드를 수행한다.
    * 해당 메소드의 값이 Return되면 destroy() 메소드를 실행한다. -> 자원 반납
    * Client의 매 요청다마 doGet(), doPost() 메소드 수행 = 시스템의 오버헤드가 발생 가능성
      오버헤드 방지 위해 “Thread Pool” 이용

 

2. 멀티스레드 이론

 

출처 https://minho-jang.github.io/development/3/


스레드 역할은?

웹 브라우저 or 클라이언트가 WAS에게 서버를 요청하고 응답받는 과정에서 연결하고 서블릿 객체를 호출한다

 

 

 

   < 스레드 >

  • 애플리케이션 코드를 순차적으로 실행 (한번에 하나의 코드 라인씩) 
    동시에 처리할 경우 스레드 추가로 생성

  • 자바 메인 메서드 실행 = main이라는 스레드 실행
    스레드 없으면 자바 실행 불가
더보기

단일 요청 

  • 스레드 하나일 때, 요청오면 스레드 써서 서블릿 호출

다중 요청

  • 스레드 하나일 때, 서블릿 처리가 지연되는데 요청이 하나 더 들어오면 스레드 대기
    (이러면 둘 다 죽음)

  • 해결방법1 : 스레드를 요청올 때마다 생성하는 방법
      - 장점: 다중 요청 처리 가능 (CPU, 메모리 허용될 때까지)
      - 단점: 스레드 생성 비용 비싸다 / 응답속도 느림 / 컨텍스트 스위칭 비용 발생
                  / 너무 많이 생성하면 CPU, 메모리 임계점 넘어서 서버가 죽을 수 있다

  • 해결방법2 : 스레드풀
                      ○ 풀 안에 미리 스레드 만들어놓고 놀고 있는 스레드 가져다 쓰고 다 쓰면 반납
                      풀에 스레드 없으면 대기 or 거절
                      비용(CPU) 절약, 응답시간 빠름

 

 ** 실무팁 **

 

WAS는 최대 스레드 수 설정이 중요

너무 낮게 설정하면 서버는 여유로운데도 응답은 계속해서 지연

너무 높게 설정하면 CPU, 메모리 리소스 임계점 초과로 서버 다운

싱글톤 객체 주의해서 사용

 

그렇다면 적정 수는? 

: 애플리케이션 로직의 복잡도, CPU, 메모리, IO 리소스 상황에 따라 다름 → 성능테스트 필요

 

 

 

 

[출처] 김영한 강사님 인프런 스프링 MVC 1편

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원

www.inflearn.com