웹서버(WebServer)?
- 클라이언트에서 서버로 데이터를 전송하고, 응답받을 때 HTTP 기반으로 동작
- 정적 리소스와 기타 부가 기능을 제공
- 클라이언트가 HTML을 웹서버로 HTTP를 통해 요청을 하면, 서버는 HTTP를 통해 정적 리소스인 html을 응답해준다.
- HTTP를 통해 요청과, 응답을 할 수 있다.
- ex) NGINX, APACHE
👧 정적리소스? : HTML, CSS, JS,이미지, 영상과 같은 것을 의미한다.
웹 애플리케이션 서버(WAS - Web Application Server)?
- HTTP 기반으로 동작
- 웹서버 기능과 동적인 파일도 지원한다.
- ex) 톰캣(Tomcat) Jetty, Undertow
👧 웹서버와 차이점이 뭔가요?
- 프로그램 코드를 실행해서 로직을 수행한다. (JSON, 서블릿, JSP, 스프링 MVC)
웹서버(Web Server) VS 웹 애플리케이션 서버(WAS)
사실 둘의 용어의 경계가 모호하다!
Web Server | Was |
정적 리소스 파일 | 정적 리소스, 애플리케이션 로직 |
애플리케이션 코드를 실행되는데 특화 |
👧 WAS가 Web Server의 역할까지 하면, WAS로만 구성하면 되지 않나요?
- WAS로만 구성 되면, 너무 많은 역할을 담당해 서버 과부하에 우려가 있어 큰 시스템 구축하기에는 부담이 있다
일반적인 시스템 구성 - WEB, WAS, DB
- 정적 리소스는 웹 서버가 처리
- 웹 서버는 동적인 처리가 필요하면 WAS에 위임
- WAS는 중요한 애플리케이션 로직을 처리
서블릿
👧 서블릿 없이 비즈니스 로직 실행 (데이터베이스에 저장 요청)을 해야한다면?
일반적인 웹 애프리케이션은 서버가 직접 구현하며, TCP/ IP 연결을 대기 상태, HTTP 메소드는 데이터를 처리하는 로직과 함께 부가적인 업무를 처리한다. 비즈니스 로직 외에 부가적인 업무도 구현해야해서 매우 비효율적이다.
부가적인 업무를 편리하게 돕는 것이 서블릿! 비즈니스 로직 실행에 좀 더 집중하여 처리할 수 있게 도와준다.
- HTTP 스펙을 매우 편리하게 사용할수 있도록 지원해준다.
- HttpServletRequest : HTTP 요청 정보를 편리하게 사용
- HttpServletResponse : HTTP 응답 정보를 편리하게 제공
[전체 동작 과정]
1. 웹 브라우저에서 요청을 한다.
2. WAS 서버에서 HTTP 요청 메시지를 기반으로 request , response객체를 생성한다.
- 개발자는 Request 객체에서 HTTP 요청정보를, Response 객체에서 HTTP 응답 정보를 편리하게 사용한다.
3. WAS는 response 객체 정보로 HTTP 응답을 생성해서 웹 브라우저한테 응답한다.
4. 웹브라우저는 응답받은 정보로 화면을 구성한다.
서블릿 컨테이너
- 톰캣처럼 서블릿을 지원하는 WAS
- 서블릿 객체를 생성, 초기화, 호출, 종료 생명 주기 관리
- 서블릿 객체는 싱글톤으로 관리
- JSP도 서블릿으로 변환 되어 사용
- 동시 요청을 위한 멀티 쓰레드 처리 지원
동시 요청 - 멀티 쓰레드
HTTP에서 요청을 받아 응답을 처리할때, WAS에서 서블릿을 실행해 부가적인 기능을 처리하고, 응답 객체를 만들어 응답을 하게 된다.
여기서, 서블릿 객체를 호출하는 것을 Thread라고 한다.
- 애플리케이션 코드를 순차적으로 실행하는 것(자바 메인 메서드 실행하면 main이라는 이름의 쓰레드가 실행된다)
- 쓰레드가 없으면 자바 애플리케이션은 실행이 불가능하다.
- 쓰레드는 한번에 하나의 코드 라인만 수행한다.
- 동시 처리가 필요하면 쓰레드를 추가로 생성해야한다.
👧 요청마다 쓰레드를 생성하면?
[장점]
- 동시 요청 처리와, 리소스가 허용할 때 까지 처리가 가능하다.
-하나의 쓰레드가 지연 되어도, 나머지 쓰레드는 정상 동작한다.
[단점]
- 쓰레드 생성 비용이 상당히 크며, 한번에 많은 요청 발생 시 서버가 감당할 수 있는 임계점을 넘을 수 있다.
- 쓰레드는 컨텍스트 스위칭 비용이 발생한다.
-->미리 쓰레드를 생성해서 필요할 때마다 사용하는 방식을 사용한다. (쓰레드 풀)
쓰레드 풀
- 미리 쓰레드를 생성, 보관, 관리한다.
- 쓰레드 풀에 생성 가능한 쓰레드의 최대치를 관리한다.
- 다수의 요청 발생 시, 생성 된 쓰레드를 사용하고, 모든 작업이 완료 되면 쓰레드 풀로 반납한다.
- 미리 생성 된 쓰레드를 사용해 쓰레드 생성 시간이 줄고, 응답 시간이 빨라진다. =(WAS의 주요 성능 포인트)
- 쓰레드 풀의 적정 숫자는 로직의 복잡도, 서버의 자원들의 사양에 따라 달라지므로 충분한 성능 테스트를 통해 최대 쓰레드 수를 결정해야한다.
REFERENCE
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
'공부 > Spring 핵심 원리' 카테고리의 다른 글
빈 스코프의 종류와 사용법 알아 보기 (0) | 2021.09.05 |
---|---|
빈 생명주기 콜백을 알아보자 (0) | 2021.09.02 |
다양한 의존 관계 자동 주입과 사용법들을 알아보자 (0) | 2021.09.01 |
컴포넌트 스캔으로 의존 관계를 자동 주입해보자. (0) | 2021.08.31 |
싱글톤 패턴을 보장해주는 스프링 컨테이너와 @Configuration (0) | 2021.08.29 |