- HTTP를 사용하여 HTML, TEXT, IMAGE, 음성, 영상, 파일, JSON, XML 등 다양한 형태의 데이터를 주고 받을 수 있다. - 서버간에 데이터를 주고 받을 때에도 대부분 HTTP를 사용
■ 웹 서버(Web Server)
- HTTP 기반으로 동작 - 정적 리소스를 제공 - 웹 서버의 대표적인 예로는 NGINX와 APACHE가 있다.
■ 웹 애플리케이션 서버(WAS - Web Application Server)
- HTTP 기반으로 동작 - 웹 서버 기능을 포함 + 정적 리소스 제공 기능 - 프로그램 코드를 실행해서 애플리케이션 로직을 수행 - 동적 HTML, HTTP API, 서블릿, JSP, 스프링 MVC - WAS의 대표적인 예로는 Tomcat(톰켓)이 있다. - WAS에서는 멀티 쓰레드를 지원 - 개발자는 싱글 쓰레드 프로그래밍을 하듯이 편리하게 소스 코드를 개발 - 멀티 쓰레드 환경이므로 싱글톤 객체(서블릿, 스프링 빈)는 주의해서 사용
■ 웹 시스템 구성 - WEB, WAS, DB
- 정적 리소스는 웹 서버가 처리 - 웹 서버는 애플리케이션 로직같은 동적인 처리가 필요하면 WAS에 요청을 위임 - WAS는 중요한 애플리케이션 로직 처리를 전담 - WAS, DB 장애시 WEB 서버가 오류 화면을 제공하는 것이 가능
■ 서블릿(Servlet)
서블릿이란 Dynamic Web Page를 만들 때 사용되는 자바 기반의 웹 애플리케이션 프로그래밍 기술이다. 웹을 만들때는 다양한 요청(Request)과 응답(Response)이 있고, 이러한 요청과 응답에는 규칙이 존재한다. 서블릿은 이러한 웹 요청과 응답의 흐름을 간단한 메서드 호출만으로 체계적으로 다룰 수 있게 해주는 기술이다.
1) 특징
- urlPatterns의 URL이 호출되면 서블릿 코드가 실행 - HTTP 요청 정보를 편리하게 사용할 수 있는 HttpServletRequest - HTTP 응답 정보를 편리하게 제공할 수 있는 HttpServletResponse - 개발자는 HTTP 스펙을 매우 편리하게 사용할 수 있다. 2) HTTP 요청, 응답 흐름 - HTTP 요청 시, WAS에서는 Request, Response 객체를 새로 만들어서 서블릿 객체를 호출 - 개발자는 Request 객체에서 HTTP 요청 정보를 편리하게 꺼내서 사용 - 개발자는 Response 객체에 HTTP 응답 정보를 편리하게 입력 - WAS는 Response 객체에 담겨있는 내용으로 HTTP 응답 정보를 생성 - 서블릿 컨테이너에서는 서블릿의 생성과 호출을 관리한다.
3) 서블릿/ 서블릿 컨테이너 - 톰캣처럼 서블릿을 지원하는 WAS를 서블릿 컨테이너라고 한다. - 서블릿 컨테이너는 서블릿 객체를 생성, 초기화, 호출, 종료하는 생명주기를 관리 - 서블릿 객체는 싱글톤으로 관리 - 최초 로딩 시점에 서블릿 객체를 미리 만들어두고 재활용 - 모든 고객 요청은 동일한 서블릿 객체 인스턴스에 접근 - 공유 변수 사용에 주의 - 서블릿 컨테이너 종료시 함께 종료 - JSP도 서블릿으로 변환되어 사용 - 동시 요청을 위한 멀티 쓰레드 처리를 지원한다.
■ 쓰레드(Thread)
- 애플리케이션 코드를 하나하나 순차적으로 실행하는 것을 쓰레드라고 한다. - 자바 메인 메서드를 처음 실해하면 main이라는 이름의 쓰레드가 실행 - 쓰레드가 없다면 자바 애플리케이션 실행이 불가능 - 쓰레드는 한번에 하나의 코드 라인만 수행 - 동시 처리가 필요하면 쓰레드를 추가로 생성
1) 단일 요청 - 쓰레드 하나만 사용 - 단일 요청이 들어오면 하나의 쓰레드가 할당되어 서블릿에게 요청을 보낸다.
2) 다중 요청 - 쓰레드 하나만 사용 - 다중 요청이 들어올때, 하나의 쓰레드만을 사용하게 되면 요청1이 들어와서 처리 중이면 요청 2는 쓰레드를 대기하고 있으여하므로 처리가 지연된다. 3) 다중 요청 - 요청 마다 쓰레드를 생성 - 요청이 들어올 때마다 쓰레드를 생성할 경우 리소스(CPU, 메모리)가 허용할 때까지 처리가 가능하다. - 동시 요청을 처리할 수 있으며, 하나의 쓰레드가 지원되더라도, 나머지 쓰레드는 정상적으로 동작 - 하지만 쓰레드 생성 비용이 매우 비싸며, 고객 요청이 너무 많을 경우, CPU, 메모리 임계점을 넘어서 서버가 죽을 수 있다. 4) 다중 요청 - 쓰레드 풀 생성 - 요청이 올때마다 쓰레드를 생성해서 처리할 경우 발생할 수 있는 단점을 보안 - 쓰레드를 쓰레드 풀에 보관하고 관리 - 쓰레드가 필요하면, 이미 생성되어 있는 쓰레드를 쓰레드 풀에서 꺼내 사용 - 사용을 종료하면 쓰레드 풀에 해당 쓰레드를 반납 - 최대 쓰레드가 모두 사용중이여서 사용 가능한 쓰레드가 풀에 없다면, 기다리는 요청은 거절하거나 대기할 수 있도록 설정이 가능 - 쓰레드가 미리 생성되어 있으므로, 쓰레드를 생성하고 종료하는 비용(CPU)이 절약되고, 응답 시간이 빠르다. - 생성 가능한 쓰레드의 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있다.