본문 바로가기
네트워크&웹 기술(Network&Web)

웹 서버(WEB), 웹 애플리케이션 서버(WAS), 서블릿, 스레드

by codeyaki 2022. 4. 18.
반응형

웹 서버(Web Server)

  • HTTP 기반으로 동작
  • 정적 리소스 제공(템플릿), 기타 부가기능
  • 정적(파일) HTML, CSS, JS, 이미지, 영상
  • 예) NGINX, APACHE

웹 애플리케이션 서버(WAS, Web Application Server)

  • HTTP 기반으로 동작
  • 웹 서버 기능 포함 (정적 리소스 제공 가능)
  • 프로그램 코드를 실행해서 애플리케이션 로직 수행
    - 동적 HTML, HTTP API(JSON)
    - 서블릿, JSP, 스프링 MVC
  • 예) 톰캣(Tomcat), Jetty, Undertow

웹 서버와 웹 애플리케이션 서버의 차이

  • 웹 서버는 정적 리소스(파일), WAS는 애플리케이션 로직
  • 하지만 둘의 용어의 경계가 모호하다.
    - 웹 서버도 프로그램을 실행하는 기능을 포함하기도 함.
    - 웹 애플리케이션 서버도 웹 서버의 기능을 제공함
  • 자바는 서블릿 컨테이너 기능을 제공하면 WAS라고 부름
    - 서블릿 없이 자바 코드를 실행하는 서버 프레임워크가 있기도 하다.
  • WAS는 애플리케이션 코드를 실행하는 것에 더 특화가 되어있다.

웹 시스템 구성 1 - WAS, DB

  • WAS, DB 만으로 시스템 구성 가능
  • WAS는 정적 리소스, 애플리케이션 로직 모두 제공 가능
  • 문제점
    - WAS가 너무 많은 역할을 담당하기 때문에 서버 과부하가 우려된다.
    - 가장 비싼 애플리케이션 로직이 정적 리소스 때문에 수행하기 어려울 수 있다.
    - WAS에 장애가 발생하면 오류 화면을 사용자(클라이언트)들에게 노출을 시켜줄 수도 없다.

웹 시스템 구성 2 - WEB, WAS, DB

  • WAS로 모든 걸 담당하는 구성이 아닌 정적 리소스는 웹 서버가 처리한다.
  • 웹 서버는 애플리케이션 로직 같은 동적인 처리가 필요하면 WAS에 요청을 위임한다.
  • WAS는 중요한 애플리케이션 로직을 처리하는 것에만 전담한다.
  • 효율적인 리소스 관리가 가능하다.
    - 정적 리소스가 더 필요하면 Web서버 증설
    - 동적(애플리케이션) 리소스가 더 필요하면 WAS 증설
  • WAS(애플리케이션) 로직이 동작하는 WAS 서버는 장애가 자주 발생한다.
  • 하지만 정적 리소스만 제공하는 웹 서버는 장애가 발생하는 경우가 적다.
  • 이점을 이용해 WAS, DB에 장애가 발생해도 WEB서버에서 사용자들에게 오류 화면을 제공할 수 있다.

 

서블릿 등장 이유

POST 요청으로 회원(나이, 이름)을 저장하는 웹 애플리케이션 서버 직접 구현할 때

  • 서버 TCP/IP 연결 대기, 소켓 연결
  • HTTP 요청 메시지를 파싱 해서 읽기
  • POST 방식, /save URL 인지
  • HTTP 메시지 바디 내용 피싱
    - username, age 데이터를 사용할 수 있게 파싱
  • 저장 프로세스 실행
  • 비즈니스 로직 실행 (데이터베이스에 저장 요청)
  • HTTP 응답 메시지 생성 시작
    - HTTP 시작 라인 생성
    - Header 생성
    - 메시지 바디에 HTML 생성에서 입력
  • TCP/IP에 응답 전달, 소켓 종료

비즈니스 로직만 의미가 있는 코드이다. 그 외의 부분은 동작에 필요한 부분들이다...

비즈니스 로직에만 집중하기 위해서 서블릿이 등장하게 된다.

서블릿 (Servlet)

특징

  • urlPatterns의 URL이 호출되면 서블릿 코드가 실행
  • HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServletRequest
  • HTTP 응답 정보를 편리하게 제공할 수 있는 HttpServletResponse
  • 따라서 개발자는 HTTP스펙을 편리하게 사용할 수 있게 된다.

