HTTP 기반으로 동작
정적 리소스 제공, 기타 부가기능
정적(파일) HTML, CSS, JS, 이미지, 영상
❗ 웹 서버도 프로그램을 실행하는 기능을 포함하기도 한다.
서버 기능 포함+ (정적 리소스 제공 가능)
프로그램 코드를 실행해서 애플리케이션 로직 수행
ex) 톰캣(Tomcat) Jetty, Undertow
아래 사진과 같이 정적 리소스는 웹 서버가 처리하고, 애플리케이션 로직같은 동적인 처리는 WAS가 처리하여 효율적으로 웹 시스템을 구성할 수 있다.
이 시스템 구성은 효율적인 리소스 관리가 가능하다.
만약, 정적 리소스 처리가 많을 경우? ➜ Web 서버 증설
만약, 애플리케이션 리소스 처리가 많을 경우? ➜ WAS 증설
❗ WAS 혹은 DB 장애 시, WEB 서버에서 오류 화면 제공 가능
서블릿의 경우, 초록색 박스 안 과정들을 제외한 나머지 과정을 처리해줌으로 개발자는 HTTP 스펙을 매우 편리하게 사용이 가능하다.
@WebServlet(name="helloServlet", urlPatterns="/hello")
public classs HelloServlet extends HttpServlet {
@Override
protected void service(HttpsServletRequest req, HttpServletResponse res) {
// 애플리케이션 로직
}
}
urlPatterns
의 URL이 호출되면 서블릿 코드가 실행
HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServletRequest
HTTP 응답 정보를 편리하게 제공할 수 있는 HttpServletResponse
HTTP 요청시
톰캣처럼 서블릿을 지원하는 WAS = 서블릿 컨테이너
서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기 관리
서블릿 객체는 싱글톤으로 관리
-고객의 요청이 올 때마다 계속 객체를 생성하는 건 비효율
-최초 로딩 시점에서 서블릿 객체를 미리 만들어두고 재활용
-모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근
-공유 변수 사용 주의 ❗
-서블릿 컨테이너 종료시 함께 종료
JSP도 서블릿으로 변환 돼서 사용
동시 요청을 위한 멀티 쓰레드 처리 지원⭐️⭐️⭐️
애플리케이션 코드를 순차적으로 실행하는 것은 쓰레드로, 한 번에 하나의 코드 라인만 수행
쓰레드가 없다면 자바 애플리케이션 실행이 불가능
동시 처리가 필요하면 쓰레드를 추가로 생성
동시 요청의 경우, 요청이 올 때마다 쓰레드를 생성하면 쓰레드가 너무 많이 생성되면 리소스가 임계점을 넘어 서버가 죽을 수도 있고, 컨텍스트 스위칭 비용이 발생하여 비효율적이다.
그래서 쓰레드를 최대치를 설정해놓고 쓰레드 풀 에 보관하고 관리 ❗
만약에 최대 쓰레드가 모두 사용중이어서 쓰레드 풀에 쓰레드가 없다면 ?
➜ 기다리는 요청은 거절하거나 특정 숫자만큼만 대기하도록 설정하여 해결 !
🖐️ 참고하면 좋을 실무팁 🖐️
- 동시 요청이 많은 상황에서 최대 쓰레드(max thread) 너무 낮게 설정하면?
➜ 서버 리소스는 여유롭지만, 클라이언트는 금방 응답 지연
- 동시 요청이 많은 상황에서 최대 쓰레드(max thread) 너무 높게 설정하면?
➜ 동시 요청이 많으면, CPU, 메모리 리소스 임계점 초과로 서버 다운
쓰레드를 생성하고 종료하는 비용(CPU)이 절약되고, 응답 시간이 빠름.
생성 가능한 쓰레드의 최대치가 있어, 많은 요청이 있어도 기존 요청은 안전하게 처리 가능
❗ WAS의 멀티 쓰레드 지원으로 개발자는 싱글 쓰레드 프로그래밍을 하듯이 편리하게 소스 코드를 개발 가능하지만, 싱글톤 객체(서블릿, 스프링 빈)는 주의해서 사용
📌 본 포스트는 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 통해 학습한 내용을 요약 및 정리한 것입니다.
우 was ㅋ 씨