웹 서버와 WAS

웹 서버 : HTTP 프로토콜을 기반으로, 클라이언트의 요청을 서비스하는 기능을 담당
- 요청에 맞게 2가지 기능 중 선택해서 수행
- 정적 컨테츠 제공 : WAS를 거치지 않고 바로 제공
- 동적 컨텐츠 제공을 위한 요청 전달 : 클라이언트 요청을 WAS에 보내고, WAS에서 처리한 결과를 클라이언트에게 전달
- 웹 서버 종류 : Apache, Ngnix 등
WAS(Web Application Server) : DB 조회 및 다양한 로직 처리 요구시 동적인 컨텐츠를 제공하기 위해 만들어진 App서버
- HTTP를 통해 애플리케이션을 수행하는 미들웨어
- WAS는 웹 컨테이너 혹은 서블릿 컨테이너라고도 불림
- 역할 : 엡 서버 + 웹 컨테이너
- 주요기능
- 프로그램 실행 환경 및 DB 접속 기능 제공
- 여러 트랜잭션 관리 기능
- 업무 처리하는 비지니스 로직 수행
- WAS 종류 : Tomcat등
서블릿
: 웹 서버가 동적인 페이지를 제공할 수 있도록 도와주는 애플리케이션
- 일명 동적인 페이지를 생성하는 애플리케이션, CGI
- CGI : 특별한 라이브러리나 도구를 의미하는 것은 아니고, 별도로 제작된 웹 서버와 프로그램 간의 교환 방식
특정
- 클라이언트 요청에 대해 동적으로 작동하는 웹 애플리케이션 컴포넌트
- HTML을 사용하여 요청에 응답
- Java Thread를 이용하여 동작
- MVC패턴에서 Controller로 이용
- UDP보다 처리 속도가 느림
- HTML 변경 시 Servlet을 재컴파일 해야하는 단점
동작 방식

- 클라이언트가 URL을 입력하면 HttpRequest가 Servlet Container로 전송(클라이언트 요청)
- HTTP 요청을 처리하기 위한 HttpServletRequest 객체, HttpServletRespond객체 생성
- web.xml을 기반으로 요청된 URL이 어느 서블릿 클래스에 대한 요청인지 찾음
- 찾은 서블릿 클래스가 서블릿 컨테이너에서 실행된 적 있는지 혹은 메모리에 생성된 인스턴스가 있는지 체크
4.1. 처음 실행 : 인스턴스를 생성한 후 init()호출 -> 초기화 후 스레드 생성
4.2. 이미 실행 : 기존 인스턴스에 스레드 생성(서블릿 인스턴스는 서블릿 컨테이너 당 하나만 존재)
- 각 스레드의 service() 호출 후 GET/POST 방식에 따라 doGet()/doPost() 호출
- 2.에서 생성된 HttpServletRequest객체와 HttpServletRespond객체를 인자로 전달
- doGet()/doPost() 로직에서 생성된 동적 웹 페이지 결과물을 HttpServletResponse 객체에 담김
- HttpServletResponse 객체를 서블릿 컨테이너에서 HTTP 형태로 바뀌어 웹 서버로 전송
- HttpServletRequest 객체와 HttpServletResponse 객체의 메모리 소멸 및 스레드 종료
서블릿 컨테이너/서블릿 엔진
서블릿 컨테이너 : 서블릿을 관리해주는 컨테이너
- 서블릿을 만들었다고 스스로 작동한는 것X, 관리 필요
- 서블릿이 어떠한 역할을 수행하는 정의서라면, 서블릿 컨테이너는 그 정의서를 수행한다고 볼 수 있음
서블릿 엔진 : 클라이언트의 요청(Request)을 받아 응답(Response)할 수 있게 웹 서버와 소켓으로 통신하며 JSP와 서블릿이 작동하는 환경 제공 (톰켓)
역할
-
웹 서버와 통신 지원
- 비지니스 요구사항에 따라 로직이 변경될 때마다 처음부터 끝까지 소켓 프로그래밍, HTTP파싱, 스레드 풀 관리 등 복잡한 과정을 생략할 수 있게하여, 개발자는 서블렛에 구현해야 할 비지니스 로직에 초점을 두게 도와줌
-
서블릿 생명 주기 관리
- 서블릿 클래스를 로딩하여 인스턴스화 후 초기화 및 요청이 들어오면 적절한 서블릿 메소드 호출
- 서블릿이 생명을 다하면 GC(Garbage Collection)을 진행
-
멀티 스레드 지원 및 관리
- 요청이 들어올 때마다 자바 스레드 생성, HTTP 서비스 메소드를 실행하고 나면 스레드는 자동으로 죽게됨, 원래는 스레드를 관리 해야 하지만 서버가 다중 스레드를 생성 및 운영
- 스레드 안정성
-
선언적인 보안 관리
- 보안 관련 내용을 서블릿 클래스/자바 클래스에 구현X
- 보안 관리는 XML 배포 서술자에 모두 기록(보안 관련 수정할 일이 생겨도 자바 소스 코드를 수정하여 다시 컴파일 할 필요X)
참고 : 서블릿1//서블릿2