서블릿 컨테이너

  • 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 칭함.
  • 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리해준다.
  • 서블릿 객체는 싱글톤으로 관리한다.
    - 고객 요청이 올 때마다 계속 객체를 생성하는 것은 비효율적이다.
    - 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용한다.
    - 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근한다.
    - 서블릿 컨테이너가 종료될 때 함께 종료된다.
    - 공유 변수 사용할 때에는 주의해야 한다. (싱글톤이기 때문이다.)
  • JSP도 서블릿으로 변환되어서 사용된다.
  • ★★동시 요청을 위한 멀티 스레드 처리를 지원한다.★★

동시 요청 (멀티 스레드)

스레드(단일) (Thread)

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

요청마다 쓰레드 생성 시

장점

  • 동시 요청을 처리할 수 있다.
  • 리소스(CPU, 메모리)가 허용할 때까지 처리 가능
  • 하나의 스레드가 지연되어도, 나머지 스레드는 정상 동작한다.

단점

  • 스레드의 생성 비용은 매우 비싸다.
    - 고객의 요청일 올 때마다 스레드를 생성하면 응답속도가 느려진다.
  • 스레드는 컨텍스트 스위칭 비용이 발생한다.
  • 쓰레드 생성에 제한이 없다.
    - 고객 요청이 너무 많이 오면, CPU, 메모리 임계점을 넘어서 서버가 죽을 수 있다.

쓰레드 풀

요청마다 쓰레드 생성하는 단점을 보완한 방법이다.

특징

  • 필요한 스레드를 쓰레드 풀에 보관하고 관리한다.
  • 쓰레드 풀에 생성 가능한 스레드의 최대치를 관리한다. 톰캣은 최대 200개가 기본이다. (변경 가능)

사용

  • 스레드가 필요하면, 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내서 사용한다.
  • 사용을 종료하면 쓰레드 풀에 해당 쓰레드를 반납한다.
  • 최대 스레드가 모두 사용중이어서 쓰레드 풀에 쓰레드가 없을 때
    - 기다리는 요청은 거절하거나 특정 숫자만큼만 대기하도록 설정할 수 있다.

장점

  • 스레드가 미리 생성되어 있으므로, 스레드를 생성하고 종료하는 비용(CPU)이 절약되고, 응답 시간이 빨라진다.
  • 생성 가능한 스레드의 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있다.

TIP

  • WAS의 주요 튜닝 포인트는 최대 스레드(Max Thread)의 수이다.
  • 값이 너무 낮으면?
    - 동시 요청이 많으면, 서버 리소스는 여유롭지만, 클라이언트는 빠르게 응답 지연에 걸리게 된다.
  • 값이 너무 높으면?
    - 동시 요청이 많으면, CPU, 메모리 리소스의 임계점이 초과되어 서버가 다운된다.
  • 따라서 장애가 발생하면?
    - 클라우드면 서버부터 증설, 이후에 튜닝한다!
    - 클라우드가 아니라면 튜닝을 진행한다!
  • 적정 값을 찾는 방법
    - 애플리케이션 로직의 복잡도, CPU, 메모리, IO리소스 상황에 따라 모두 다르게 설정해야 한다.
    - 따라서 성능 테스트를 진행하여 적절한 값을 찾아야 한다.
        * 최대한 실제 서비스와 유사하게 설정하여 성능 테스트를 시도해야 한다.
        * 툴: 아파치 ab, 제이미터, nGrinder ...

정리

  • 멀티 스레드에 대한 부분은 WAS가 처리해준다!
  • 개발자는 멀티 스레드에 관련한 코드를 신경쓰지 않아도 된다!
  • 싱글 쓰레드 프로그래밍을 하듯이 편리하게 소스코드를 개발하면 된다!!!
  • ★★하지만 멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 주의해서 사용해야 한다.★★
반응형

'네트워크&웹 기술(Network&Web)' 카테고리의 다른 글

REST란  (0) 2023.06.07
HTTP 알아보기 5 - 캐시, 프록시 캐시  (0) 2022.04.15
HTTP 알아보기 4 - 헤더  (0) 2022.04.15
HTTP 알아보기 3 - 상태 코드  (0) 2022.04.14
HTTP 알아보기 2 - 메서드, API  (0) 2022.04.13