[Spring] 웹 애플리케이션 이해
by eelseungminWeb 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에 장애가 발생하더라도 웹 서버에서 에러 페이지를 제공할 수 있다.
서블릿
WAS를 직접 구현 시
- 서버가 소켓을 연결해 TCP/IP 통신을 시작한다.
- HTTP 요청 메시지를 파싱해서 읽는다.
- 이때 HTTP 요청 메서드, URL, Content-Type, Body의 내용을 파싱한다.
- 비즈니스 로직을 실행한다.
- HTTP 응답 메시지를 생성한다.
- TCP/IP에 응답을 전달하고 소켓을 닫는다.
서블릿을 지원하는 WAS를 사용 시
- 위 복잡하면서도 반복적인 과정은 모두 WAS가 처리해 주고 개발자는 비즈니스 로직 개발에만 전념할 수 있게 된다.
서블릿 컨테이너
- 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.
- 서블릿 컨테이너는 서블릿 객체의 생명주기를 관리하고, 이 객체는 싱글톤으로 관리된다.
- 고객의 요청이 올 때마다 객체를 계속 생성하는 것은 비효율적이다.
- 따라서 최초 로딩 시점에 서블릿 객체를 만들어둔 뒤 계속해서 동일한 인스턴스로 대응한다.
- 동시 요청 처리를 위한 멀티스레드 방식을 지원한다.
동시 요청 처리
요청마다 스레드를 생성할 시
장점
- 동시 요청에 대응할 수 있다.
- CPU나 메모리 등의 리소스가 허용되는 한 처리 가능
- 하나의 스레드에서 처리가 지연되더라도 나머지 스레드에는 영향이 없다.
단점
- 스레드의 생성 비용이 비싸다.(즉 매번 새로 생성하면 응답 속도가 느려진다.)
- 스레드 간 Context Switching 비용이 발생한다.
- 스레드 생성에 제한이 없기 때문에 리소스를 넘어서는 요청을 받게 되면 서버가 죽는다.
스레드 풀
- 스레드 생성 비용을 절약하기 위해 스레드 풀이라는 곳에 미리 일정 개수의 스레드를 생성해 둔다.
- 요청마다 이를 할당하고, 요청이 전부 처리되면 쓰던 스레드를 다시 풀에 반납하는 방식을 사용한다.
- 풀에 할당된 개수만큼만 스레드를 사용하고 이를 초과하는 요청에 대해선 거절하거나 대기를 설정한다.
실무 팁
- WAS의 주요 튜닝 포인트는 최대 스레드 수
- 너무 낮게 설정하면 서버 리소스는 여유로운데 클라이언트는 금방 응답이 지연된다.
- 너무 높게 설정하면 리소스 한계를 초과해 서버가 죽는다.
- 적정 숫자는 로직의 복잡도, CPU, 메모리 등 여러 요소에 따라 상이하므로 실제 서비스와 최대한 유사하게 성능테스트를 해보는 것이 좋다.
- JMeter, nGrinder
참조
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
'Note > Spring' 카테고리의 다른 글
@ResponseBody와 ResponseEntity, 어떤 걸 사용할까? (0) | 2024.08.18 |
---|---|
[Spring] DB 연결 이해 (0) | 2024.05.05 |
[Spring] Enum으로 요청, 검증, 응답하기 (1) | 2024.02.25 |
[Spring] Bean Validation 사용 시 발생하는 예외를 ControllerAdvice로 관리하기 (1) | 2024.02.09 |
블로그의 정보
eel.log
eelseungmin