[Spring] 웹 어플리케이션의 이해

코코코딩을 합시다·2024년 8월 12일

Spring CS

목록 보기
6/6

HTTP

클라이언트-서버 모델에서 클라이언트와 서버간의 요청과 응답을 규정하는 규약.

대표적인 특징으론 statless라는 점이다. 각 요청은 독립적이며 서버는 이전 요청에 대한 정보를 유지하지 않는다.

URL을 통해 특정 리소스에 접근할 수 있으며 URL은 서벗에서 리소스의 특정 위치를 나타낸다.

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

image

웹 서버 (WS)

HTTP 요청에 응답하여 정적 데이터 (이미지, 파일, 텍스트 등)를 클라이언트에 제공하며, IIS(Window 전용 웹서버), Nginx 등이 포함된다.

동작 방식

  1. 브라우저는 URL을 사용하여 서버의 IP 주소를 찾습니다.
  2. 브라우저는 정보에 대한 HTTP 요청을 보냅니다.
  3. 웹 서버는 경로(URL)에 따라 파일 시스템에서 관련 데이터를 찾습니다.
  4. 웹 서버는 HTTP 응답으로 HTML 페이지, 이미지, 비디오 또는 파일과 같은 정적 콘텐츠를 브라우저에 반환합니다.
  5. 그러면 브라우저가 정보를 표시합니다.

웹 애플리케이션 서버 (WAS)

알고리즘, DB 조회, 비즈니스 로직 등을 처리하여 동적 컨텐츠를 제공한다.

웹 서버와 웹 컨테이너 로 구성된다.

Spring 은 독립 실행형 애플리케이션을 만들기 위해 애플리케이션 서버(Apache Tomcat)를 내장하고 있고, 따라서 스프링 서버라함은 일반적으로 스프링에 내장된 WAS를 지칭한다.

웹 컨테이너란?

동적인 데이터를 처리하여 정적인 데이터로 생성해주는 소프트웨어 모듈

서블릿과 JSP를 실행하는 환경을 제공하며, 서블릿 컨테이너라고도 불린다.

동작 방식

  1. 브라우저는 URL을 사용하여 서버의 IP 주소를 찾습니다.
  2. 브라우저는 정보에 대한 HTTP 요청을 보냅니다.
  3. 웹 서버는 요청을 애플리케이션 서버로 전송합니다.
  4. 애플리케이션 서버는 비즈니스 로직을 적용하고 다른 서버 및 서드 파티 시스템과 통신하여 요청을 수행합니다.
  5. 애플리케이션 서버는 새 HTML 페이지를 렌더링하고 이를 응답으로 웹 서버에 반환합니다.
  6. 웹 서버는 브라우저에 응답을 반환합니다.
  7. 브라우저가 정보를 표시합니다.

웹 서버와 웹 어플리케이션 서버를 분리하는 이유

image

  • 기능 분리
    • WAS는 로직 처리만으로도 바쁘기 때문에 단순 정적 컨텐츠 조회는 WS에게 책임을 위임해 서버 부하를 줄인다.
  • 보안 강화
    • SSL 에 대한 암복호화 처리에 WS 사용
  • 로드 밸런싱
    • 여러 WAS를 두어 한 대에 오류가 발생해도 다른 WAS를 사용하면 무중단 운영이 가능하다.

Servlet

image

서블릿이란 동적 웹 페이지를 만들 때 사용되는 자바 기반의 웹 어플리케이션 프로그래밍 기술이다.

서블릿은 웹 요청과 응답의 흐름을 간단한 내장 메서드의 호출만으로 체계적으로 다룰 수 있게 해준다.

서블릿 컨테이너가 서블릿 객체를 생성하고 관리하며, 이는 WAS에 포함되어 있다.

동작 과정

image

  1. 클라이언트가 URL을 입력하면 Http 요청이 서블릿 컨테이너로 전달
  2. 서블릿 컨테이너는 HttpServletRequest, HttpServletResponse 객체를 생성한다.
  3. web.xml이 어느 서블릿에 대해 들어온 요청인지 탐색
  4. 해당 서블릿에서 service() 메소드 실행
  5. doGet() 또는 doPost() 호출
  6. 동적 페이지 생성 후 HttpServletResponse 객체에 응답 전송
  7. HttpServletRequest, HttpServletResponse 객체 소멸

생명주기

서블릿 또한 자바 클래스이므로 초기화부터 소멸까지 생명주기 과정을 거치며, 싱글톤으로 관리된다.

  • 요청이 들어올 시 서블릿 인스턴스가 메모리에 존재하지 않으면 서블릿 컨테이너는 해당 서블릿을 로드하고 init() 메소드를 통해 초기화한 후 적재한다.

  • 이미 서블릿 인스턴스가 존재하면 service() 메소드를 통해 요청에 대한 응답이 doGet(), doPost()로 나뉘어 response가 생성된다.

  • 컨테이너가 서블릿을 종료시킬때에는 destroy()를 통해 종료된다.

서블릿 컨테이너와 WAS

서블릿 컨테이너와 WAS는 종종 혼용되어 사용되지만 약간의 차이점이 있다.

Web Server와 Web Container(Sevlet Container)를 합친 것이 WAS이며,

서블릿 컨테이너는 서블릿 클래스를 관리하며 HTTP 요청에 따라 HttpServletRequest, HttpServletResponse 두 객체를 생성하여 post, get여부에 따라 동적인 페이지를 생성하여 응답하는 역할을 한다.

WAS 와 멀티쓰레드

WAS는 수많은 클라이언트 요청을 동시에 처리해야하므로 멀티 쓰레딩을 사용하여 병렬처리한다.

이를 통해 개발자는 멀티 쓰레드 관련 코드를 신경 쓰지 않아도 되며, (마치 싱글쓰레드 프로그래밍 하듯)
서버는 높은 동시성을 유지하면서 많은 수의 사용자 요청을 효율적을 처리할 수 있다.

쓰레드 풀

image

쓰레드는 생성 비용이 매우 비싸다.

WAS는 미리 생성된 일정 수의 쓰레드를 유지하고 들어오는 요청에 대해서는 사용 가능한 쓰레드를 할당한다.

이를 통해 쓰레드 생성 비용을 줄일 수 있다.

따라서 WAS의 주요 튜닝 포인트는 최대 쓰레드 수가 된다.

너무 낮으면 서버 리소스는 여유롭지만 클라이언트에 대한 응답이 지연될 수 있고, 너무 높으면 동시 요청이 많을 때 임계점 초과로 서버가 다운될 수 있다.

profile
좋아하는 걸로 밥 벌어먹기

0개의 댓글