카테고리 없음

WAS와 Server의 차이 & Web Container란?

GSJun 2023. 7. 6. 22:06

Web Server란?

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

  - 예) Apache, Nginx, IIS, WebtoB 등

(http 요청을 받으면 응답을 하는 서버)

WAS 란?

  - Web Application Server

  - 클라이언트의 request(요청)을 받아 DB 조회나, 어떤 로직을 처리해야하는 동적인 컨텐츠(정적도 포함)를

     response(응답)하는 서버

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

(Web Server에 동적 컨텐츠 까지 응답하는 서버)

둘의 차이점은 ?

  - 결론적으로 어떤 타입의 컨텐츠(동적, 정적)를 제공하냐는 것이다.

  - 웹 서버와 WAS는 각각 독립적으로 존재할 수 있다

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

  - 즉, WAS는 웹 서버를 포함하는 개념이라고 할 수 있다

(WAS는 웹 서버를 포함하는 개념)

웹 서버를 사용하는 이유

  - WAS가 웹 서버를 포함하는 개념이라면, 왜 굳이 웹 서버와 WAS를 같이 사용하는 것일까?

 

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

  - WAS 앞에 웹 서버를 둬서 웹 서버에 정적인 문서만 처리하도록하고, WAS는 애플리케이션의 로직만 수행하도록

    기능을 분배해서 서버의 부담을 줄인다

(서버의 부담 감소)

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

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

    WAS 설정 파일을 외부에 노출시키지 않도록 하기 위함

 

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

(보안 상 이슈 때문에)

 

 

웹 컨테이너

  - Apache는 CGI라는 개념을 지원한다

CGI란?

  - Common Gateway Interface(공용 게이트웨이 인터페이스)

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

  - 웹 서버와 외부 프로그램 사이에서 정보를 주고 받는 방법이나 규약

  - 쉽게 설명하자면, 두 개 이상의 컴퓨터 간의 자료를 주고 받는 프로그램, 또는 주고 받는 것 자체를 의미

(웹 서버 상에서 프로그램을 동작 시키게 해주는 프로그램)

  - PHP, Perl, Python등의 언어는 Apache를 통해 CGI를 적용하는 것이 가능한데, JAVA는 안됨

  - 즉, JAVA는 따로 CGI와 같은 기능을 위해 컨테이너 라는 것이 필요하다

 

웹 컨테이너(서블릿 컨테이)의 정의

  - 웹 컨테이너는 java 서블렛과 상호작용하는 WAS의 구성요소이다

  - 서블릿의 생명주기를 관리한다

    - 서블릿을 로드해 초기화(init()) 한다

    - 클라이언트의 요청으로 서블릿 메소드를 호출한다

    - 서블릿 컨테이너가 종료되면 서블릿을 종료시키고(destroy())메모리를 정리한다 (가비지 컬렉션)

  - 통신을 지원한다

    - 웹 서버로 부터 받은 요청을 분석해 서블릿에 실행시키고, 서블릿에서는 웹서버의 정보를 확인할 수 있도록 하는

      기능을 제공한다

    - 서블릿과 웹 서버가 서로 통신할 수 있는 쉬운 방법들을 제공한다

      - ServerSocket 만들기

      - 특정 포트에 리스닝

      - 연결 요청이 들어오면 스트림 생성

    - 멀티 스레딩을 지원한다

      - 클라이언트에 요청에 따라 서블릿을 생성하고, 이미 생성된 서블릿에 대한 요청을 스레드를 생성해 실행한다

    - 선언적 보안 관리

      - 보안에 관련된 내용을 서블릿, 자바, 클래스 코드 안에 하드 코딩할 필요가 없다

      - 즉, 필요한 데이터나 값, 코드 등을 직접 타이핑해 집어 넣는 일이 없다

      - 보안 관리는 배포 서술자(web.xml)에다가 기록하면 된다

    - JSP를 지원한다

    - 쉽게 말해 WAS 내부에서 개발자 대신 서블릿을 관리하는 것

    - WAS 별로 다양한 종류의 컨테이너를 내장하고 있으며, 이들 중 서블릿에 관련된 것들을 모아 놓은 것을

      서블릿 컨테이너라 부른다. (이 포스팅의 컨테이너 정의는 서블릿 컨테이너를 두고 작성한 것이다)

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

