2 minute read

서블릿 동작 원리와 라이프 사이클

서블릿의 동작 원리와 라이프 사이클에 대해서 알아보기 전에, 이에 대한 이해를 조금 더 빠르게 하기 위해서 웹 서버와 WAS 간의 구성/관계에 대해서 살펴보자

📌웹 서버와 WAS 간의 관계📌

https://github.com/hy6219/TIL-Today-I-Learned-/blob/main/JSP%20Servlet/Basic/%EC%9B%B9%EC%84%9C%EB%B2%84%EC%99%80%20WAS%EC%9D%98%20%EC%9D%BC%EB%B0%98%EC%A0%81%EC%9D%B8%20%EA%B5%AC%EC%84%B1.png?raw=true

웹 서버와 웹 어플리케이션 서버간의 관계

참고: https://gap85.tistory.com/entry/WAS-와-웹서버-의-차이

저번 시간에 정리했던 것에 더해서 전반적인 구조적 관계를 살펴보자

먼저 웹을 구조적으로 나누어본다면

  1. 클라이언트 : 사용자

  2. 서버 : 사용자의 요청을 받아서 처리하고, 그 결과를 페이지로 반환해주는 역할

로 나누어 볼 수 있다.

그리고, 구조적으로, 서버는

웹 어플리케이션 서버 내부에 웹 서버와 웹 컨테이너가 포함되어 있다!

저번에 정리해두었던 관련 개념-

Overview

  • 웹 서버 : 사용자로부터 요청을 받아서, 그 요청에 대한 결과를 반환해주려는 서버
  • 웹 어플리케이션 서버 WAS: 웹 서버로부터 전달받은 요청, 정보에 대한 비즈니스 로직 등의 로직을 데이터베이스와 연계하여 처리한 결과값을 웹 서버에 전달해주는 서버
  • 웹 컨테이너 : jsp, servlet의 구동 환경을 제공해주는 틀
-서블릿 컨테이너 : 서블릿 관련 객체를 관리
서블릿 생명주기 관리(생성, 초기화, 소멸), HttpServletRequest/HttpServletResponse 객체 생성, 요청에 따라 멀티 스레딩 구성(톰캣이 관리해줌), 전송 방식에 따라 동적으로 페이지를 구성하는 작업 진행, 정적 로딩 처리 -JSP 컨테이너 : jsp 파일 ▶️ java 코드 ▶️ class 파일 ▶️ 메모리 공간에 로드한 후 실행가능하도록 만드는 작업(Servlet화) 진행, 처리 결과를 HTML 파일로 만들어주는 작업 진행, 동적 로딩 처리

🌹 정적로딩과 동적로딩 🌹

https://ubange.tistory.com/223

정적로딩과 동적로딩은 각각 static 변수와 인스턴스 변수를 떠올리면 될 것 같다!

-정적로딩: 프로그램이 실행될 때 시작부터 메모리에 로딩되는 방식

-동적로딩: 실행될 때마다 메모리에 올라가고, 필요없어지면 메모리에서 해제되는 방식

▶️ 인터프리터 언어(스크립트 언어) 동작 방식과 유사!!

웹 서버와 WAS 의 차이점

웹 서버와 WAS의 차이점

서블릿의 동작 원리

https://github.com/hy6219/TIL-Today-I-Learned-/blob/main/JSP%20Servlet/Basic/%EC%84%9C%EB%B8%94%EB%A6%BF%20%EB%8F%99%EC%9E%91%EC%9B%90%EB%A6%AC%20flow.png?raw=true

서블릿의 동작원리

위에서 설명했던 웹 서버와 WAS 간의 구조상 관계가 바로 이 동작원리와 직결된다!

서블릿파일을 만들어둔 상태에서, 클라이언트로부터 요청을 받았을 때의 서블릿이 어떻게 동작하는지를 아래와 같이 각 단계별로 나누어 생각해보자

  1. 클라이언트가 어떤 동작을 하게 되면, 브라우저로부터 서블릿에 대한 요청이 들어온다(to 웹서버)
  2. 웹서버는 요청받은 서블릿을 “같은 WAS 내에 있는 서블릿 컨테이너”에 전달
  3. 서블릿 컨테이너에 전달된 서블릿은 스레드를 기동시키고, 서블릿 객체를 생성
  4. 서블릿 수행
  5. 서블릿 객체 작업 종료(if 그렇다면~ 6단계로~~)
  6. 기동되었던 스레드 종료
  7. 서블릿 수행 결과가 웹 서버에 전송됨
  8. 웹 서버에 전송된 수행결과가 클라이언트에 전송됨

서블릿의 라이프사이클

  • 서블릿의 라이프사이클은 이전에 서블릿이 Event Driven Programming 방식으로 수행된다는 점에서 짧게 소개한 적 있다! 거기에 4~6과정을 엮어서 정리해주자!
    1. 먼저, 앞에서 설명한 과정에 의해서, 브라우저의 요청을 받은 웹 서버가 전달받음
    2. 웹 서버는 서블릿을 서블릿 컨테이너에 전달
    3. 서블릿 컨테이너는 스레드에 대해서 스레드가 기동되면서 서블릿 객체를 생성
    4. 서블릿 객체가 생성된 후 , init() 메서드가 최초 한번만 생성된다
    5. 서블릿 객체는 메모리에 속해있어서, 요청될때마다, 서비스를 제공하는 요청 메서드인 doGet 혹은 doPost가 호출된다(그 이후는 위의 6~8 단계가 알맞게 작동됨)
    6. 하지만, 만약 톰캣을 해제 or 서블릿 컨테이너 종료(톰캣 재가동) or 서블릿 내용 변경이 발생한다면 , 자원을 해제하는 destroy()가 호출됨

https://hy6219.github.io/TIL-Today-I-Learned-/JSP Servlet/Basic/서블릿 기본 구조.html

https://github.com/hy6219/TIL-Today-I-Learned-/blob/main/JSP%20Servlet/Basic/%EC%84%9C%EB%B8%94%EB%A6%BF%EC%9D%98%20%EB%9D%BC%EC%9D%B4%ED%94%84%EC%82%AC%EC%9D%B4%ED%81%B4.png?raw=true

서블릿의 라이프 사이클

  • 서블릿이 ASP나 PHP보다 수행 속도가 빠른 이유 ASP나 PHP보다 수행 속도가 빠른 이유

    📌**서블릿**은 **객체가 한 번 생성되면 메모리에 계속 남아 있어서, 이후에 로딩된 서블릿으로부터 서비스만 받으면 되는 방식**
    

⚠️ASP, PHP는 인터프리터 방식으로 코드가 재해석되어, 수행속도가 느림!

💬 인터프리터 방식?💬

프로그래밍 언어를 수행시키는 방식

  • Duck Typing: 어떠한 변수나 객체가 메서드 등에 의해 실행되는 형태에 따라 적합성이 판단되는 것 (. ↔️ structural typing: 정적인 언어- 예 : 자바)

✏️ 보안보다는, 편의성(convenience)에 치중되어 있음!

예) 자바스크립트

const welcome = 'welcome';//String
const num1    = 10;       //integer
const welStr   = `${welcome} your ${num1} th visit!`;//String
const fNum    = 5.1;      //float

ref: https://en.wikipedia.org/wiki/Duck_typing

https://jins-dev.tistory.com/entry/Compiler-와-Interpreter-의-개념과-차이점

Updated: