백엔드

servlet 정리 멤버변수와 지역변수

coyojo 2022. 12. 3. 18:20

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 객체를 공유해서 쓰기 때문이다. 

 

즉 서블릿 객체 내에서 멤버변수를 쓰면 무결성을 보장할 수 없다. 

 

(왼쪽) spring을 sendmessage로 전달     (오른쪽)  java를 sendmessage로 전달

 

반면에 Servlet클래스내에 메소드 내부에 지역변수로 선언한 경우에는 

 

각 브라우저 요청에 대하여 메모리 영역을 개별적으로 할당하여 사용하므로

 

결과값이 일정하게 나온다.

 

다시말해 ,

멤버변수는 힙(heap)이라는 메모리 영역에 할당하고

 

지역변수는 메서드가 호출되어 수행하는 동안 스택(stack)이라는 메모리 영역에 할당하고

 

메서드 호출이 끝나면 해제된다.