성장에 목마른 코린이

[Java] Web Server vs WAS vs Web Container 본문

Java

[Java] Web Server vs WAS vs Web Container

성장하는 코린이 2022. 11. 1. 11:05
728x90

흔히 웹 서버, 애플리케이션 서버, 웹 컨테이너 라는 3가지 용어를 혼용해서 사용되는데 제각기 다릅니다.

 

Web Server (웹 서버)

- 클라이언트의 request를 받아 정적인 컨텐츠(html, css, js)를 response하는 서버

- 예) Apache, Nginx, IIS, WebtoB 등

 

WAS (Web Application Server / 애플리케이션 서버)

- 클라이언트의 request를 받아 DB 조회나, 어떤 로직을 처리해야하는 동적인 컨텐츠를 response하는 서버

- 대부분의 WAS는 정적인 컨텐츠를 제공해주고 있기 때문에, 웹 서버 없이 WAS만 존재할 수 있습니다.

- WAS는 웹 서버를 포함하는 개념이라 할 수 있습니다.

- 예) Tomcat, WebLogic, WebSphere, Jeus, JBoss 등

Web Container (웹 컨테이너)

Java Servlet과 상호작용하는 WAS의 구성요소입니다.

쉽게 말해 WAS 내부에서 개발자 대신 서블릿을 관리하는 구성요소라 볼 수 있습니다.

서블릿 컨테이너 외에 JSP 컨테이너, EJB 컨테이너 등을 내장하고 있고, 다양한 컴포넌트들도 내장하고 있습니다.

 

Web Container의 역할

* 서블릿의 생명주기를 관리, 통신을 지원, 멀티스레딩을 지원, 선언적 보안 관리, JSP를 지원합니다.

 

Web Server를 사용하는 이유

앞서 WAS 소개에 보면 WAS는 웹 서버를 포함하는 개념이라 나와있는데, Web Server와 WAS를 같이 사용하는 이유가 있습니다.

 

1. Load Balancing (WAS가 해야할 일의 부담을 줄이기 위해서) 

- WAS 앞에 Web Server를 둬서 웹 서버에 정적인 문서만 처리하도록 하고 WAS는 애플리케이션의 로직만 수행하도록 기능을 분배해서 서버의 부담을 줄입니다.

 

2. WAS 환경 설정 파일을 외부에 노출시키기 않도록 하기 위해서

- 클라이언트와 연결하는 포트가 직접 WAS에 연결이 되어있다면, 중요한 설정 파일들이 노출 될 수 있습니다.

- 웹 서버와 WAS에 접근하는 포트가 다르기 때문에 WAS에 들어오는 포트에는 방화벽을 쳐서 보안을 강화할 수도 있습니다.

 

* 웹 어플리케이션을 개발할 때 사용되는 Apache Tomcat은 WAS(Tomcat)가 Web Server(Apache) 기능을 포함하고 있기 때문에

Apache Tomcat이라고 부르기도 하고, 실제로 WAS앞에 웹 서버를 두어서 Apache Tomcat이라고 부르기도 합니다.

 

Container가 필요한 이유

Apache는 CGI라는 개념을 지원하는데,

PHP, Perl, Python등의 언어와 달리 Java는 Apache를 통해 CGI를 적용시키지 못합니다.

그래서 Java는 CGI 같은 기능을 위해 Container라는 것이 필요합니다.

 

CGI (Common Gateway Interface)

번역을 하자면 공용 게이트웨이 인터페이스입니다.

- 웹 서버 상에서 프로그램을 동작시키기 위한 방법을 정의한 프로그램이자 인터페이스입니다.

- 웹 서버와 외부 프로그램 사이에서 정보를 주고 받는 방법이나 규약이라 볼 수 있습니다.

- 두개 이상의 컴퓨터 간의 자료를 주고 받는 프로그램, 주고 받는 것 자체를 의미한다고 볼 수 있습니다.

 

WAS의 작동 및 내부 구조

1. 웹 서버로 부터 요청이 들어오면, 제일 먼저 컨테이너가 이를 처리하게 됩니다.

 

2. 컨테이너는 web.xml을 참고하여 해당 Servlet에 대한 Thread를 생성하고

httpServletRequest (요청) 및 httpServletResponse (응답) 객체를 생성해 전달합니다.

 

3. 컨테이너는 사용자가 요청한 URL을 분석해 어느 서블릿에 대한 요청인지 찾습니다.

 

4. 컨테이너는 서블릿을 호출(service())하며, POST/GET 여부에 따라 doPost() 또는 doGet()이 호출됩니다.

 

5. 호출된 doPost() 또는 doGet() 메소드는 동적 페이지를 생성한 후, httpServletResponse 객체에 실어 컨테이너에 전달합니다.

 

6. 컨테이너는 전달 받은 객체를 웹 서버에 전달하고 생성되었던 스레드를 종료 후

httpServletRequest(요청) 및 httpServletResponse(응답) 객체를 소멸 시킵니다.

 

Web Container의 작동

Java 기반 서버를 서블릿 컨테이너라고 부릅니다.

1. 클라이언트는 Web Server로 request를 보냅니다.

2. Servlet을 포함하는 WAS는 Container로 요청을 보냅니다.

3. Container가 요청을 각 Servlet에게 전달합니다.

4. Servlet 메소드가 Load됩니다.

5. Servlet은 Container에 관련 response를 넘겨줍니다.

6. Container는 이를 서버에 전달하고, 서브는 응답을 클라이언트에게 전달합니다.

'Java' 카테고리의 다른 글

[Java] Apache Tomcat  (0) 2022.11.01
[Java] Jetty Architecture 및 Servlet Container  (0) 2022.10.31
[Java] Netty Framework 소개  (0) 2022.10.31
[Java] enum 클래스의 사용과 이해  (0) 2022.10.31
[Java] Lombok Annotation  (0) 2022.10.21
Comments