웹서버의 정의
웹 브라우저와 같은 클라이언트로부터 HTTP 요청을 받아들이고, HTML 문서와 같은 웹 페이지를 반환하는 컴퓨터 프로그램
역할
기본적으로 클라이언트의 HTTP통신에 대한 처리를 담담하는 서버로 생각이 든다.
이 때문에 GET같은 HTTP request가 들어온다면 이에 대응되는 정보를 반환해준다. 예를 들어 사용자가 특정 웹페이지에 접속하여 해당 웹페이지의 HTML을 보기를 원한다면 해당 웹페이지에 대한 정보를 웹서버가 받아서 이에 해당하는 HTML을 사용자에게 전달할 것이다.
이때 웹서버는 클라이언트와 여러개의 connection을 만들어 여러 정보(HTML 템플릿, 이미지, 기타 데이터)등을 병렬적으로 전송하게 된다.
또한 POST나 PUT등과 같이 서버에 어떤 정보를 전달하는 클라이언트로 부터 컨텐츠를 전달 받는 것 또한 웹서버의 역할이라고 볼 수 있다.
정적 컨텐츠 vs 동적 컨텐츠
정적 컨텐츠 : 사용자에 따라 웹페이지가 달리 보여지는게 아니라 모든 클라이언트에게 동일한 웹페이지를 보여지게 하는 것을 의미한다.
동적 컨텐츠 : 사용자에 따라 웹페이지가 달리 구성되는 것을 의미한다.
Q) 동적 컨텐츠는 어떻게 처리되는가?
웹서버가 사용자의 정보에 따라 HTML을 구성하기 위해서는 사용자에 따라 특정 정보를 DB에서 불러와 내부 로직을 통해 정보를 처리한 후 HTML에 넣어줘야 할 것이다.
하지만 기능에 따라 여러 DB에 다르게 질의를 하고 다르게 데이터를 가공하여 전달 해야할 것이다. 이렇게 되면 웹 서버 안에는 동적 데이터 생성을 하기 위한 부분과 client의 요청을 처리하고 이에 대해 응답하는 부분이 공존하게 되고 이 때문에서 서버에 로드가 커질 수 밖에 없다. 따라서 Web server에는 client의 요청과 응답에 대해서만 수행하는 부분만 남기고 다른 동적 컨텐츠를 위한 질의와 구성등은 WAS(Web Application Sever)로 분리하게 된 것이다.
따라서 전체적인 구조도를 보면 다음과 같이 구성되어진다.
Q) 그럼 그냥 서버를 여러개 만들어 로드를 분산 시키는것인가?
그건 아니다. 우리가 사용하는 APP이라는 것은 서버 자체가 가지고 있는 하나의 프로그램을 의미할 수도 있지만 외부 프로그램을 사용해야하는 경우도 존재한다. 따라서 우리는 여러 웹 서버 들간의 입출력 형식등을 맞춰야한다.
CGI는 공용 게이트웨이 인터페이스의 약자로 웹 서버들간의 정보를 주고받는 일종의 규칙이다. 따라서 앞에서 말한 WAS는 이러한 CGI 규격에 맞게 설계된 서버라고 생각할 수 있다.
아파치와 톰캣
아파치
아파치란 월드와이드 웹 서버용 소프트웨어이다. 이를 통해 웹을 구축하려 할 때 쉽게 웹 서버를 수행 할 수 있게 된다.
톰캣
톰캣은 이러한 아파치르 만든 아파치 소프트웨어 재단에서 만든 WAS이다.
Q) 아파치와 톰캣의 차이점은?
먼저 이러한 CGI 규격을 맟출 수 있는 언어는 PHP, Perl, Python등으로 Java는 CGI규격을 바로 맞출 수 없다. 하지만 많은 서버들이 Java로 구성되어 있기 때문에 Java 또한 이러한 CGI규격을 맞추기 위한 기술을 가지고 있는데 그것을 서블릿이라고 한다.
- 사용자(클라이언트)가 URL을 입력하면 HTTP Request가 Servlet Container로 전송합니다.
- 요청을 전송받은 Servlet Container는 HttpServletRequest, HttpServletResponse 객체를 생성합니다.
- web.xml을 기반으로 사용자가 요청한 URL이 어느 서블릿에 대한 요청인지 찾습니다.
- 해당 서블릿에서 service메소드를 호출한 후 클리아언트의 GET, POST여부에 따라 doGet() 또는 doPost()를 호출합니다.
- doGet() or doPost() 메소드는 동적 페이지를 생성한 후 HttpServletResponse객체에 응답을 보냅니다.
- 응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킵니다.
여기서 우리가 처음 보는 용어는 Servelt Container라는 것이다.
서블릿 컨테이너는 앞써 말한 서블릿을 관리해주는 컨테이너이다.
Q) 왜 서블릿은 컨테이너를 필요로 할까?
서블릿을 클라이언트가 동적 컨텐츠를 생성할 때마다 생기게 된다. 따라서 클라이언트가 많아 질수록 수많은 서블릿을 만들기는 어려울 수 밖에 없다. 이러한 서블릿을 관리해주는 부분을 서블릿 컨테이너라고 한다.
이러한 서블릿 컨테이너는 다음과 같은 특징을 가진다.
- 서블릿의 생명 주기를 관리한다.
- 사용자의 요청에 따라 서블릿을 생성하고 이에 대응되는 서블릿 메소드를 호출한다.
- Http 통신을 지원한다.
- 멀티 쓰레딩을 지원한다.
- 서블릿의 요청에 따라 여러 프로세스를 만들어 관리를 한다면 요청마다 다수의 프로세스가 생성되고 이에 따라 서버의 로드가 커질 수 밖에 없다. 따라서 서블릿은 많은 서블릿 메소드에 대해 멀티 쓰레드로 관리를 하게 된다.
'Computer Science' 카테고리의 다른 글
소프트웨어 테스트 (0) | 2022.01.16 |
---|---|
오버라이딩 vs 오버로딩 (0) | 2021.12.28 |
상속과 다형성 (0) | 2021.12.27 |