웹 애플리케이션 이해

웹 서버 (Web Server)

  • HTTP 기반으로 동작
  • 정적 리소스 + 기타 부가 기능 제공
  • 정적 HTML, CSS, JS, 이미지, 영상
  • ex) NGINX, APACHE

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

  • HTTP 기반으로 동작
  • 웹 서버의 기능을 대부분 포함 (정적 리소스 제공 가능)
  • 프로그램 코드를 실행해서 애플리케이션 로직 수행
    • 동적 HTML, HTTP API (JSON)
    • 서블릿, JSP, Spring MVC
  • ex) Tomcat, Jetty, Undertow
  • 애플리케이션 코드를 실행하는데 더 특화돼있음

웹 시스템 구성 - WAS + DB

  • WAS가 정적 + 동적 리소스 모두 담당
    • 정작 중요하고 비싼 애플리케이션 로직이 정적 리소스에 방해 받을 수 있음
  • WAS가 하는 일이 너무 많음 => 서버 과부화 우려 (WAS는 되게 잘 죽는다)
  • WAS가 장애 발생시, 오류 화면 노출 불가능 (서버에 접근 자체가 불가능하므로)
  • 데이터만 주고받은 API를 구축하는 경우엔 WAS + DB로만 구성해도 괜찮다

웹 시스템 구성 - Web Server + WAS + DB

  • 정적 리소스는 웹 서버가 담당
  • 애플리케이션 로직과 같은 동적인 처리는 WAS에 위임
  • WAS가 중요한 애플리케이션 로직 처리를 전담
  • 효율적인 리소스 관리 가능
    • 정적 리소스 많이 사용 => Web 서버 증설
    • 애플리케이션 리소스많이 사용 => WAS 증설
  • Web Server는 잘 죽지 않음 => 오류 화면 제공 가능


서블릿 (Servlet)

  • 개발자가 WAS를 매번 직접 구현하는 게 너무 비효율적이므로 이를 대체해주는 기능
  • 비즈니스 로직 실행 및 DB에 저장 요청을 하는 과정을 제외한 모든 과정을 대신 해줌
  • urlPatterns의 URL이 호출되면 서블릿 코드가 실행
  • HttpServletRequest : HTTP 요청 정보를 편리하게 사용할 수 있음
  • HttpServletResponse : HTTP 응답 정보를 편리하게 제공할 수 있음

HTTP 요청 시 흐름

Servlet 흐름

  1. WAS가 Request, Response 객체를 새로 만든 후, 서블릿 객체 호출
  2. 개발자가 Request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용
  3. 개발자가 Response 객체에 HTTP 응답 정보를 편리하게 입력
  4. WAS가 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성

서블릿 컨테이너

  • 서블릿을 지원하는 WAS를 의미
  • WAS안에 있는 서블릿 컨테이너가 서블릿 객체의 생명주기 관리 (생성, 초기화, 호출, 종료)
  • 서블릿 객체는 싱글톤으로 관리됨
    • 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용
    • 공유 변수 사용할 때 주의해서 작성
  • 동시 요청을 위한 멀티 쓰레드 처리 지원


멀티 쓰레드

  • 멀티 쓰레드에 대한 부분은 WAS가 처리해준다
    • 개발자가 따로 신경쓰지 않아도 됨
    • 싱글 쓰레드 프로그래밍을 하듯이 편리하게 소스 코드를 개발할 수 있음

쓰레드

  • 애플리케이션 코드를 하나하나 순차적으로 실행하는 것
    • 쓰레드는 한 번에 하나의 코드 라인만 수행
    • 동시 처리가 필요하면 쓰레드를 추가로 생성 => 멀티 쓰레드
  • java의 경우 메인 메소드를 처음 실행하면 ‘main’이라는 이름의 쓰레드가 실행
  • 쓰레드가 없다면 java 애플리케이션 실행 불가능

프로세스와 쓰레드


프로세스 : 프로그램이 메모리에 올라오고 CPU를 할당받고 프로그램이 동적으로 실행되고 있는 상태
쓰레드 : 프로세스 내에서 실행되는 흐름의 단위 (프로세스 안에 여러개 존재 가능)

동시 처리를 위한 멀티 쓰레드 생성

01. 요청시 마다 쓰레드 생성

  • 장점
    • 동시 요청 처리 가능
    • 리소스(CPU, 메모리)가 허용할 때 까지 처리 가능
    • 하나의 쓰레드가 지연 되어도, 나머지 쓰레드는 정상 동작함
  • 단점
    • 쓰레드 생성 비용은 비쌈 => 매번 생성하면 응답 속도가 당연히 늦어짐
    • 컨텍스트 스위칭 비용이 발생
    • 쓰레스 생성 개수에 제한이 없음 => CPU, 메모리 임계점 초과시 서버 다운

02. 쓰레드 풀을 활용

  • 필요한 쓰레드를 쓰레드 풀에 보관하고 관리
  • 생성 가능한 쓰레드의 최대치를 미리 담아둠 (톰캣 : 기본 200개)
  • 사용
    • 쓰레드 필요시, 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼냄
    • 사용 종료하면 쓰레드 풀에 반납
    • 최대 쓰레드가 모두 사용 중인 경우, 요청을 거절하거나 대기하도록 설정
  • 장점
    • 미리 생성된 쓰레드를 사용하므로 생성, 종료 비용이 절약되고 응답 시간이 빠름
    • 너무 많은 요청이 들어와도 기존 요청을 안전하게 처리 가능
  • Tip
    • WAS의 조유 튜닝 포인트 : 최대 쓰레드 수
    • 장애 발생 시 => 클라우드 사용하면 서버부터 늘리고 튜닝하자
  • 쓰레드 풀의 적정 숫자
    • 성능 테스트를 최대한 실제 서비스와 유사하게 시도하자
    • Tool: 아파치 ab, 제이미터, **nGrinder **

컨텍스트 스위칭 (Context Switching)


쓰레드(프로세스)를 하나 사용하고 다음 쓰레드(프로세스)로 넘어가는 과정


HTML, HTTP API, CSR, SSR

HTML

  • 정적 리소스 & 동적 리소스 제공

HTTP API

  • 다양한 시스템에서 하여 데이터만 주고 받는 방식 (format: JSON)
  • UI 화면이 필요한 경우, 클라이언트가 별도 처리
  • 앱, 웹 클라이언트(javascript 사용 => React, Vue.js로 발전), 서버 to 서버 간의 통신에 사용

SSR (서버 사이드 렌더링)

  • 서버에서 최종 HTML을 생성하여 클라이언트에게 전달

  • 주로 정적인 화면에 사용
  • 관련 스택 : JSP, Thymeleaf

CSR (클라이언트 사이드 렌더링)

  • HTML 결과를 javascript를 사용하여 웹 브라우저에서 동적으로 생성해서 적용
  • 주로 동적인 화면에 사용 (웹을 마치 앱처럼 필요한 부분부분 변경할 수 있음)
  • ex) 구글 지도, Gmail, 구글 캘린더
  • 관련 스택 : React, Vue.js



인프런 - 김영한님의 Spring MVC 강의를 정리한 내용입니다.


김영한님 인프런 강의

댓글남기기