<< 학습 목표 >>

1. 서블릿의 상속 구조를 설명할 수 있다.

2. 서버가 클라이언트의 요청을 처리하는 과정을 설명할 수 있다.

3. 서블릿 라이프 사이클에 대해서 설명할 수 있다.


지금까지 우리가 서블릿을 배우기 위해 지나온 과정을 생각해보자

Chapter01. 서블릿으로 웹 프로그램을 개발하기 위한 준비

 - 자바(JDK) 설치

 - 이클립스 설치

 - 서버 설치

 - 개발을 편하기 하기 위해 이클립스와 서버를 연결

 - 웹 프로젝트 따라 만들기

 - 이클립스 내 서버에 웹 프로젝트 올리고 웹 프로젝트에 접근

Chapter02. 서블릿 기초 닦기

 - 웹 프로젝트의 구조 파악

 - 서버 이해하기

 - 서블릿 추가 & 등록, 실행, 호출


서블릿(Servlet) 하면 항상 JSP와 함께 묶여서 얘기가 되고 JSP를 먼저 설명하는 책이나 수업도 있지만 나는 반드시 서블릿을 먼저 알아야한다고 생각함

서블릿과 JSP는 비슷하지만 완전히 다른 것이라 분리해서 배우는게 더 나은 학습 방법이라고 생각함

그래서 이 블로그에서도 Servlet 카테고리와 JSP 카테고리로 나눴음

 

서블릿과 JSP 중에서는 서블릿이 먼저 나왔음

서블릿으로 클라이언트에게 동적 컨텐츠를 전달했다가 서블릿의 단점이 보여 이를 보완해서 나온게 JSP임

그렇다고 해서 보완해서 나온 JSP만 배우면 안됨

분명 서블릿이 했던걸 모두 JSP가 대체할 수 있긴 하지만 서블릿만의 고유한 역할이 있고 JSP만의 고유한 역할이 있음

특히나 "서블릿, JSP 을 배울 때 Model1(모델 1), Model2(모델 2) 개발 방식으로 포트폴리오를 만들 수 있다" 는 얘기가 많이 나오는데 과감하게 언급하자면 Model1 개발 방식은 없음

( Model1, Model2 개발 방식이 무엇인지는 이 블로그의 Servlet, JSP 두 카테고리를 쭉 따라 배워가다 보면 알 수 있음 )


다시 한번 정리도 하고 좀 더 깊게 들어가 서블릿의 상속 구조와 서블릿의 라이프사이클(Life Cycle, 생명주기) 에 대해서 배우자

 

먼저 앞서 얘기했던 서블릿의 특징을 다시 한번 정리하자

 

서블릿은 클라이언트의 요청에 따라 동적인 서비스를 제공하는 자바 클래스임

서블릿은 일반 자바 프로그램과 다르게 이클립스 내에서 실행할 수 없고 톰캣과 같은 WAS를 통해 실행됨

서블릿은 컨테이너에 의해 스레드 방식으로 실행됨

서블릿은 클라이언트, 주로 웹 브라우저가 요청했을 때 동작함

특히, 클라이언트의 요청 방식에 맞는 do 로 시작하는 메서드가 동작하며 클라이언트가 GET 방식으로 요청했다면 서블릿의 doGet 메서드가 동작하고 POST 방식으로 요청했다면 doPost 메서드가 동작함


서블릿의 상속 구조를 보자

 

우리가 일반 자바 클래스를 서블릿으로 변환하기 위해 extends HttpServlet 을 했음 HttpServlet부터 타고 올라가보면 HttpServlet은 GenericServlet의 자식 클래스임

GenericServlet은 추상 클래스로 Servlet, ServletConfig 인터페이스를 구현한 추상 클래스임

 

Servlet, ServletConfig 인터페이스에는 다음과 같은 메서드가 선언되어있음

<< Servlet 인터페이스 >> << ServletConfig 인터페이스 >>
- init()
- service()
- destroy()
- getServletInfo()
- getServletConfig()
- getInitParameter()
- getInitParameterNames()
- getSerletContext()
- getServletName()
<< GenericServlet 추상 클래스 >>
GenericServlet 추상 클래스는 Servlet, ServletConfig 인터페이스에 선언된 메서드 중 service() 메서드를 제외한 모든 메서드를 구현한 추상 클래스
GenericServlet 추상 클래스의 자식 클래스는 service() 메서드를 구현해야함
<< HttpServlet 클래스 >>
GenericServlet 추상 클래스의 자식 클래스로 service() 메서드를 구현한 클래스
이 클래스의 자식 클래스는 서블릿이 되며 http 프로토콜을 사용한 클라이언트의 요청을 처리할 수 있는 서블릿이 됨

