○ WEB/19.07 BoostCourse_DB연결 웹앱

[웹기초 BE_Servlet] Servlet 정리

0ver-grow 2019. 7. 19. 13:40
반응형

자바웹앱?
자바웹앱은 혼자서 동작하지 않고 WAS(웹앱서버)에 설치되어 동작하는 앱
자바웹앱 폴더에는 WEB-INF폴더 필수존재. 이 폴더 안에 web.xml파일 존재(servlet3.0미만)
web.xml이 배포기술자, 웹앱정보를 가짐

서블릿?
URL요청을 처리하는 프로그램을 서블렛
프로그램을 수행해서 페이지를 동적으로 만들어 준다.
자바 웹앱의 구성요소 중 동적인 처리를 하는 프로그램 역할
WAS에서 동작하는 JAVA클래스
HttpServlet 클래스 상속받아야함
서블릿과 JSP를 조화롭게 쓰면 좋다. 웹페이지 구성화면(HTML)은 JSP로, 복잡 프로그래밍은 서블릿으로 구현


Dynamic WebProject생성 > HelloServlet이란 서블릿 클래스 생성
작성된 서블릿은 서블릿클래스 내부에 설정한 런타임, 톰캣 서버에 의해 동작
웹 브라우저를 이용해서 톰캣 서버에 URL요청
서블릿 클래스 실행결과를 웹브라우저에서 확인

Dynamic Web Project생성하기

위에 적힌 URL로 cli가 server에게 req한다.

앞서 설명했듯 서블릿은 동적으로 응답결과를 만들어낸다.

응답 페이지를 미리 만들어 놓지 않고

요청(URL Mapping Name)이 들어왔을 때 서블릿이 실행되어 응답 코드만든 뒤

그 코드로 응답한다.

 

서블릿 파일의 doGet()

< Servlet Life Cycle >

LifeCycle? 생성부터 소멸까지의 과정

 

Servlet's lifecycle

HttpServlet is overriding third Method()

생성 : init()

호출 : service() => request, response

소멸 : Destroy()

 

새로 만든 서블릿 클래스의 이름은 firstweb

이 클래스의 URL Mapping NameLifecycleServlet

여기에 Servlet LifeCycle을 확인하기 위해 생성한

init(), service(), destroy() 메서드. 그리고 생성자메서드.

이제 톰캣서버를 실행시켜보자.

 

// 호출 순서

호출된 URL을 보면

http://localhost:8080/firstweb/LifecycleServlet 이라고 나온다.

 

1. 이 URL로 cli가 server에게 req한다.

2. server는 이 URL을 받아 URLMappingName이 일치하는지 확인

3. URLMappingName해당 클래스의 메모리에 존재하는지 체크

4. 해당 클래스의 메모리에 URLMappingName이 존재하지 않으면 객체를 생성하여 메모리에 올린다.

이것이 생성자를 호출하는 것. 최초로 해당 클래스를 호출했을 경우에만(서버에 메모리가 없기에) 일어난다.

 

(왼쪽) 최초로 클래스가 호출되어, (오른쪽) 빨간박스안의 URLMappingName이 새로 생기게 된 것!

그렇다면 다시 호출하면 어떻게 될까?

그냥 service메서드만 호출된다.

왜냐하면 서블릿은 서버에 여러개의 서블릿 객체를 만들지 않기 때문이다.

요청된 객체가 메모리에 있는지 확인만 하고 service메서드만 호출한다.

 

그럼 destroy객체는 무엇이고 언제 실행되는 걸까?

서블릿이 수정되면 기존에 메모리에 올라간 객체는 사용할 수 없다.

즉, 웹앱이 갱신되거나 WAS종료되면 destroy()가 호출된다.

destroy()가 호출되고나면

다시  처음처럼 생성자 및 init()가 호출된다.

 

< 이론 설명 >

1. WAS는 서블릿의 요청을 받는다. 그리고 해당 서블릿이 메모리에 있는지 확인

2. 메모리에 없다면 해당 서블릿 클래스를 메모리에 올린다. 즉 객체를 생성하는 작업을 한다.

3. 그리고 init()메서드를 실행한다.

4. service()메서드를 실행한다. service()메서드에서 request 및 response한다. service()메서드는 객체가 메모리에 있다면 호출, 응답해야 되는 모든 내용은 이 메서드에 구현한다.

5. WAS가 종료되거나, 웹앱이 갱신되면 destroy()메서드가 실행된다.

 

 

그런데 궁금한점!

doGet()메서드만 있었는데 service()가 가능했던 이유가 뭘까?

HttpServlet에는 service()가 이미 구현된 상태이다.

그러므로

doGet()메서드만 Override한 경우에도 WAS는 service()만 호출하기에

클래스에 service()를 Override하지않아도 부모 클래스의 HttpServlet의 service()메서드를 찾아 실행하기 때문에 가능한 것.

 

그럼 HttpServlet의 service()메서드는 어떻게 구현된거지?

이 service()메서드는 템플릿 메소드 패턴으로 구현!

- Cli의 req가 GET일 경우, doGet(req,res) 호출

Cli의 req가 POST일 경우, doPost(req,res) 호출

server()가 위처럼 동작하기에 doGet()메서드만으로 응답결과 보낼 수 있었음

 

Get인 경우,

기존에 작성한 페이지를 호출

 

Post인 경우.

Cli가 입력값을 넣어, 입력값이 응답 결과로 넘어감

 

 

반응형