본문 바로가기

대덕공부/Spring

WAS와 Server의 차이? 그리고 Web Container 란?

들어가며

  • Servlet 을 공부하던 도중 컨테이너라는 용어가 자주 등장했는데, 컨테이너의 예로 톰캣을 있다는 글을 보았다. 나는 톰캣을 WAS로 알고 있었는데, 그럼 컨테이너와 WAS는 같은것인가? 헷갈리는 부분을 명확히 해야할 것 같아서 이에 대한 정리를 하고자 한다.

 

Web Server란?

  • 클라이언트의 request(요청)을 받아 정적인 컨텐츠(html, css, js)를 response(응답)하는 서버.
  • 예) Apache, Nginx, IIS, WebtoB 등

 

WAS 란?

  • Web Application Server
  • 클라이언트의 request(요청)을 받아 DB 조회나, 어떤 로직을 처리해야하는 동적인 컨텐츠를 response(응답)하는 서버.
  • 예) Tomcat, WebLogic, WebSphere, Jeus, JBoss 등

 

둘의 차이점은?

  • 결론적으로 어떤 타입의 컨텐츠(동적, 정적)를 제공하냐는 것이다.
  • 웹 서버와 WAS는 각각 독립적으로 존재할 수 있다.
  • 대부분의 WAS는 정적인 컨텐츠를 제공해주고 있기 때문에, 웹 서버 없이 WAS 만 존재할 수 있다.
  • 즉, WAS는 웹 서버를 포함하는 개념이라고 할 수 있다.

 

웹 서버를 사용하는 이유?

  • WAS가 웹 서버를 포함하는 개념이라면, 왜 굳이 웹 서버와 WAS를 같이 사용하는 것일까?
  1. WAS가 해야할 일의 부담을 줄이기 위해서
    • WAS 앞에 웹 서버를 둬서 웹 서버에 정적인 문서만 처리하도록하고, WAS는 애플리케이션의 로직만 수행하도록 기능을 분배해서 서버의 부담을 줄인다.
  2. WAS의 환경 설정 파일을 외부에 노출시키지 않도록 하기 위해서
    • 클라이언트와 연결하는 포트가 직접 WAS에 연결이 되어 있다면 중요한 설정 파일들이 노출될 수 있기 때문에 WAS 설정 파일을 외부에 노출시키지 않도록 하기 위함
    • 웹 서버와 WAS에 접근하는 포트가 다르기 때문에 WAS에 들어오는 포트에는 방화벽을 쳐서 보안을 강화할 수도 있다.

우리가 웹 어플리케이션을 개발할 때 사용하는 Apache Tomcat 은 WAS(Tomcat)가 웹 서버(Apache) 기능을 포함하고 있기 때문에 Apache Tomcat 이라고 부르기도 하고, 실제로 WAS 앞에 웹 서버를 두어서 Apache Tomcat 이라고 부르기도 한다.

 

웹 컨테이너

  • 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 컨테이너 등을 내장하고 있고, 다양한 컴포넌트들도 내장하고 있다.

컴포넌트란?

  • 특정 기능이나 관련된 기능이 재사용가능한 형태로 만들어진 프로그램
  • 소프트 웨어 개발을 레고 블록 쌓듯이 진행 가능하게 한다.

 

웹 컨테이너의 작동

  1. 클라이언트는 웹서버로 request(요청)을 보낸다.
  2. 서블릿을 포함하는 WAS는 컨테이너로 요청을 보낸다.
  3. 컨테이너가 요청을 각 서블릿에게 전달한다.
  4. 서블릿 메서드가 로드된다.
  5. 서블릿은 컨테이너에 관련 response(응답)을 넘겨준다.
  6. 컨테이너는 이를 서버에 전달한다. 서버는 응답을 클라이언트에게 전달한다.

 

WAS의 내부 구조

  1. 웹 서버로 부터 요청이 들어오면, 제일 먼저 컨테이너가 이를 처리하게 된다.
  2. 컨테이너는 배포서술자(web.xml)를 참조하여 해당 서블릿에대한 스레드를 생성하고 요청(httpServletRequest) 및 응답(httpServletResponse) 객체를 생성하여 전달한다.

스레드(thread)란?

  • 프로세스 내에서 실제로 작업을 수행하는 주체를 의미한다.
  • 자세히
  1. 컨테이너는 사용자가 요청한 URL을 분석하여 어느 서블릿에 대한 요청인지 찾는다.
  2. 컨테이너는 서블릿을 호출(service())하며, POST/GET 여부에 따라 doPost() 또는 doGet() 이 호출된다.
  3. 호출된 doPost() 또는 doGet() 메소드는 동적 페이지를 생성한 후 HttpServletResponse 객체에 실어 컨테이너에 전달한다.
  4. 컨테이너는 전달 받은 객체를 웹 서버에 전달하고 생성되었던 스레드를 종료하고 요청(httpServletRequest) 및 응답(httpServletResponse) 객체를 소멸시킨다.

 

예제

   
  1. HttpServlet
    • 서블릿은 HttpServlet을 상속한다.
    • HttpServlet  GetnericServlet을 상속 받았으며, GetnericServlet의 유일한 추상메서드인 service()를 HTTP 프로토콜 요청에 메서드에 적합하게 재구현 해놨다.
    • DELETE, GET, HEAD, OPTIONS, POST, PUT, TRACE를 처리하는 메소드가 모두 정의되어 있다.GetnericServlet이란?
      • GenericServlet  Servlet 인터페이스를 상속하여 클라이언트-서버 환경에서 서버단의 애플리케이션으로서 필요한 기능을 구현한 추상클래스이다.
        • Servlet 인터페이스
        • 서블릿 프로그램을 개발할 때 반드시 구현해야하는 메서드를 선언하고 있는 인터페이스
        • 이 표준을 구현해야 서블릿 컨테이너가 해당 서블릿을 실행할 수 있다.
      • service() 메서드를 제외한 모든 메서드를 재정의하여 적절한 기능으로 구현했다.
      • GenericServlet 클래스를 상속하면 애플리케이션의 프로토콜에 따라 메서드 재정의 구문을 적용해야 한다.
  2. (HttpServletRequest request, HttpServletResponse response)
    • 컨테이너가 생성한 Request와 Response 객체 참조를 넘겨 받는 곳
  3. response.getWriter();
    • 서블릿이 넘겨준 Response 객체 안에 있는 PrintWriter() 메소드를 사용하여 html 코드를 작성한다.

 

[출처]
https://12bme.tistory.com/555
https://m.blog.naver.com/PostView.nhn?blogId=ken6ybn&logNo=100160657795&proxyReferer=https:%2F%2Fwww.google.com%2F
https://victorydntmd.tistory.com/121
https://myblog.opendocs.co.kr/archives/425

'대덕공부 > Spring' 카테고리의 다른 글

**Spring Menual  (0) 2022.07.11
보안프레임워크2  (0) 2022.07.06
Filter  (0) 2022.07.05
log4j  (0) 2022.07.05
iBatis - Pagination 페이지 + 검색기능  (0) 2022.06.30