오늘 부터 김영한 강사님의 스프링 mvc 강의를 듣게 되어서 내용을 블로그로 정리하고자 합니다 !!

😘 웹 시스템 구성 - Web Server, WAS, DB


  • 정적 리소스는 웹 서버가 처리한다.

  • 웹 서버는 애플리케이션 로직같은 동적인 처리가 필요하면 WAS에 요청을 위임한다.

  • WAS는 중요한 애플리케이션 로직 처리를 전담한다.

    이렇게 웹 서버와 WAS를 나누는 이유는 WAS가 정적 리소스까지 담당하게 되면 너무 많은 역할을 담당하여 서버 과부하가 일어날 수 있고 WAS가 정적 리소스를 관리하고 있기 때문에 화면 노출도 오류가 생길 수 있다.

    위와같이 WEB SERVER와 WAS를 구분하게 되면 서비스를 확장할 때 정적 리소스를 많이 만들고 싶으면 WEB SERVER만 증설하면 되고 비즈니스 로직을 많이 사용하게되며 WAS를 증설 하고 싶으면 WAS 서버만 새로 추가하면 되서 확장성이 좋아진다.

😊서블릿


서블릿이 우리 대신에 해주는 작업

  • 서버 TCP/IP 대기, 소켓 연결
  • HTTP 요청 메시지를 파싱해서 읽기 HTTP 요청 메시지는 전부 문자열인데 이것을 파싱하여 정보를 해석해줌
  • POST 방식, /save URL 인지
  • Content-Type 확인
    • HTTP 메시지 바디 내용 확인
      username, age 데이터를 사용할 수 있게 파싱
  • 저장 프로세스 실행
  • HTTP 응답 메시지 생성 시작
    • HTTP 시작 라인 생성
    • Header 생성
    • 메시지 바디에 HTML 생성에서 입력
  • TCP/IP에 응답 전달, 소켓 종료

위와같이 개발자는 서블릿이 HTTP 스펙을 이해하고 처리해주기 때문에 웹 요청 처리를 쉽게 할 수 있다.

HTTP 요청, 응답 흐름

  • HTTP 요청시
    • WAS는 Request, Response 객체를 새로 만들어서 서블릿 객체 호출
    • 개발자는 Request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용
    • 개발자는 Response 객체에 HTTP 응답 정보를 편리하게 입력
    • WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성

서블릿 컨테이너

  • 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.
  • 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기 관리를 한다.
  • 서블릿 객체는 싱글톤으로 관리한다.
    • 공유 변수 사용을 주의 해야한다.
  • 동시 요청을 위한 멀티 쓰레드 처리를 지원한다.

동시 요청 - 멀티 스레드


프로세스

  • 프로그램을 실행시키는 것 프로세스 안에 여러 스레드가 존재한다.

스레드

  • 애플리케이션 코드를 하나하나 순차적으로 실행하는 것은 쓰레드
  • 자바 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행
  • 쓰레드가 없다면 자바 애플리케이션 실행이 불가능
  • 쓰레드는 한번에 하나의 코드 라인만 수행
  • 동시 처리가 필요하면 쓰레드를 추가로 생성

만약 멀티 스레드를 사용하지 않는다면?

클라이언트 1, 클라이언트 2가 있다고 했을 때 클라이언트1의 요청 처리가 되지 않았다면 클라이언트 2는 계속 대기해야된다. 만약 클라이언트가 100명 이상 넘어가게 되면 그러면 100명 모두 대기해야 되는 것이다.

요청 마다 스레드 생성

장단점

장점
  • 동시 요청을 처리할 수 있다.
  • 리소스(CPU, 메모리)가 허용할 때 까지 처리가능하다.
  • 하나의 쓰레드가 지연 되어도, 나머지 쓰레드는 정상 동작한다.
단점
  • 쓰레드는 생성 비용은 매우 비싸다.
    • 고객의 요청이 올 때 마다 쓰레드를 생성하면, 응답 속도가 늦어진다.
  • 쓰레드는 컨텍스트 스위칭 비용이 발생한다.
  • 쓰레드 생성에 제한이 없다.
    • 고객 요청이 너무 많이 오면, CPU, 메모리 임계점을 넘어서 서버가 죽을 수 있다.

위와 같이 요청 마다 스레드를 생성하는건 여러 단점 때문에 개선이 필요합니다. 이를 개선한것이 스레드 풀입니다.

스레드 풀

요청 마다 쓰레드 생성의 단점 보완

  • 특징
    • 필요한 쓰레드를 쓰레드 풀에 보관하고 관리한다.
    • 쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리한다. 톰캣은 최대 200개 기본 설정 (변경 가능)
  • 사용
    • 쓰레드가 필요하면, 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내서 사용한다.
    • 사용을 종료하면 쓰레드 풀에 해당 쓰레드를 반납한다.
    • 최대 쓰레드가 모두 사용중이어서 쓰레드 풀에 쓰레드가 없다면?
      • 기다리는 요청은 거절하거나 특정 숫자만큼만 대기하도록 설정할 수 있다.
  • 장점
    • 쓰레드가 미리 생성되어 있으므로, 쓰레드를 생성하고 종료하는 비용(CPU)가 절약되고, 응답 시간이 빠르다.
    • 생성 가능한 쓰레드의 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있다.
profile
개발에 재미를 느끼며 꾸준히 성장하는 개발자 김종완 입니다.

0개의 댓글