Spring/스프링 기본

[Spring] 기본지식 - 서블릿(servlet) 과 서블릿 컨테이너(Servlet Container)

공대키메라 2022. 7. 24. 12:33

전에 공부했었던 내용이지만, 무언가 초창기에 대~충 적은 듯한 느낌도 많이 들고, 무엇보다도

 

필자 키메라는 인간이란 망각의 동물임을 인정해야 했다... 눈물 또르르...

 

고로, 다시 위 공부 내용들을 정리하려고 한다. 

 

참고한 사이트는 다음과 같다. 

 

출처:

https://docs.oracle.com/javaee/5/tutorial/doc/bnafe.html

https://www.javatpoint.com/servlet-tutorial

http://www.tcpschool.com/java/java_thread_concept

https://www.baeldung.com/java-servlets-containers-intro

https://ecomputernotes.com/servlet/intro/servlet-container

서블릿(Servlet)과  서블릿 컨테이너(Servlet Container)

 

1-1.서블릿이 뭔가? (What is Servlet?)

 

https://static.javatpoint.com/images/response.JPG

 

Servlet이 뭘까? server 가 잘 작동하도록 도와주는 아이가 servlet아닐까?

 

사실 처음 이것을 알아보기 전에는 server + let 을 합친것 인줄 알았는데,

알고보니 servet + applet을 줄인 것이 servlet이라고 한다.

 

단어만으로 뜻을 유추해보면... server와 우리가 사용하는 application이 서로 기능하도록 도와주는(let)하는 것이 아닌가 생각이 든다.

 

어찌되었든... 서블렛의 뜻을 찾아보면 다음과 같다. 

 

서블렛이란 요청(requset)와 응답(response) 프로그래밍 모델로 접근하는 어플리케이션을 주최하는 서버들의 능력 혹은 가능성을 연장시키는데 사용되고는 하는 자바 프로그래밍 언어다!

출처 : https://docs.oracle.com/javaee/5/tutorial/doc/bnafe.html

                                                                                -----------------------

서블릿은 server의 능력을 확장시켜주는 클래스이고, 들어오는 요청들에 응답한다. 이것은 모든 요청에 응답할 수 있다.

출처 : https://www.javatpoint.com/servlet-tutorial

 

결국, 서블릿은 요청과 응답을 가능하게 해주는 클래스 혹은 자바 프로그래밍 언어구나!

 

다시 말끔하게 정리를 하자면 다음과 같이 말할 수 있다.

 

1-2. CGI(Common Gateway Interface) vs Servlet

Serlvet이라는 것이 출현하기 전에는 CGI로 웹 애플리케이션을 구현했다는것 같다. 

 

CGI 기술은 웹 서버가 외부의 프로그램을 호출하는것을 가능하게 하고 HTTP요청 정보를 오청 처리하기위해 외부 프로그램으로 넘긴다. 각각의 요청에서, 새로운 처리가 시작한다. 

 

https://static.javatpoint.com/images/cgi.JPG

 

이러한 CGI는 여러 단점을 가지고 있다. 

 

1. 클라이언트의 수가 증가하면, 응답을 보내는데 시간이 증가한다. (서로 linear한 관계에 있네! - 반대는 non-linear)

 

2. 각각의 요청에서, 한 프로세스가 시작하고 웹 서버는 프로세스를 시작하기 위해 제한된다.

(모든 처리를 한곳에서 받아서 처리하기 때문에 하나의 프로세스가 끝날 때 까지 기다려야 하는 것이다...)

 

3. C, C+, perl같은 의존적인 언어 플랫폼을 사용한다. 

 

https://static.javatpoint.com/images/servlet.JPG

 

CGI보다 Servlet 에 많은 이점이 있다. web container는 Servlet에서 여러 요청을 다루기 위해 thread를 생성한다. 

 

* 스레드(thread)란?

스레드(thread)란 프로세스(process) 내에서 실제로 작업을 수행하는 주체를 의미합니다.
모든 프로세스에는 한 개 이상의 스레드가 존재하여 작업을 수행합니다.
또한, 두 개 이상의 스레드를 가지는 프로세스를 멀티스레드 프로세스(multi-threaded process)라고 합니다.

 

쓰레드는 프로세스에 비해 많은 이점을 가지고 있다. 가령, 공통의 메모리 구역, 경량성, thread들 사이의 소통 비용이 낮던가 말이다. 

 

