티스토리 뷰

서블릿 컨테이너란?

 


이 서블릿을 웹 서버에 올리기만 해서는 클라이언트의 요청을 처리할 수 없기 때문에 

이 서블릿을 관리해주는 서블릿 컨테이너가 필요한 것이다.


서블릿 컨테이너가 하는 역할을 대충 정리해보면


1. 서블릿의 생명 주기 관리

서블릿 컨테이너가 실행 되면, 서블릿 클래스를 인스턴스화시키고 초기화 시킨다.(탄생)

또한, 클라이언트로 부터 어떤 요청이 들어왔을때 그 요청에 해당하는 적절한 서블릿에 맵핑 시켜준다.(전성기)

서블릿이 사망하는 순간 서블릿 컨테이너는 가비지 컬렉션을 실행한다.(사망)


2. 멀티 스레딩 관리

클라이언트의 요청이 들어올때마다 쓰레드를 생성한다. 하나의 서블릿에 여러개의 쓰레드가 동작하면서, 동시에 여러 클라이언트의 요청을 처리 할 수 있게 된다.


3.보안 관리

서블릿 컨테이너 자체에서 보안 관련된 기능을 제공하므로 서블릿에서는 보안과 관련된 로직 필요 X




서블릿 컨테이너는 다른말로 웹 컨테이너, 웹 어플리케이션 서버 라고도 불린다.

이 웹 컨테이너는 서블릿을 생성하고 초기화한 다음에 클라이언트의 요청이 들어오면 적절한 서블릿에게 그 요청을 전달한다. 전달할때 참고하는 xml파일이 있는데 그것이 바로 web.xml파일이다. 이 파일은 웹 어플리케이션 디렉토리의 WEB-INF 디렉토리 아래에 저장되어 있다. 이곳에 서블릿을 등록해주어야지만 웹 컨테이너가 사용자의 요청을 적절한 서블릿에 전달해줄수있다.


http://localhost:8080/brain/aservlet 으로 요청이 들어왔을때 web.xml의 예시


1
2
3
4
5
6
7
8
9
10
<web-app xmlns="http://java.sum.com/xml/ns/javaee" version="2.5">
    <servlet>
            <servlet-name>a-servlet</servlet-name>
            <servlet-class>aservlet</servlet-class>
    </servlet>
    <servlet-mapping>
            <servlet-name>a-servlet</servlet-name>
            <url-pattern>/aservlet</url-pattern>
    </servlet-mapping>
</web-app>
cs


brain은 웹 어플리케이션의 디렉토리 이름이다. 위 과정을 끝마치게 되면 서블릿을 웹 컨테이너가 찾아서 http 요청을 전달할수 있게 된다.(서블릿 등록 과정)

또한 서블릿은 컴파일되어 WEB-INF/classes 디렉토리에 먼저 옮겨 놓은 다음에 등록과정을 마무리 해야 한다.


서블릿 생명주기

 


클라이언트로부터 같은 요청이 서버로 계속해서 전달되는 경우 전달 될때마다 서블릿을 생성하고 초기화 하는것이 아니라, 기존에 만들어 져있던 서블릿을 재 활용하게 된다. 재 활용 한다는것은 메모리에 로드된 딱 하나의 서블릿에 대해 멀티 쓰레드 환경에서 동작한다는 뜻이다.

서블릿의 초기화 과정에서 호출 되는 init() 콜백 메소드와 서블릿 소멸 과정에서 호출되는 destroy() 메소드는 딱 한번씩만 호출된다.


따라서, 서블릿에 반복적으로 실행될 필요 없는 딱 한번만 실행되어도 상관없는 코드들은 init()메소드에 넣어야 한다. 예를들면, 사용자가 피보나치 수열의 계산값을 알고 싶어서 웹 서버에 숫자 1~100사이를 전달하면 웹 서버는 그 숫자 까지의 피보나치 수열을 리턴한다고 해보자. 이럴때 피보나치 수열을 요청이 올때마다 계산할게 아니라, 서블릿이 생성될때 init()메소드 안에서 딱 한번만 실행해놓고 배열에 저장해놓은다음에, 요청이 올때마다 배열을 참조해서 결과만 내주는 식으로 코드를 짜는게 훨씬 효율적이다.


웹 컨테이너(톰캣)는 서블릿에 대한 첫번째 요청이 왔을때 그 서블릿을 초기화하게 되고 서블릿의 init()메소드가 불리게 된다. 하지만, init()메소드에서는 시간이 굉장히 오래걸리는 작업이 있을 수 있다. 그럼, 첫번째 그 서블릿을 요청한 사용자는 굉장히 오랜 시간을 기다려야 응답을 받을 수 있다. 이런일을 막기 위해서 첫번째 요청이 올때 서블릿을 생성할게 아니라 웹 컨테이너가 로드 될때 서블릿을 생성하게 끔 할 수 있다.


바로 서블릿을 등록하기 위해 사용하는 web.xml파일에 그 서블릿을 명시하면 된다. 그 web.xml파일은 앞에서도 얘기했듯이, 웹 컨테이너가 사용자 요청에 맞는 적절한 서블릿을 찾을때 사용하는 xml파일이다. 즉, 웹 컨테이너가 사용하는 파일이다.

그렇기 때문에, 이곳에 나(서블릿)는 컨테이너가 로드 될때 생성시켜주세요. 라고 명시해야 한다.


<servlet>

<servlet-name>fibonacci-servlet</servlet-name>

<servlet-class>FibonacciServlet</servlet-class>

<load-on-startup/>

</servlet>


이런식으로 적어놓으면 컨테이너가 메모리에 로드될때 FibonacciServlet 서블릿도 같이 메모리에 로드되며 생성,초기화 된다.



'컴퓨터 공학과 졸업 > JSP&Servlet' 카테고리의 다른 글

필터와 래퍼  (0) 2018.07.27
JSP의 새로운 문법  (0) 2018.07.26
웹 어플리케이션 구조  (0) 2018.01.26
웹서버와 WAS의 차이(feat.톰캣)  (0) 2018.01.21
Servlet, JSP  (0) 2018.01.21
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함