서블릿 컨테이너란?

이종호·2020년 11월 21일
1

스프링

목록 보기
2/4

해당 블로그의 내용을 잘 이해하기 위해서 그대로 적어보았습니다.
출처: https://scshim.tistory.com/28

이 글에서는 웹 서버, 서블릿 컨테ㅣ너 그리고 이것들과 JVM의 관계를 일반적인 생각을 적습니다.
서블릿 컨테이너는 자바 프로그램에 불과하다는 걸 보여주고 싶었습니다.

웹 서버란? - 웹 페이지를 사용자에게 전송

서블릿 컨테이너를 알기 전에 웹 서버에 대한 이해가 먼저 필요합니다.

웹 서버는 데이터를 전송하기 위해HTTP 프로토콜을 사용합니다.
일반적인 상황에서 사용자는 브라우저에 URL을 입력하고 웹 페이지를 얻게 됩니다. 웹 서버가 하는 일은 웹 페이지를 사용자에게 전송하는 것 입니다. 변화하는 것은 HTTP 프로토콜에서 형식이 지정되는 요청과 반응 메세지 입니다.

서블릿 컨테이너란? 서블릿 컨테이너는 서블릿들의 생성, 실행, 파괴를 담당

여기서 볼 수 있듯이, 사용자는 서버에서 오지기 정적인 웹 페이지만 요청할 수 있습니다. 만약 사용자가 본인의 입력을 기초로한 웹 페이지를 보고 싶다면 이 방법은 충분하지 않습니다. 서블릿 컨테이너의 일반적인 아이디어는 서버 사이드에서 동적으로 웹 페이지를 생성하기 위해 자바를 사용하는 겁니다. 때문에 웹 서버와 서블릿들이 상호작용할 때 서블릿 컨테이너는 필수적인 부분입니다.

서블릿 컨테이너는 서블릿을들을 위한 상자 입니다.

서블릿이란? -javax.servlet package에 정의된 인터페이스, 요청을 처리함

서블릿이란 javax, servlet package에 정의된 인터페이스입니다. 이것은 서블릿의 라이프 사이클을 위한 세 가지 필수적인 메소드들을 정의하빈다. - init(), service() destroy(). 이 메소드들은 모든 서블릿(SDK에서 정의되거나, 자체적으로 정의된)에 의해 구현되고, 특정 시간에 서버에 의해 호출됩니다.

  1. init(): 해당 메소드는 서블릿 생명 주기중 초기화 단계에 호출됩니다. javax.servlet.ServletConfig 인터페이스를 구현하는 오브제트가 전달되며, 이를 통해 서블릿이 웹 애플리케이션에서 초기화 매개변수에 접근할 수 있도록합니다.

  2. service(): 해당 메소드는 초기화 이후 각각의 요청들이 들어오면 호출됩니다. 각각의 요청들은 별도로 나누어지 스레드에서 처리됩니다.
    웹 컨테이너는 모든 요청에 대해 서블릿의 service메소드를 요청합니다. service메소드는 요청의 종류을 판별하고 요청을 처리할 적절한 메소드로 전달합니다.

  3. destory(): 해당 메소드는 서블릿 객체가 파괴되어야할 떄 호출됩니다. 해당 서블릿이 가지고 있던 자원(메모리)를 풀어줍니다.

서블릿 객체의 생명주기에서 서블릿 클래스가 클래스 로더에 의해 컨테이너에 동적으로 로드되는 것을 볼 수 있습니다. 각 요청은 자체적인 스레드에 있으며, 서블릿 객체는 동시에 여러개의 스레드를 제공할 수 있습니다. (thread not safe). ㄷ이상 사용되지 않을 때는, JVM에 의해 가비지 컬렛팅되어야 합니다.
다른 자바 프로그램처럼, 서블릿들은 JVM 애부에서 작동합니다. HTTP 요청들의 복잡성을 처리하기 위해서 서블릿 컨테이너가 제공됩니다. 서블릿 컨테이너는 서블릿들의 생성, 실행, 파괴를 담당합니다.

#thread not safe란 코드가 다른 스레드에 의해 상태가 변경될 수 있음을 의미합니다.

4. 서블릿 컨테이너와 웹 서버는 어떻게 요청을 처리할까?

웹 서버가 HTTP 요청을 받습니다.
웹 서버는 요청을 서블릿 컨테이너로 전달합니다.
서블릿이 컨테이너에 없다면, 서블릿을 동적으로 검색하여 컨테이너의 주소 공간에 로드합니다.
컨테이너가 서블릿의 init() 메소드를 호출하면, 서블릿이 초기화 됩니다.(서블릿이 처음 로드됬을 때 한번만 호출됩니다.)
컨테이너가 서블릿의 service() 메소드를 호출하여 HTTP 요청을 처리합니다.(요청을 읽고, 응답을 만들어 냅니다.) 서블릿은 컨테이너 주소에 남아있고, 다른 HTTP 요청들을 처리할 수 있습니다.
웹 서버는 동적으로 생성된 결과를 올바른 위치에 반환합니다.

5. JVM의 역할은? 각 요청을 분리된 자바 스레드내부에서 처리

서블릿을 사용하는 것은 JVM이 각 요청을 분리된 자바 스레드 내부에서 처리하도록 하며, 이는 서블릿 컨테이너의 주요 장점중 하나 입니다. 각 서블릿은 HTTP 요청에 응답하는 특한 요소들이 있는 바바 클래스입니다. 서블릿 컨테이너의 가장 중요한 기능은 요청을 올바른 서블릿에 전달해서 처리되도록 하고, JVM이 해당 요청을 처리한 후에는 생성된 결과를 올바른 장송에 동적으로 반환해 주는 것입니다.
대부분의 사례에서 서블릿 컨테이너는 하나의JVM에서 동작합니다. 하지만 컨테이너가 여러개의 JVM들을 필요로하는 문제들도 존재합니다.

느낀점

일단 스프링 부트를 이해하려고 하나하나 찾아보고 하는 중인데 꽤나 넘어야할 산이 매우 많다는 느낌이다.

node.js로 프로젝트할 때는 그저 포트 지정해주고 router에 http메소드들만 지정해 주면 되었는데
Spring으로 같은 기능을 만들려니 이해해야 하는 부분이 굉장히 커진 느낌이다.
node역시 이러한 부분을 감추었던 걸까? 왜이리 코드 량의 차이가 벌어지는 모르겠다.

express에 전부 내장되어 있는 기능이란 말인가..

우선 정리해보자면 Client가 요청을 하면 Server에선 요청에 해당하는 응답을 보낸다.
여기서 응답을 요청의 파라미터 값들에 대해 동적으로 보내주기 위해선 서블릿이 필요하고
서블릿을 제어하기 위해 서블릿 컨테이너가 필요하다는 점이다.(뭔가 틀린지 맞는지 모르겠다.)

서블릿에는 크게 3가지 init, service, destroy 3가지 메소드가 있는데 init과 destroy는 서블릿 생명주기중 1번 씩만 호출 (그렇다면 서블릿 생명주기란 어떤 주기인가? 한번의 http요청인가?)하고 생성된 서블릿은 컨테이너 주소에 남아있어 다른 HTTP요청을 처리한다.(다른 요청을 처리한다고 하니, 처음 서블릿 컨테이너가 구동될때 인 듯 하다..)
service는 요청들을 별도로 나누어지 스레드에서 처리한다, service는 요청의 종류를 판별하고 요청을 처리할 적절한 메소드를 전달한다.

profile
열심히 사는 사람

0개의 댓글