서블릿 변수

corncheese·2023년 7월 19일
0

서블릿 컨테이너가 실행될 때, 해당 서블릿이 최초 요청이면 서블릿 객체 생성과 메모리 로딩, init()메소드 호출한다. 이러한 작업을 진행하기 전에 프로세스가 생성된다.

init() 메소드 실행이 끝난 다음에는 service()가 호출되는데, service()메소드는 서블릿의 최초 요청과 상관없이 서블릿 요청이 있을 때마다 실행된다. service() 메소드는 최초 요청 시 스레드를 만든다.
최초 요청일 때 프로세스를 만들고 그 안에 스레드를 만들어서 service() 메서드를 실행하며, 두 번째 이후 요청부터는 이미 만들어진 프로세스 안에 service() 메소드를 실행하기 위한 스레드만 새로 생성한 다음, 이 스레드 안에서 service() 메소드를 실행한다.

서블릿 변수의 특징

서블릿은 하나의 프로세스를 생성한 다음, 동일한 서블릿을 요청하는 클라이언트에 대하여 공통적인 프로세스를 사용하며, service() 메소드를 실행하기 위한 스레드만 클라이언트별로 독립적으로 생성하여 실행한다.

멤버변수는 객체 생성 시 힙 메모리에 생성되며 서블릿을 실행하는 클라이언트들이 공통적으로 사용한다. 그러나 service() 메소드가 사용하는 지역변수는 스택 메모리에 생성되며, 클라이언트마다 독립적으로 사용한다.

서블릿의 지역변수는 각 요청마다 스레드별로 스택 영역에 할당되어 사용되지만, 멤버변수는 힙 영역에 할당되어 서블릿을 실행하는 여러 스레드에서 공유한다.

자바의 변수

자바에서 변수는 크게 멤버변수와 지역변수로 구분되며, 구분은 선언된 위치에 따라 다르다.
메소드 외부에 선언하면 멤버변수이며, 멤버변수는 다시 클래스 변수와 인스턴스 변수로 나뉜다. 변수 선언 시 static 키워드가 있으면 클래스 변수이며, 없으면 인스턴스 변수이다.

  1. 멤버변수 - class 변수
    static 선언 / 사용 메모리 : code 영역 / 프로그램 시작, 종료 시에 생성, 제거

  2. 멤버변수 - instance 변수
    사용 메모리 : heap 영역 / 객체 생성 시에 생성, 가비지 컬렉터에 의해 제거

  3. 지역변수(메소드 안에서 선언)
    사용 메모리 : stack 영역 / 메소드 실행, 종료 시에 생성, 제거

클래스 변수는 메소드 바깥쪽에 클래스 멤버로 선언된 변수로서, 변수 선언 시 static 키워드를 사용한다.
클래스 변수는 코드 영역이나 메소드 영역에 프로그램 시작과 동시에 만들어지므로 개발자가 별도의 생성 없이 바로 사용할 수 있다. 그러나 프로그램이 종료될 때까지 메모리에 존재하므로 프로그램 전반에 걸쳐 사용되는 데이터일 때만 클래스 변수로 저장해야 한다.

인스턴스 변수는 static 키워드 없이 메소드 바깥쪽에 클래스 멤버로 선언된 변수로서, 객체 생성 시 힙 영역에 만들어진다. 일반 자바 객체는 new 키워드를 이용해 직접 객체를 생성할 수있고, 이때 힙 영역에 멤버변수가 만들어진다.
힙 영역에 만들어진 인스턴스 변수는 객체가 삭제될 때까지 사용할 수 있다. 서블릿 객체는 웹 애플리케이션 서비스가 중지될때 삭제되며, 일반 자바 객체는 참조가 끊긴 후 가비지 컬렉터에 의해 삭제된다.

지역변수는 메소드 안에 선언된 변수이다. 메소드 실행 시 인자값을 받기 위해 선언된 매개변수도 지역변수에 해당하며, 지역변수는 메소드가 실행될 때 스택 영역에 만들어 지고 메소드가 종료되면서 스택에 있는 모든 지역변수가 삭제된다.

서블릿 지역 변수

서블릿의 지역변수는 여러 클라이언트가 동시에 요청했을 때, 요청마다 개별적으로 할당된다. 그러므로 각 클라이언트의 요청 수 만큼 메모리 영역을 개별적으로 할당하여 지역적으로 처리할 때만 지역변수를 선언하여 활용한다.

서블릿 멤버 변수

동일한 서블릿을 여러 클라이언트가 동시에 요청했을 때, 서블릿 객체는 하나만 생성되어 멀티 스레드로 동작하므로 서블릿의 멤버변수는 여러 클라이언트가 공유하게 된다. 그러므로 각 클라이언트들의 동시 요청 수와 관계없이 하나의 메모리 공간을 할당하여 전역적으로 처리할 때만 멤버변수를 선언한여 활용한다.

0개의 댓글