티스토리 뷰

반응형
Servlet (서블릿)

서블릿의 개념을 짚어보겠다

클라이언트(사용자)와 서버가 서로 소통을 할 때 HTTP란 규칙을 따라서 요청과 응답을 하게 된다

이때 클라이언트가 보낸 요청과 데이터는 서버에서 처리를 하고 응답을 해야 하는데

이 서블릿이 바로 요청을 처리하고 그 결과를 반환해주는, Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술이다

 

예시로 클라이언트가 회원가입을 한다고 해보자 이때 회원의 이름, 아이디, 비밀번호 등등의 정보를 서버에 전송을 한다

서버는 받은 정보를 처리한후 회원가입성공 페이지를 클라이언트에게 응답하여야 하는데 이러한 역할을 수행하는 것이 바로 서블릿이다

 

근데 서블릿만으로는 한계가 있는 것이 클라이언트가 URL을 입력하여 요청을 하게 되면

정보를 처리하기 위해 스레드를 만들고 객체를 생성하고 직접 서블릿을 맵핑하는 등의 작업이 있어야 한다

이를 손쉽게 처리해주는 것이 서블릿 컨테이너이다

 

Servlet Container(서블릿 컨테이너)

서블릿 컨테이는 아래와 같이 작동한다

Servlet Container

서블릿 컨테이너의 동작원리

1.클라이언트가 URL을 통해 요청을 보내면 HTTP Request를 Servlet Container로 전송한다

-> 웹브라우저 주소창에 입력한 주소를 웹서버가 받아 서블릿 컨테이너로 전송하는 것이다

 

2.HTTP Request를 전송받은 Servlet Container는 HttpServletRequest, HTTPServletResponse 두 객체를 생성한다

-> 클라이언트는 요청에 파라미터, 메시지에 데이터 등 다양한 정보를 보낼텐데 이것들을 생성된 객체에 담는다

 

3.요청 URL을 분석하여 어느 서블릿에 대해 요청을 한 것인지 찾습니다

-> 사용자가 web.xml에 맵핑한 서블릿 중에서 클라이언트가 요청한 URL과 비교하여 같은 서블릿을 찾는다

 

4.해당 서블릿에서 service 메서드를 호출 한 후 POST, GET 여부에 따라 doGet() 또는 doPost()를 호출한다

-> 자바로 만들어진 메서드들을 호출하여 메서드 여부에 따라 이를 호출한다

 

5.doGet() 혹은 doPost() 메서드는 동적 페이지를 생성한 후에 HttpServlet Response 객체 응답을 보낸다

-> 클라이언트에게 동적페이지를 제공하는 것이다

 

6. 응답이 끝나면 Request , Response 두 객체를 모두 소멸시킨다

 

서블렛 컨테이너의 역할

1. 웹서버와의 통신 지원

서블릿 컨테이너는 서블릿과 웹서버가 손쉽게 통신할 수 있게 해주어 소켓을 만들고

(톰캣같은 경우가 이 소켓으로 웹서버와 서블릿 컨테이너를 연결해준다)

Listen, Accept 등을 API로 제공하여 복잡한 과정을 생략할 수 있게 해준다

 

2. 서블릿 생명주기 관리

-서블릿 클래스를 로딩하여 인스턴스화

-초기화 메서드를 호출

-요청이 들어오면 적절한 서블릿 메서드를 호출한다

-서블릿 소멸 시 Garbage Collection(가비지 컬렉션)을 진행

 

2.1 서블릿 생명주기

1 - 클라이언트의 요청이 들어오면 컨테이너는 해당 서블릿이 메모리에 있는지 확인하고 없을 경우 init() 메서드를 호출하여 적재한다. init()메서드는 처음 한번만 실행되기 때문에 서블릿의 쓰레드에서 공통적으로 사용해야하는 것이 있다면 오버라이딩하여 구현한다 실행 중 서블릿이 변경될 경우 기존 서블릿을 파괴하고 init()을 통해 새로운 내용을 다시 메모리에 적재한다

 

2 - init()이 호출된 후 클라이언트의 요청에 따라서 service()메서드를 통해 요청에 대한 응답이 doGet()가 doPost()로 분기됩니다 이때 서블릿 컨테이너가 클라이언트의 요청이 오면 가장 먼저 처리하는 과정으로 생성된 HttpServletRequest, HttpServletResponse에 의해 request와 response 객체가 제공된다

 

3 - 컨테이너가 서블릿에 종료 요청을 하면 destroy()메서드가 호출되는데 마찬가지로 한번만 실행되며 종료시에 처리해야하는 작업들은 destroy()메서드를 오버라이딩하여 구현하면 된다

 

3. 멀티쓰레드 지원 및 관리

클라이언트의 요청은 쓰레드에서 처리한다, 그렇기 때문에 서블릿 컨테이너는 요청이 올때 마다

새로운 자바쓰레드를 알아서 생성한다 메서드를 다 실행하고 나면 쓰레드도 자동을 소멸한다

본래 쓰레드를 직접 관리해야 하지만 서버가 다중 쓰레드를 생성 및 운영해주기 때문에 안정성이 높다

 

4. 선언적인 보안 관리

서블릿 컨테이너를 사용하면 개발자는 보안에 관련된 내용을

서블릿 또는 자바 클래스에 구현해 놓지 않아도 된다

일반적으로 보안관리 XML 배포 서술자에 기록하므로 보안에 대해

수정할 일이 생겨도 자바 소스코드를 수정하여 다시 컴파일 하지 않아도 보안관리가 가능하다

 

JVM의 역할

서블릿 컨테이너 역시 자바 기반의 프로그램이기 때문에 JVM에서 구동 된다

그렇다면 서블렛 컨테이너가 작동할때 JVM에서는 무슨 역할을 할까

 

각 요청들을 분리된 스레드 내부에서 처리한다 즉 서블릿 컨테이너를 사용하면

분리된 자바 스레드들이 처리하도록 하는 것이다 이것이 바로 서블리 컨테이너의 주요 장점이기도 하다

또한 각 서블릿은 HTTP의 요청에 응답하는 특정한 요소들이 있는 자바 클래스이다

 

서블릿 컨테이너를 사용하는 가장 중요한 이유는 클라이언트가 요청한 URL을 분석한 후

보내온 데이터를 객체에 담아 요청과 같은 서블릿을 찾아 이 데이터를 처리하고

클라이언트에게 동적으로 페이지를 만들어 응답하는 것이다

 

 

반응형

'WEB' 카테고리의 다른 글

[WEB] 마크업 언어(Markup Language)  (0) 2021.10.13
[WEB] CSR과 SSR  (0) 2021.08.19
[WEB] Multi-Thread & Thread Pool의 이해  (0) 2021.08.18
[WEB] Web Server 와 WAS  (0) 2021.08.03
댓글