TIL - [DAY 6] 서블릿 컨테이너와 생명주기

jihan kong·2022년 5월 27일
0

Spring Boot 개념정리

목록 보기
6/6
post-thumbnail

SpringBoot의 동작 원리에 대해 학습하고 있다. 지난 시간에는 Tomcat 내장 서버에 대해서 학습했고, 오늘은 서블릿 컨테이너 (객체) 와 서블릿 컨테이너의 생명주기에 대해 학습했다.

SpringBoot 의 동작 과정에서 서블릿 컨테이너는 아주 중요한 역할을 한다. 간략하게 살펴보면, SpringBoot는 다음의 동작 프로세스를 거친다.

그럼 이제 좀 더 자세히 살펴보자.

1. 클라이언트에서 요청

client에서 요청이 들어왔을 때, 요청 내용에 따라 우리의 웹 앱은 다르게 작동한다. 만약, .html, .css, .jpg 와 같은 정적인 파일이라면 톰캣은 작동하지 않고, 아파치만 작동하게된다.

하지만, 확장자가 .java 와 같은 파일이라면 톰캣이 실행되게 된다는 것이 지난 시간의 내용이다.

번외로 클라이언트의 요청은 URLURI 가 있는데, 쉽게 말해 URL은 자원에 접근하는 방식, URI는 식별자로 접근하는 방식을 말한다. 파일에 직접 요청하는 방식인 URL을 스프링에서는 지원하지 않는다.

따라서 식별자를 통해서만 요청을 받을 수 있는데, 이는 특정 파일에 대한 요청은 할 수 없다는 뜻이고 다르게 말하면 요청시에는 무조건 자바를 거쳐야한다는 뜻이다. 그래서 스프링은 컴파일을 위해 톰캣을 실행시킨다.

2. 최초의 요청시 동작

  1. 클라이언트로부터 최초로 java resource의 request를 응답받은 스프링은 서블릿 컨테이너(톰캣)를 통해 서블릿 객체를 생성하게 된다.
  2. 객체는 init() 메서드를 통해 생성 및 초기화된다.
  3. service() 메소드는 어떤 요청이 들어왔는지를 (get, post, put, delete, patch) 체크한다.

3. 스레드(thread) 동작


1. init() 메서드의 경우, 기존의 스레드가 생성해줌.
2. service() 메서드를 호출할 때, 새로운 스레드(스레드1)가 생성됨.
3. 이 스레드는 DB연결도 하고 필요한 데이터를 찾아서 HTML에 담아서 응답 등의 기능을 할 것.
4. 두 번째 요청이 들어올 경우, 서블릿 객체를 재사용함.
5. service() 메서드를 호출할 때, 새로운 스레드(스레드2)가 생성됨.

💡 여기서 잠깐! 스레드란?
-> 스레드(thread)는 어떠한 프로그램 내에서, 특히 프로세스 내에서 실행되는 흐름의 단위를 말한다. 일반적으로 한 프로그램은 하나의 스레드를 가지고 있지만, 프로그램 환경에 따라 둘 이상의 스레드를 동시에 실행할 수 있다. 이러한 실행 방식을 멀티스레드(multithread)라고 한다.
출처 : 위키백과


그렇다면 여기서 의문점이 든다. 왜 request가 들어올 때마다 스레드가 새롭게 생성될까?

4. 자바 메모리의 특성

이것은 자바의 메모리의 특성에 대해 공부하면 알 수 있다. 자바 메모리는 크게 static, heap, stack으로 이루어져있다.

  • 사용자가 A라는 클래스를 생성하여 Hello() 라는 메서드를 초기화한 상태
  • 클래스 A를 토대로 new A 와 같은 생성자로 메서드를 생성하게 되면 생성된 객체는 Heap에 저장된다.
  • Heap에서 Hello 메서드를 호출할 때, 추가(push) 된다.

여기서 알고 넘어가야할 것은 스택 공간의 경우, 모두 독립적으로 사용된다. 만약, 다양한 사람들이 들어와서 hello 메서드를 요청함에 따라 동시에 3번 호출하게 되는 상황이 발생한다면 어떻게 될까?

위의 그림처럼 매 호출마다 공간을 새롭게 할당하게 된다. 결국 서블릿 컨테이너는 하나로 재사용하지만 스레드는 힙에 동적할당하므로 스레드1, 스레드2, 스레드3, ... 이렇게 계속해서 할당해나가게 된다.

5. 풀링(Pooling) 기법

스레드는 컴퓨터의 성능에 따라 제한적이다.
가령, 스레드20 까지 만들수 있는 컴퓨터 메모리가 있다고 가정하자. 20대의 request가 동시적으로 들어오면 스레드는 20까지 늘어나게 된다. 이 시점에서 21번째 요청이 들어오게 된다면 21번째 요청은 대기하고 있다가 스레드1의 사용이 종료되면 (요청-응답이 끝나면) 스레드1을 재사용하여 사용할 수 있게 된다. 이러한 재사용 기법을 풀링 기법이라고 한다.

profile
학습하며 도전하는 것을 즐기는 개발자

0개의 댓글