SpringBoot 개념정리(10) - 3. 동작원리

Jang Seowoo·2022년 9월 21일
0
post-thumbnail

인프런 스프링부트 개념정리(이론)
이 글은 다음 강의의 이론 정리 글 입니다.


서블릿 객체의 생명주기가 궁금해요!

2) 서블릿 컨테이너(톰캣)

Client가 요청(request)을 하게 되면 정적인 파일(.html, .css, .png)을 요청하면 톰캣이 아니라 아파치가 일을 한다. 정적인 파일이 아닌 .java 파일을 요청하게 됐을 때 톰캣이 일을 한다.

먼저, Spring이 어떤 방식으로 자원에 접근하는지 알아야 한다.

URL(Uniform Resource Locator): 자원에 접근할 때 사용하는 주소 접근 방식 (Spring은 불가능)
URI(Uniform Resource Indentifier): 식별자를 통해서 접근하는 방식

example)

URL - http://naver.com/a.png (어떤 파일의 위치)
URI - http://naver.com/picture/a (파일이 아님)

특정한 파일을 요청하는 방식인 URL은 Spring은 불가능하다.
= 요청시에는 무조건 자바를 거쳐야한다.
= 무조건 아파치는 톰캣에게 제어권을 넘긴다.

반면, URI는 자원 위치에 직접 요청하는 게 아니기 때문에 다 톰캣이 가로채게 되어있다. 따라서 Spring의 자원 접근은 전부 톰캣이 제어권을 갖게 된다.


그렇다면, Spring의 자원 접근의 제어권을 가지는 톰캣인 서블릿 컨테이너가 어떤 생명주기를 가지는 지 알아보자.

서블릿 컨테이너

서블릿 컨테이너(톰캣)에 어떤 자바 관련된 자원 요청(request)이 들어왔을 때 다음과 같은 생명주기를 가지게 된다.

먼저, 서버를 실행하고 클라이언트로부터 최초의 GET 요청이 왔을 때

  1. 서블릿 객체를 생성한다.(new)
  2. 서블릿 객체안에 init()이라는 초기화 method가 제일 먼저 호출된다. (기존의 서버가 가지고 있는 스레드가 호출)
  3. service() 호출 : post, get, put, delete 중 어떤 요청인지 체크한다. (서비스가 호출되기 직전에 새로운 스레드1이 만들어지고 스레드1이 service()를 실행)
  4. get()으로 왔으면 get() 호출: DB 연결하고, 필요한 데이터를 찾아서, 그 데이터를 html에 담아서 응답한다.

두번째에도 GET 요청이 오면, 좀 다르다.

  1. 서블릿 객체 재사용
  2. init() 실행 안한다.
  3. 새로운 스레드 2번이 만들어진다.(동시 접근시)
  4. service 호출 -> get 호출

이러한 서블릿 객체 재사용이 어떻게 가능한 것인지 알아보자. 자바의 메모리 영역에는 static, heap, stack이 있는데, 다음과 같은 코드에서 어떻게 작동하는지 살펴보면 알 수 있다.

class A {
	Hello() {
	
    }
}
a = new A();

위의 코드를 실행시켰을 때, heap이라는 공간(static이 아닌 것들이 뜨는 메모리 공간)에 hello 메서드가 뜨고, 이 상태에서 누군가 hello 메서드를 호출하면 stack이라는 공간에 hello 메서드 내부에 있는 명령어들을 처리하면서 필요한 공간인 hello 메서드 stack 공간을 만든다. 이 stack 공간은 독립적이어서 hello 를 세 사람이 동시에 호출하면 스택 공간이 3개 생긴다.

즉, new를 한다는 것은 heap에 메서드를 하나만 만들지만 method를 호출하는 것은 stack에 여러개를 쌓는 것이다.(stack을 독립적으로 사용한다.) 따라서, 서블릿 객체가 new로 만들어 지지 않고 한개만 있어도 method는 스레드만 다르게 해서 다 따로따로 사용할 수 있다. 동시에 메서드를 호출 가능하다는 뜻이다.

예를 들어 톰캣 기본 설정을 스레드 Auto 20개로 설정했다고 생각해보자. 그러면 21번째 요청부터는 대기를 한다. 이 일은 스레드1이 사용 종료(response)시에 스레드1을 없애지 않고 21번째가 재사용하게 된다. 이렇게 재사용하는 것을 Pooling 기법이라고 한다.

정리하면, 서블릿 객체는 최초 요청시 만들어진 1개를 재사용하는 것이고 스레드는 컴퓨터 성능에 따라서 개수가 달라질 수 있다. 스레드를 많이 받기 위해서는 1000명을 받을 수 있는 컴퓨터로 성능을 높이거나(scale-up) 100명을 받을 수 있는 컴퓨터를 10개 하는 방법(scale-out)이 있다.

profile
https://devseowoo.notion.site/Seowoo-Portfolio-b21365c3477345818913e8d8fe2e3b90

0개의 댓글

관련 채용 정보