1. 더 나은 성능 : 각각의 요청에서 프로세스가 아닌 쓰레드를 생성하기 때문이다. 

 

2. 이식성 : java 언어를 쓰기 때문이다. 

(Java는 플랫폼에 독립적이다. 그러므로 java 는 이식성이 좋은 언어라고 할 수 있다. 플랫폼에 구애받지 않으니까 말이다!)

 

3. 견고한(robust) : JVM이 Servlet을 관리해서, 우리는 메모리 누수가 가비지 컬렉션을 걱정할 필요가 없다.

 

4. 안전한 : java 언어를 쓰기 때문이다. 

 

 * 이식성 (portability)

대대적인 개정 없이도, 하나 이상의 운영체계에서 사용될 수 있는지의 여부를 나타내는 컴퓨터 프로그램의 특성을 말한다.

 

1-3 서블릿 컨테이너(Servlet Container)

Servlet Container는 동적으로 web page를 생성한다. 그래서 servlet container는 자바의 서블릿과 상호작용하는 중요한 web server의 부분이다.  

 

Servlet Containers는 client browser와 servlet사이에 communicate한다.

 

Servlet들을 사용하기 위해서 container에 등록되어야 한다. 시작할 때, container는 init() 메소드를 호출해서 sevlet를 초기화한다.

 

일단 시작이 끝나면, servlet은 요청을 받을 준비가 된다. 연속적으로, container는 servlet의 sevice() 메소드를 처리하기 위해서 이러한 요청을 관리한다.  

 

그 후, 더 나아가 HTTP 요청 타입기반의  doGet() 이나 doPost()같은 적절한 메소드를 요청에 위임한다. 

 

destroy() 메소드로, container는 serlvet을 끝내고, 더이상 들어오는 요청을 받아들일 수 없다. 

 

이것을 우리는 이 사이클을 servlet의 init-service-destroy의 라이프사이클이라고 부른다.

 

간단하게 정리하자면...

 

Servlet Container란 서블릿을 관리해주는 컨테이너 이다.  

1-4. Servlet Container는 어떻게 작동하나?(How does this Servlet Container work?)

 

출처 : https://ecomputernotes.com/images/Servlet-Container.jpg

 

1. client browser가 한 페이지에서 web server 혹은 HTTP 서버에 접근한다. 

 

2. Web Server가 servlet container에 요청을 다시 보낸다. '

 

3. servlet container는 적절한 servlet으로 요청을 다시 보낸다.

 

4. servlet는 동적으로 가져와지고, container의 주소 공간에 적재된다. 

 

5. servlet container는 HTTP 요청을 처리하기 위해 servlet의 service() 메소드들을 호출한다. 

즉, 요청에서 데이터를 읽고 응답을 계산한다. 

 

6. servlet은 container의 주소 공간을 남기고 다른 HTTP 요청들을 처리할 수 있다.

 

7. Web servlet이 data를 생성하고 동적으로 생성된 결과들을 올바른 위치로 반환한다. 

 

2. What is HTTP

 

HTTP란 Hypertext Transfer Protocol의 약자로 텍스트 기반의 통신 규약으로 인터넷에서 데이터를 주고받을 수 있는 프로토콜이다. 이렇게 규약을 정해두었기 때문에 모든 프로그램이 이 규약에 맞춰 개발해서 서로 정보를 교환할 수 있게 되었다.

 

Hypertext => Hypertext is text displayed on a computer display or other electronic devices with references (hyperlinks) to other text that the reader can immediately access

Transfer => 전송

Protocol => 규약

 

Hypertext Transfer Protocol => 컴퓨터에 보여지는 글을 인터넷에서 서로 주고받기 위한 규약! (영어를 해석해보니 그냥 원래 뜻이 바로 나와버린... )

 

결국 client와 server간 응답을 도와주는 protocol인 것이다. 

 

HTTP의 특징

  1. 클라이언트 서버 구조
  2. 무상태 프로토콜(Stateless)
  3. 비 연결성(Connectionless)
  4. HTTP 메세지
  5. 단순함, 확장 가능

 

참고 :

https://velog.io/@surim014/HTTP%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

https://hanamon.kr/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-http-http%EB%9E%80-%ED%8A%B9%EC%A7%95-%EB%AC%B4%EC%83%81%ED%83%9C-%EB%B9%84%EC%97%B0%EA%B2%B0%EC%84%B1/