들어가며
- 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를 같이 사용하는 것일까?
- WAS가 해야할 일의 부담을 줄이기 위해서
- WAS 앞에 웹 서버를 둬서 웹 서버에 정적인 문서만 처리하도록하고, WAS는 애플리케이션의 로직만 수행하도록 기능을 분배해서 서버의 부담을 줄인다.
- WAS 앞에 웹 서버를 둬서 웹 서버에 정적인 문서만 처리하도록하고, WAS는 애플리케이션의 로직만 수행하도록 기능을 분배해서 서버의 부담을 줄인다.
- 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 컨테이너 등을 내장하고 있고, 다양한 컴포넌트들도 내장하고 있다.
컴포넌트란?
- 특정 기능이나 관련된 기능이 재사용가능한 형태로 만들어진 프로그램
- 소프트 웨어 개발을 레고 블록 쌓듯이 진행 가능하게 한다.
웹 컨테이너의 작동
- 클라이언트는 웹서버로 request(요청)을 보낸다.
- 서블릿을 포함하는 WAS는 컨테이너로 요청을 보낸다.
- 컨테이너가 요청을 각 서블릿에게 전달한다.
- 서블릿 메서드가 로드된다.
- 서블릿은 컨테이너에 관련 response(응답)을 넘겨준다.
- 컨테이너는 이를 서버에 전달한다. 서버는 응답을 클라이언트에게 전달한다.
WAS의 내부 구조
- 웹 서버로 부터 요청이 들어오면, 제일 먼저 컨테이너가 이를 처리하게 된다.
- 컨테이너는 배포서술자(web.xml)를 참조하여 해당 서블릿에대한 스레드를 생성하고 요청(httpServletRequest) 및 응답(httpServletResponse) 객체를 생성하여 전달한다.
스레드(thread)란?
- 프로세스 내에서 실제로 작업을 수행하는 주체를 의미한다.
- 자세히
- 컨테이너는 사용자가 요청한 URL을 분석하여 어느 서블릿에 대한 요청인지 찾는다.
- 컨테이너는 서블릿을 호출(service())하며, POST/GET 여부에 따라 doPost() 또는 doGet() 이 호출된다.
- 호출된 doPost() 또는 doGet() 메소드는 동적 페이지를 생성한 후 HttpServletResponse 객체에 실어 컨테이너에 전달한다.
- 컨테이너는 전달 받은 객체를 웹 서버에 전달하고 생성되었던 스레드를 종료하고 요청(httpServletRequest) 및 응답(httpServletResponse) 객체를 소멸시킨다.
예제
- HttpServlet
- 서블릿은 HttpServlet을 상속한다.
- HttpServlet 은 GetnericServlet을 상속 받았으며, GetnericServlet의 유일한 추상메서드인 service()를 HTTP 프로토콜 요청에 메서드에 적합하게 재구현 해놨다.
- DELETE, GET, HEAD, OPTIONS, POST, PUT, TRACE를 처리하는 메소드가 모두 정의되어 있다.GetnericServlet이란?
- GenericServlet 은 Servlet 인터페이스를 상속하여 클라이언트-서버 환경에서 서버단의 애플리케이션으로서 필요한 기능을 구현한 추상클래스이다.
- Servlet 인터페이스
- 서블릿 프로그램을 개발할 때 반드시 구현해야하는 메서드를 선언하고 있는 인터페이스
- 이 표준을 구현해야 서블릿 컨테이너가 해당 서블릿을 실행할 수 있다.
- service() 메서드를 제외한 모든 메서드를 재정의하여 적절한 기능으로 구현했다.
- GenericServlet 클래스를 상속하면 애플리케이션의 프로토콜에 따라 메서드 재정의 구문을 적용해야 한다.
- GenericServlet 은 Servlet 인터페이스를 상속하여 클라이언트-서버 환경에서 서버단의 애플리케이션으로서 필요한 기능을 구현한 추상클래스이다.
- (HttpServletRequest request, HttpServletResponse response)
- 컨테이너가 생성한 Request와 Response 객체 참조를 넘겨 받는 곳
- 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 |