(WAS 내부에서 서블릿을 관리하는 것)

컴포넌트란?

  - 특정 기능이나 관련된 기능이 재사용 가능한 형태로 만들어진 프로그램

  - 소프트웨어 개발을 레고 블록 쌓듯이 진행 가능하게 한다

(특정 기능을 재사용 가능한 형태로 만들어진 프로그램[레고 블록])

 

웹 컨테이너의 작동

1. 클라이언트는 웹서버로 request(요청)을 보낸다

2. 서블릿을 포함하는 WAS는 컨테이너로 요청을 보낸다

3. 컨테이너가 요청을 각 서블릿에게 전달한다

4. 서블릿 메서드가 로드됨

5. 서블릿은 컨테이너에 관련 response(응답)을 넘겨준다

6. 컨테이너는 이를 서버에 전달한다

7. 서버는 응답을 클라이언트에게 전달한다

(클라이언트가 웹 서버에 요청하면 컨테이너가 요청을 서블릿에 전달해 응답을 받고 그걸 서버-클라이언트 순으로 전달함)

WAS의 내부 구조

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

2. 컨테이너는 배포서술자(web.xml)를 참조하여 해당 서블릿에 대한 스레드를 생성하고 요청(httpServletRequest) 및

    응답(httpServletResponse) 객체를 생성하며 전달한다

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

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

5. 호출된 doPost()나 doGet() 메소드는 동적 페이지를 생성한 후 HttpServletResponse객체에 실어

    컨테이너에 전달한다

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

    응답(httpServletResponse) 객체를 소멸시킨다

(웹 서버에서 요청이 들어오면 컨테이너가 제일 먼저 처리하는데 동적 페이지를 만들고 웹 서버에 전달함)

 

스레드(thread)란?

  - 프로세스 내에서 실제로 작업을 수행할 수 있는 주체를 의미한다

 

예제

package servletst;
import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class MyServlet extends HttpServlet{
	 
	 //클라이언트의 요청을 받는 메서드 재정의
	 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
	  //클라이언트의 브라우져에 무언가를 출력할 수 있는 문자기반 출력스트림 생성
	  PrintWriter out = response.getWriter();
	  out.print("Your send method is get");
	 }
	  public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
	  PrintWriter out = response.getWriter();
	  out.print("Your send method is post");
	 }
}

1. HttpServlet

  - 서블릿은 HttpServlet을 상속한다

  - HttpServlet은 GenericServlet을 상속 받았으며, GenericServlet의 유일한 추상메서드인 service()를

    HTTP 프로토콜 요청에 메서드에 적합하게 재구현 해놨다

  - DELETE, GET, HEAD, OPTIONS, POST, PUT, TRACE를 처리하는 메소드가 모두 정의되어 있다

 

GenericServlet 이란?

  - GenericServlet은 Servlet 인터페이스를 상속하여 클라이언트-서버 환경에서 서버단의 애플리케이션으로서

    필요한 기능을 구현한 추상클래스이다

  - service() 메서드를 제외한 모든 메서드를 재정의하여 적절한 기능으로 구현했다

  - GenericServlet 클래스를 상속하면 애플리케이션의 프로토콜에 따라 메서드 재정의 구문을 적용해야 한다

 

Servlet 인터페이스

  - 서블릿 프로그램을 개발할 때 반드시 구현해야하는 메서드를 선언하고 있는 인터페이스

  - 이 표준을 구현해야 서블릿 컨테이너가 해당 서블릿을 실행할 수 있다

 

2. (HttpServletRequest request, HttpServletResponse response)

  - 컨테이너가 생성한 Request와 Response 객체 참조를 넘겨 받는 곳

 

3. response.getWriter();

  - 서블릿이 넘겨준 Response 객체 안에 있는 PrintWriter() 메소드를 사용하여 html 코드를 작성한다