[Boostcourse] 풀스택/웹 프로그래밍(풀스택)

Servlet 라이프 싸이클 { init, service, destroy & 부모객체 HttpServlet }, 간단 동적 웹 구현

Ben의 프로그램 2023. 7. 14. 00:13
728x90
라이프싸이클?
어떤 객체의 생성부터 소멸까지의 과정을 라이프 싸이클이라고 합니다. 이번 학습에서는 서블릿의 라이프 사이클을 알아보겠습니다. 
Servlet 생성하기 (라이프 싸이클 볼 수 있도록 init( ) destroy( ) service( ) 3가지 메서드 오버라이딩 )
서블릿이 언제 생성되고 언제 어떤 메서드가 호출되는지 알아보고자 합니다. 우선 자세히 알아보기 전에 라이프 싸이클 서블릿이라는 클래스를 만들어서 어떤 메서드들이 출력이 되는지 확인해봅시다.
LifecycleServelt 이라는 서블릿을 하나 생성하겠습니다.

URL 매핑은 그대로 두어도 괜찮습니다. 

서블릿의 라이프 사이클을 보아야 하기 때문에 init, destroy, service 의 메서드들을 체크하고 서블릿을 생성하겠습니다. 

 

Servlet 라이프 싸이클
언제 서블릿이 생성되고 파괴되는지 즉 서블릿의 라이프사이클을 파악하기 위해서 몇가지 코드를 추가해보려고 합니다.

LifecylcleServlet, init, destroy, service 가 호출될 때마다 메시지가 출력되도록 코드를 작성하였습니다. 
코드를 실행시켜 보겠습니다. 코드가 실행되면 콘솔 창에 메시지가 출력되는데요. 우선 출력 결과를 이해해 보겠습니다.


1. "LifecycleServelt 생성"
우선 클라이언트가 서버에 해당 주소를 요청했겠죠. 그러면 서버는 요청을 받아서 LifecycleServlet 이라는 요청은 내가 갖고 있는 파일 중에 LifecycleServlet 이구나! 하는 것을 알아냈을 거구요. 그러면 서버는 해당 클래스가 메모리에 존재하는지 여부를 파악합니다. 메모리에 존재하지 않는다면 메모리에 해당 객체를 생성해야합니다. 우리는 최초로 LifecycleSevlet 을 호출한 상태입니다. 서버는 해당 서블릿이 메모리에 없다는 것을 판단했을 것이고 그러니까 LifecycleServlet 을 생성하게 됩니다. 그래서 생성자에 우리가 넣어준 메시지가 출력되는 것을 확인할 수 있습니다

2. "service 생성"
우선 여기까지만 확인하고 실행된 웹 브라우저를 새로고침 해보겠습니다. 새로고침 했더니 다음과 같이 콘솔 창에 사로운 메시지가 출력된 것을 확인할 수 있습니다. 새로고침이 아니라, 새로운 창에서 해당 URL 열어도 service 가 호출되는 것을 볼 수 있습니다. 이런 일이 벌어지는 이유는 Servlet 은 서블릿 객체를 여러개 만들지 않기 때문입니다. 요청이 들어오면 매번 생성하는 일을 반복하는 것이 아니라 실제 요청된 객체가 메모리에 있다면 서비스 라는 메서드만 호출합니다. 그래서 한 번 최초로 호출된 이후에는 호출될 때마다 서비스 메서드만 호출되는 것을 확인할 수 있습니다

3. "Destroy 생성"

그렇다면 Destroy 라는 메서드는 언제 호출될까요? 우선 서블릿 파일을 수정해보겠습니다.
init 메서드의 출력메시지를 수정했는데요. 수정한 다음 저장을 하니까 콘솔창에 다음과 같은 메시지가 출력되는 것을 확인할 수 있습니다. 
Destroy 라는 메서드는 서블릿이 수정되면 호출된다는 것을 알 수 있습니다. 또한 메모리에 있는 서블릿이 Destroy 되었기 때문에 웹 브라우저를 새로고침 해보면 다시 생성하는 것부터 다시 하는 것을 볼 수 있습니다. 
4. "init 생성"
WAS 는 서블릿 요청을 받으면 해당 서블릿이 메모리에 있는지 우선 확인합니다. 이후에 메모리에 서블릿이 없다면 해당서블릿 클래스를 메모리에 올려놓는 미션을 수행하게 됩니다. 메모리에 올려놓는 작업은 객체가 생성되는 작업을 의미합니다. 그렇기 때문에 처음 서블릿이 실행되면 init( ) 메서드가 실행되게 됩니다. 메모리에 서블릿이 생성된 다음에는 Service 메서드가 실행되어 서블릿이 실행됩니다. 최초의 서블릿이 호출된 이후에는 service 메서드만 호출되게 됩니다. 여기서 우리가 알고 넘어가야 하는 부분은 호출되었을 때 동작하는 서비스들은 모두 service( ) 메서드에 구현해야 겠구나 정도이겠습니다. WAS 까 종료되거나 서블릿이 수정되어 갱신될 경우 destroy( ) 메서드가 실행됩니다. 

 

