정적 페이지Static page
와 동적 페이지dynamic page
개념을 먼저 알아야 해요.
바뀌지 않는 페이지에요. 웹 서버는 파일 경로 이름을 받아 경로와 일치하는 파일 콘텐츠를 반환해요.
항상 동일한 페이지를 반환해요. 이미지, HTML, 자바스크립트 파일과 같이 컴퓨터에 저장된 파일들만 반환해요.
인자의 내용에 맞게 '동적' 콘텐츠를 반환해요. 웹 서버에 의해 실행되는 프로그램을 통해 만들어진 결과물이에요.
여기서 서블릿Servlet
은 WAS
위에서 돌아가는 자바 프로그램으로, doGet
메서드를 구현해서 적절한 콘텐츠를 클라이언트에게 제공해요.
하드웨어와 소프트웨어로 구분되요.
하드웨어는 웹 서버가 설치된 컴퓨터에요. 그리고 소프트웨어는 웹 브라우저 클라이언트로부터 HTTP 요청을 받고 정적 콘텐츠(css, HTML 등)를 제공하는 컴퓨터 프로그램이죠.
HTTP 프로토콜 기반으로 클라이언트 요청을 서비스하는 기능을 담당해요. 요청에 맞게 두 기능 중 선택해서 제공해요.
💡 두 가지 기능, 정적 콘텐츠 그리고 동적 콘텐츠
1. 정적 콘텐츠 :WAS
를 거치지 않고 바로 자원 제공
2. 동적 콘텐츠 : 클라이언트 요청을WAS
에 보내고, 처리 결과를 클라이언트에 전달
웹 서버의 종류로는 apache
, nginx
, IIS
가 있어요.
DB 조회 및 다양한 로직 처리가 요구되면 동적 콘텐츠를 제공하기 위해 만들어진 어플리케이션 서버에요.
HTTP를 통해 어플리케이션을 수행하주는 미들웨어죠.
웹 컨테이너 또는 서블릿 컨테이너라고도 불려요.
💡 컨테이너(Container)
JSP, Servlet을 실행시킬 수 있는 소프트웨어로, 구동 환경을 제공해요.
WAS
= 웹 서버 + 웹 컨테이너
웹 서버의 기능들을 구조적으로 분리하여 처리하는 역할을 담당해요.
보안, 스레드 처리, 분산 트랜잭션 등 분산 환경에서 사용되요. 주로 사용되는 곳은 DB 서버에요.
💡 WAS 역할
1. 프로그램 실행 환경 및 DB 접속 기능 제공
2. 여러 트랜잭션 관리
3. 업무 처리하는 비즈니스 로직 수행
WAS
의 종류는 tomcat
, JBoss
가 있어요.
웹 서버에는 정적 콘텐츠만 처리하도록 기능을 분배해서 서버의 부담을 줄이기 위해 구분해요.
동적 콘텐츠 제공할 때 웹 서버만으로는 원하는 요청에 대한 결과 값을 모두 미리 만들어 놓고 서비스하기엔 자원이 부족하기 때문이에요.
따라서, WAS
를 통해 요청이 들어올 때마다 DB와 비즈니스 로직을 통해 결과물을 만들어 제공해요.
WAS
는 DB 조회, 다양한 로직 처리에 집중해야 해요. 따라서 단순 정적 콘텐츠는 웹 서버에 맡기며 기능을 분리시켜 서버에 부하를 줄이는거죠.
WAS
가 정적 콘텐츠까지 처리할 경우 부하가 커지고, 동적 콘텐츠의 처리 지연으로 인해 수행 속도가 느려져요. 그러면 페이지 노출 시간이 늘어나는 문제가 발생해요.
그렇기 때문에, 둘을 구분하는거에요.
WAS
서버를 여러 대 연결지어 이용이 가능해요.
웹 서버를 앞단에 두고, WAS
에 오류가 발생하면 사용자가 이용하지 못하게 막아두고, 재시작해서 연결이 가능하게 하는거죠.
이를 통해 사용자는 오류를 못 느끼고 서비스를 이용할 수 있게 되요.
따라서, 자원 이용의 효율성 및 장애 극복, 배포 및 유지 보수의 편의성 때문에 분리해서 사용해요.
1. 클라이언트 요청을 먼저 웹 서버web server
가 받아요
2. WAS
에 보내 관련 servlet을 메모리에 올려요
3. WAS
는 web.xml
을 참조해 해당 servlet에 대한 스레드를 생성해요
(이 때 스레드 풀을 이용해요)
4. HttpServletRequest
와 HttpServletResponse
객체를 생성해 servlet에게 전달해요
4-1. 스레드는 servlet의 service()
메서드를 호출
4-2. service()
메서드는 요청에 맞게 doGet()
이나 doPost()
메서드를 호출
5. doGet()
이나 doPost()
메서드는 인자에 맞게 생성도니 정적한 동적 페이지를 Response
객체에 담아 WAS
에 전달해요
6. WAS
는 Response
객체를 HttpResponse
형태로 바꿔 웹 서버web server
로 전달해요
7. 생성된 스레드를 종료시키고, HttpServletRequest
와 HttpServletResponse
객체를 제거해요.