이 클래스에 구현된 service() 메서드는 클라이언트의 요청이 GET 방식이면 doGet() 메서드가 호출되고 클라이언트의 요청이 POST 방식이면 doPost() 메서드가 호출되도록 구현되어있음

따라서 이 클래스의 자식 클래스인 서블릿은 doGet, doPost() 등의 메서드를 구현해 클라이언트의 요청을 처리하면 됨

서블릿의 상속 구조에 대해서 반드시 알아야하는건 아니지만 알고 있으면 도움이 많이 됨


이번에는 서블릿의 라이프사이클(Life Cycle, 생애주기) 에 대해 알아보자

우선 클라이언트가 서버로 요청했을 때 어떤 과정으로 요청을 처리하고 처리 결과를 응답하는지 알아보자

 

음식점에서 김치찌개를 주문하면 주방에서 힘들지 않을까? 차라리 된장찌개가 나을려나? 이런 고민을 하진 않음 그냥 먹고 싶은 음식을 주문할 뿐임

클라이언트가 서버로 요청을 할 때 클라이언트는 이 요청이 정적 컨텐츠를 요청하는건지 동적 컨텐츠를 요청하는건지 모름

그저 내가 원하는 서비스가 있으니 그 서비스를 요청하는 것일 뿐

01

 

보통 html, css, js, image 파일 등이 정적 컨텐츠이고 jsp, servler 파일 등이 동적 컨텐츠임

그러나 정확한 판단은 WAS의 웹 서버가 함

 

클라이언트가 어떤 요청을 하게 되면 WAS의 웹 서버는 정적 컨텐츠를 요청하는건지 동적 컨텐츠를 요청하는건지 판단함

 

이때 정적 컨텐츠 요청이었다면 web server 선에서 정적 컨텐츠를 찾아서 클라이언트에게 전달(응답, Response) 함

 

클라이언트가 어떤 요청을 했는데 Servlet 을 요청한거라면 WAS의 web server는 ServletContainer에게 처리 권한을 넘김

 

ServletContainer는 클라이언트의 URL과 요청 방식을 분석해 적절한 서블릿의 do~ 메서드를 호출해 요청을 처리함

 

그리고 해당 서블릿이 반환한 처리 결과를 웹서버에게 전달하고 웹서버는 Servlet Container에게 전달 받은 처리 결과를 클라이언트에게 전달(응답, Response) 함

 

 

이 과정에서 ServletContainer와 Servlet 사이의 흐름을 더 자세히 알아보자

 

Servlet Container는 A 서블릿이 실행되고 난 후 클라이언트가 A 서블릿을 최초로 요청했다면 Servlet Container는 A 서블릿의 init() 메서드를 먼저 호출하고 그 다음 do~ 메서드를 호출함 그리고 난 다음! do~ 메서드가 반환한 처리 결과를 웹서버에게 전달함

 

클라이언트가 A 서블릿을 최초로 요청한게 "아니라면"... 두 번째, 세 번째 요청처럼...

ServletContainer는 A 서블릿의 do~ 메서드를 호출함 그리고 난 다음! do~ 메서드가 반환한 처리 결과를 웹서버에게 전달함

 

마치 자바의 for문 처럼 동작하는 것

for문의 초기식은 for문의 최초에 딱 한번만 실행되고 이후에는 조건식, 증감식이 실행되는 것처럼

클라이언트가 어떤 서블릿을 요청했을 때 그 요청이 최초 요청이라면 init() -> do~ 순서로 메서드가 실행되고 그렇지 않다면 do~ 메서드만 실행됨

이걸 서블릿의 라이프사이클(Life Cycle, 생애주기) 라고 함

사람의 생애주기는 사람이 태어나서 아동기에는 보통 뭘 하고 청소년기에는 보통 뭘 하고, ..., 마지막 임종 때는 보통 뭘 하고 ... 이런식으로 생애주기가 있는 것처럼 서블릿의 생애주기는 서블릿을 최초로 요청했을 때는 어떤 순서로 메서드가 실행되고 최초 요청이 아니라면 어떤 순서로 메서드가 실행되는지에 대한 얘기임

 

이러한 과정도 역시나 반드시 알아야하는건 아니지만 알고 있으면 많은 도움이 됨

반드시 알아야 할 내용은 아니니 별도의 실습은 없고 "그렇구나" 정도로만 보고 넘어가자

728x90
LIST