개발자가 알아두면 좋은 ASP.NET 지식 (세션편)


이미 아시겠지만, 세션에는 ASP.NET에는 3가지의 세션 모드를 지원하고 있습니다.


1) InPro방식 , 2) StateServer방식, 3) SQLServer방식


1.세션 저장방식

  1) 웹서버의 메모리에 저장된다.

  2) 분리된 프로세스(aspnet_state.exe)의 메모리에 serialize된 형태로 저장된다.

      분리된 서버에 저장이 가능하다.

  3) serialize된 형태로 SQL서버에 저장된다.


2. 성능

  1) 속도가 가장 빠르다. 세션저장소가 웹서버의 메모리이므로 저장량이 많아질 경우 웹서버 처리속도에 영향을 미칠 수 있다.

  2) 기본형식의 데이타(string, integer등)인 경우 기준으로 15%의 속도저하가 있다고 알려짐.

      그렇지만, 일반 object를 저장할 경우, serialize/deserialize과정을 거쳐야 하므로 성능은 더욱 저하될 수 있다.

  3) 기본형식의 데이타인 경우 기준으로 25%의 속도저하가 있다고 알려짐.

      stateServer방식과 마찬가지로, 일반 object를 저장할 경우, serialize/deserialize과정을 거쳐야 하므로 성능은 더욱 저하됨.


3. 문제점

  1) aspnet_wp 프로세스가 재기동(recycle)되면 세션상태가 사라짐(SP2: 비정상적 recycle을 해결함).  

      어플리케이션을 다시 시작해도 세션사라짐.

      이유는 어플리케이션의 메모리영역에 세션을 저장하기 때문에, 어플리케이션이 재시작하면 메모리영역을 다시 할당받기 때문이다.

      어플리케이션을 재시작되는 되는 사항

      가) config파일의 수정(web.config, machine.config, global.asax등)

      나) \bin 디렉토리 밑의 파일 수정(즉 컴파일을 새로 하게되면 세션 사라지는 큰 문제점이 있음)

  2) Inproc방식의 세션사라지는 문제를 해결함. WebFarm환경에서 특정서버에 세션을 저장하게 하는 것을 가능하게 함.

     그렇지만, 세션서버의 장애발생시 모든 웹서버의 세션이 작동안하는 문제점이 있음.

  3) Inproc방식의 세션사라지는 문제를 해결함. SQL서버가 재기동되어도 세션 사라지지 않음.

     또한 SQL서버의 클러스터링을 이용하면, 특정 SQL서버의 장애시에도 서비스 가능함.


4. 유의사항

  1) Web Garden mode에선 제대로 동작안함.(주: Web Garden이란 프로세서(CPU) 독립적으로 aspnet_wp.exe가 실행됨)

     WebGarden을 사용하려면, StateServer나 SQLSERVER로 바꾸어야 함.

     Session_End 이벤트는 Inproc 모드에서만 동작한다.

  2) Web Farm방식에서는 모든 웹서버들은 같은 machineKey를 가져야 한다.

      또한 저장되는 객체가 serializable하는지 확인해야 한다.

      Web Farm방식에서 다른 서버로 세션이 전달되기 위해서는 어플리케이션의 경로가 같아야 한다.

  3) 저장되는 객체가 serializable하는지 확인해야 한다.

      Web Farm방식에서 다른 서버로 세션이 전달되기 위해서는 어플리케이션의 경로가 같아야 한다.


5. 자주 묻는 질문

  1) ASP와 ASP.NET의 세션을 공유할 수 있는지요..?

    - 불가능합니다.


  2) 서로 다른 웹어플리케이션 사이에 세션을 공유할 수 있는지요..

    - 불가능합니다.


  3) Inproc방식에서 왜 가끔 세션값이 사라지나요?

    - 어플리케이션의 recycle때문입니다. SP2에서 Fix 되었습니다.


  4) 어떤 종류의 객체가 세션에 저장될 수 있나?

    - 세션저장 방식에 따라 달라집니다.

      Inproc방식에서는 어떤 객체라도 저장할 수 있으나,

      StateServer와 SQLServer방식에서는 serializable한 객체만 저장될 수 있습니다.

      사용자가 직접 만드는 클래스인 경우 serializable속성을 추가함으로써 저장이 가능하나,

      제공되는 클래스인 경우 Object명.GetType.IsSerializable() 로써 알아볼 수는 있으나,

      변경은 불가능한 것 같습니다(확실하진 않습니다).



  5) Serializable은 어떻게 지정하나?

     - C#

        [Serializable]

            public class MyClass

            {

                //class code

            }

      - VB.NET

        <Serializable()> _

         Public Class MyClass

               'Class code

         End Class

 

'.net' 카테고리의 다른 글

rs.Read 그리고 rs.HasRows  (1) 2007.07.21
ASP.NET 2.0에서 달라진 기능  (0) 2007.07.21
System.IO 네임스페이스의 재발견  (4) 2007.07.18
DataReader  (1) 2007.07.17
DB _ command  (0) 2007.07.17

+ Recent posts