Service 메서드 자세히 살펴보기 ; 이전에 작성했던 HelloServlet 에서 떠오르는 궁금증
그런데, 이전에 우리가 화면에 hello sevlet 을 출력했을 때 init, service, destroy 와 같은 메서드를 본적이 없는데 어떻게 된 일일까요? HelloServlet 에서는 doGet 이라는 메서드만 오버라이드했었는데요. 분명 잘 동작했었습니다. 분명히 WAS 는 inti 메서드를 호출한 다음 service 라는 메서드를 호출하는 일만 수행하는데 doGet 이라는 메서드는 어떻게 실행되었을까요? Service 라는 메서드가 약간 신기하게 동작해서 이런 일이 발생합니다. Service 메서드를 좀 더 살펴보겠습니다

Service 메서드는 HttpServlet 에 이미 구현이 되어있는 상태입니다. 상속의 개념인데요. 내가 Service 라는 메서드를 갖고 있지 않다면 누구의 Service 메서드가 실행될까요? 나의 부모 클래스의  Service 메서드가 실행되겠죠. 그러니까 내가 doGet 이라는 메서드만 오버라이드하여 사용했다면 WAS 는 Service( ) 메서드를 사용해야 할 때 나의 부모인 HttpServlet 의 Service 메서드를 실행시켰다는 겁니다. 그러니까 우리는 HttpServlet 이라는 부모가 어떤 방식으로 Service 메서드를 구현하고 있는지 살펴봐야 합니다

 

HttpServlet 의 Service 메서드
HttpServelt 의 service 메소드는 템플릿 메소드 패턴으로 구현되어 있습니다. 클라이언트의 요청이 GET일 경우에는 자신이 가지고 있는 doGet(request, response) 메소드를 호출하고 클라이언트의 요청이 Post일 경우에는 자신이 가지고 있는 doPost(request, response) 를 호출합니다. 서비스라는 메서드가 이렇게 동작하고 있었기 때문에 HelloServlet 에서 doGet 메서드만 오버라이드했어도 클라이언트의 요청에 따라 doGet 을 호출하면 HelloServlet의 doGet 을 호출하고 Post 를 요청하면 HttpServlet의 doPost 를 호출하면서 동작하게 됩니다. 

 

HttpServlet 의 Service 메서드 실습 (동적 웹 구현)
doGet 메서드에서는 이런 HTML 을 클라이언트에게 보내줄 것이구요. doPost 는 request 객체의 getParameter( ) 메서드를 사용하여 파라미터 중에 name 이라는 것을 꺼내서 이 name 을 응답 결과에 함께 응답하려고 합니다. 저장해보고 실행해보겠습니다. 

소스 코드를 살펴보겠습니다. 
doGet 메서드 안에 문자열로 넣어줬던 코드들이 응답 결과로 넘어가고 있는 것을 볼 수 있습니다. 여기서 중요한 것은 form 태그입니다. method 라는 값과 action 이라는 속성이 있습니다. 이것이 의미하는 것은 submit 이라는 것이 눌렸을 때 이 주소로 post 를 요청해주세요 라는 의미입니다. 이것이 의미하는 것은 다음과 같습니다. 클라이언트가 URL 주소를 통해서 접근을 하면 Get 요청을 서버에 하게 되고 서블릿은 doGet 메서드를 실행하여 HTML 을 받아갔다. ok 라는 버튼을 클라이언트가 누르면 Post 요청이 서버에 전달이되고 doPost 메서드가 실행된다

프로그램이 동작하면서 응답결과가 바뀌기 때문에 form 에 값을 넣어줄 때마다 다른 화면이 출력되는 것을 볼 수 있는데요. 이런 것을 우리는 동적인 페이지라고 합니다

 

 

출처 : boostcourse 웹 프로그래밍(풀스택) 
https://www.boostcourse.org/web316/lecture/20655?isDesc=false