출처 - https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/dashboard
웹은 HTTP기반의 통신을 하고, HTTP 메시지를 이용하여 모든 데이터를 주고 받을 수 있다.
- HTML,TXT
- IMAGE,음성, 영상, 파일
- JSON,XML(API)
- 거의 모든 형태의 데이터 전송 가능
- 서버 간에 데이터를 주고 받을 때도 대부분 HTTP사용
- HTTP를 기반으로 동작
- 정적 리소스 제공, 기타 부가기능
- 정적 리소스: 정적 HTML, CSS, JS, 이미지, 영상
- 예시) Nginx,Apache
클라이언트가 HTTP요청을 하면 웹 서버에서 해당 정적 파일을 응답해주는 구조
- HTTP를 기반으로 동작
- 웹 서버 기능 포함 + (정적 리소스 제공 기능)
- ⭐ 프로그램 코드를 실행해서 애플리케이션 로직을 수행한다.
- 동적 HTML, HTTP API(JSON)
- 서블릿, JSP, 스프링 MVC- 예시) 톰캣, Jetty, Undertow 등
동적 파일(ex-class)을 준다는 것이 차이점
- 둘의 용어와 경계가 모호하다.
- 웹 서버도 프로그램을 실행하는 기능을 포함하기도 한다.
- WAS도 웹 서버의 기능을 제공한다.- 자바에서는 서블릿 컨테이너를 제공하면 WAS라고 한다.
- 요즘에는 서블릿 없이 자바코드를 실행하는 서버 프레임워크도 존재- WAS는 애플리케이션 코드를 실행하는데 최적화
- WAS,DB만으로 시스템 구성 가능
- WAS는 정적 리소스, 애플리케이션 로직을 모두 제공이 가능하다.
- 그러나 WAS와 DB만으로 구성을 한다면?
=> WAS가 너무 많은 역할을 담당, 서버 과부하 우려
html,css,js와 같은 정적 리소스는 값이 싸다. 그러나 애플리케이션 로직은 굉장히 비싸다.
- 가장 비싼 애플리케이션 로직이 정적 리소스 때문에 수행이 어려워질 수 있다.
정적리소스 응답에 WAS가 빼앗기기 때문에 동적리소스를 처리하지 못할 수 있다.
- ❓ 만약 WAS가 죽는다면 (WAS는 잘 죽는다..)
=> 오류 화면 노출이 불가능해진다.(오류페이지는 정적리소스지만, 정적리소스도 WAS에서 관리하기 때문)
⭐위에서의 문제를 Web Server - WAS - DB구조로 해결한다.⭐
- 정적 리소스는 웹 서버가 처리를 한다.
- WAS,DB 장애 시 Web서버에서 오류 화면 제공이 가능하다.
- 그러다가 애플리케이션 로직같은 동적인 처리가 필요하면 WAS에 요청을 위임한다.
=> WAS는 중요한 애플리케이션 로직 처리 전담
- 효율적인 리소스 관리가 가능하다.
- 정적인 리소스가 많이 사용되면 웹 서버 증설
- 애플리케이션 리소스가 많이 사용되면 WAS 증설
- 웹 애플리케이션에서 서버를 직접 구현할 때
HTML Form을 이용해서 데이터 전송을 한다고 했을 때 비즈니스 로직 실행 전후로 많은 처리들을 해주어야 한다.😢
⭐서블릿은 비즈니스 로직을 제외한 나머지 부분을 모두 자동화 해준다⭐.
서블릿 특징
- HttpServlet을 상속받아야 한다.
- 해당 서블릿은 service method를 이용해서 실행이 된다.
- request와 response 파라미터를 통해 요청 정보와 응답 정보를 편리하게 사용하고 제공할 수 있다.
- WebServlet 어노테이션에서 name을 통해서 서블릿 컨테이너에 서블릿을 등록할 수 있다.
- WebServlet 어노테이션에서 urlPatterns의 url이 호출되면 서블릿 코드가 실행된다.
WAS안에는 서블릿 컨테이너가 존재
서블릿 객체를 서블릿 컨테이너가 자동으로 생성, 호출, 관리, 종료 등을 해준다.(생명주기들을 관리해준다.)웹 브라우저에서 'localhost:8080/hello'url을 호출하면
⭐서블릿에서는 request,response 객체를 "새로" 만들어서 전달을 해준다.⭐
서블릿에서 해당 요청을 실행하고 response에 헤더, 바디를 추가해서 전달해준다.
⭐WAS는 response 객체에 담겨있는 내용으로 HTTP응답정보를 생성⭐
- 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다.
컨테이너는 생명주기를 관리해준다.
- 서블릿 객체는 "싱글톤"으로 관리한다.
왜 이렇게 사용하냐?
- 사용자마다 요청과 응답은 다르기 때문에 response,request객체는 매 번 다르게 생성이 된다.
- 그런데 helloServlet이라는 것은 굳이 매 번 생성할 필요가 없다.(재사용을 한다.)
- 최초 로딩 시점에서 서블릿 객체를 미리 만들어두고 재활용한다.
- 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근한다.
- ⭐⭐공유 변수 사용 주의⭐⭐
싱글톤을 사용할 때는 공유 변수를 사용하는데 굉장히 주의해야 한다.
- JSP도 서블릿으로 변환되어서 사용
- ⭐동시 요청을 위한 멀티 쓰레드 처리를 지원한다.⭐
서블릿 객체는 누가 호출? => 쓰레드가 호출을 한다.
자바의 메인 메서드를 처음 실행하면 main이라는 이름의 쓰레드가 실행된다.
동시처리가 필요하면 쓰레드를 추가적으로 생성해줘야 한다.
요청1이 들어오고, 그 다음 요청2가 들어온 상황
요청2는 요청1이 완료될 때 까지 기다려야 한다.
그런데 요청1이 완료가 되면 쓰레드를 놔줘야 하는데 못하고 있는 상황이라면 요청1,2 둘 다 처리를 못하게 된다.
방법 1) 신규 쓰레드를 생성해준다.
요청 마다 쓰레드를 생성해 줄 때의 장단점
생성하고 없애는 방식으로 WAS를 구현
- 장점
- 동시요청을 처리할 수 있다.
- 리소스(CPU,메모리)가 허용할 때 까지 처리 가능
- 하나의 쓰레드가 지연 되어도, 나머지 쓰레드는 정상 동작한다.
- 단점
- 쓰레드는 생성비용이 매우 비싸다.
- 컨텍스트 스위칭 비용이 발생한다.
- 쓰레드 생성에 제한이 없다. (고객 요청이 너무 많이 오면, CPU,메모리 임계점을 넘어서 서버가 죽을 수 있다.)
방법 2) 쓰레드 풀
해결방안
내부에 쓰레드 풀이 존재
풀 안에 쓰레드를 미리 만들어줌
요청이 올 때 마다 쓰레드 풀에서 가져오고 요청이 완료되면 쓰레드 풀에 반납을 한다.
- 만약 쓰레드 풀에 있는 모든 쓰레드를 사용하고 있으면?
👉요청을 대기하거나 거절할 수 있다.(대기 : 일정 요청 개수만 대기를 받아서 쓰레드가 반납되면 다시 수행할 수 있도록 한다.)
쓰레드 풀에 있는 쓰레드의 개수도 중요하다.
4,5는 생략...