eelseungmin

[Spring] 웹 애플리케이션 이해

by eelseungmin

Web Server, Web Application Server

 

웹 서버

- HTTP 프로토콜 기반으로 동작

- HTML, CSS, JS, 이미지 등의 정적 리소스를 제공하는 게 본래 목적

- 예) Nginx, Apache

 

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

- HTTP 프로토콜 기반으로 동작

- 웹 서버처럼 정적 리소스를 제공하는 기능을 포함하면서도 프로그램 코드 기반의 로직을 실행하는 게 목적

- 예) 톰캣, Jetty, Undertow

 

차이

- 웹 서버는 정적 리소스 제공, WAS는 애플리케이션 로직 수행

- 다만 둘 다 서로의 기능을 포함하는 경우도 있기에 경계가 명확한 것은 아니다.

 

웹 시스템 구성

 

WAS, DB

- WAS가 웹 서버의 기능을 가지고 있으므로 둘 만으로도 웹 시스템을 구성할 수 있다.

- 다만 WAS가 모든 처리를 담당하게 되면 과부하가 발생할 수 있고, WAS에 장애가 발생하면 에러 페이지 노출이 불가능하다.

 

Web Server, WAS, DB

- 그래서 정적 리소스는 앞단의 웹 서버가, 애플리케이션 로직 수행은 뒷단의 WAS가 DB와 연계하여 처리하는 구조가 일반적이다.

- 이 구조에선 정적 리소스를 앞단에서 다 처리하므로 WAS가 애플리케이션 로직 수행에만 전담할 수 있기 때문에 WAS에 과부하가 발생할 가능성이 줄어든다.

- WAS나 DB에 장애가 발생하더라도 웹 서버에서 에러 페이지를 제공할 수 있다.

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

 

서블릿

 

WAS를 직접 구현 시

- 서버가 소켓을 연결해 TCP/IP 통신을 시작한다.

- HTTP 요청 메시지를 파싱해서 읽는다.

- 이때 HTTP 요청 메서드, URL, Content-Type, Body의 내용을 파싱한다.

- 비즈니스 로직을 실행한다.

- HTTP 응답 메시지를 생성한다.

- TCP/IP에 응답을 전달하고 소켓을 닫는다.

 

서블릿을 지원하는 WAS를 사용 시

- 위 복잡하면서도 반복적인 과정은 모두 WAS가 처리해 주고 개발자는 비즈니스 로직 개발에만 전념할 수 있게 된다. 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

 

서블릿 컨테이너

- 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.

- 서블릿 컨테이너는 서블릿 객체의 생명주기를 관리하고, 이 객체는 싱글톤으로 관리된다.

- 고객의 요청이 올 때마다 객체를 계속 생성하는 것은 비효율적이다.

- 따라서 최초 로딩 시점에 서블릿 객체를 만들어둔 뒤 계속해서 동일한 인스턴스로 대응한다.

- 동시 요청 처리를 위한 멀티스레드 방식을 지원한다.

 

동시 요청 처리

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술
스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

요청마다 스레드를 생성할 시

 

장점

- 동시 요청에 대응할 수 있다.

- CPU나 메모리 등의 리소스가 허용되는 한 처리 가능

- 하나의 스레드에서 처리가 지연되더라도 나머지 스레드에는 영향이 없다.

 

단점

- 스레드의 생성 비용이 비싸다.(즉 매번 새로 생성하면 응답 속도가 느려진다.)

- 스레드 간 Context Switching 비용이 발생한다.

- 스레드 생성에 제한이 없기 때문에 리소스를 넘어서는 요청을 받게 되면 서버가 죽는다.

 

스레드 풀

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술

- 스레드 생성 비용을 절약하기 위해 스레드 풀이라는 곳에 미리 일정 개수의 스레드를 생성해 둔다.

- 요청마다 이를 할당하고, 요청이 전부 처리되면 쓰던 스레드를 다시 풀에 반납하는 방식을 사용한다.

- 풀에 할당된 개수만큼만 스레드를 사용하고 이를 초과하는 요청에 대해선 거절하거나 대기를 설정한다.

 

실무 팁

- WAS의 주요 튜닝 포인트는 최대 스레드 수

- 너무 낮게 설정하면 서버 리소스는 여유로운데 클라이언트는 금방 응답이 지연된다.

- 너무 높게 설정하면 리소스 한계를 초과해 서버가 죽는다.

- 적정 숫자는 로직의 복잡도, CPU, 메모리 등 여러 요소에 따라 상이하므로 실제 서비스와 최대한 유사하게 성능테스트를 해보는 것이 좋다.

- JMeter, nGrinder

 

참조

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

블로그의 정보

eel.log

eelseungmin

활동하기