servlet 정리 멤버변수와 지역변수
Servlet클래스에 선언되는 멤버변수는 메모리에 공유가되고
여러 브라우저에서 요청이 전달되면 하나의 Servlet 객체를 공유하여 수행합니다.
< 예시 >
package basic;
@WebServlet("/member")
public class MemberTestServlet extends HttpServlet{
String str; //=> method안에 안쓰고 클래스 블럭에 선언했으니 멤버변수
//멤버변수로 선언하면 메모리에 공유하게 된다!
protected void doGet(HttpServletRequest req,HttpServletResponse res)
throws ServletException,IOException{
// 메소드 내부인 이곳에 선언하면 지역변수
}
위 이미지에서 실행결과를 보면 두개의 브라우저에 각각 sendmessage로 kim과 lee를 전달했는데
먼저 실행한 kim이 실행되다가 뒤에 실행된 lee가 같이 실행되면서
kim을 요청한 쪽에서 갑자기 lee가 계속 출력되는 것을 볼 수 있다
.
하나의 servlet 객체를 공유해서 쓰기 때문이다.
즉 서블릿 객체 내에서 멤버변수를 쓰면 무결성을 보장할 수 없다.
반면에 Servlet클래스내에 메소드 내부에 지역변수로 선언한 경우에는
각 브라우저 요청에 대하여 메모리 영역을 개별적으로 할당하여 사용하므로
결과값이 일정하게 나온다.
다시말해 ,
멤버변수는 힙(heap)이라는 메모리 영역에 할당하고
지역변수는 메서드가 호출되어 수행하는 동안 스택(stack)이라는 메모리 영역에 할당하고
메서드 호출이 끝나면 해제된다.