본문 바로가기

C#(ASP.NET)

ASP.NET 2.0의 페이지 생존 주기와 각 이벤트들 설명


ASP.NET 2.0에는 기존 버젼 보다 더 많은 숫자의 이벤트와 각 이벤트를 처리하는 메소드들이 추가되었다. 아래의 내용들을 살펴보면 기존 버젼에는 없던 이벤트들을 볼 수 있다. 실제 이런 실행 이벤트를 보려면 페이지에 Trace="true"를 추가해서 트레이싱을 해 보면 도움이 된다.

서버는 요청될 때마다 매번 ASP.NET 페이지를 로드한 다음, 요청이 완료되면 해당 ASP.NET 페이지를 언로드한다. 일련의 실행 주기를 가지는 Page 및 서버 컨트롤은 요청을 실행하고 HTML을 클라이언트로 다시 렌더링 한다. 이러한 컨트롤을 다루는 프로그래머는 컨트롤 실행 주기의 각 단계에서 어떤 정보를 사용할 수 있고, 어떤 데이터가 유지되는지와 렌더링 시 컨트롤의 상태를 이해하고 있어야 한다. ASP.NET 2.0에는 상당히 많은 이벤트들이 페이지에 추가되었다. 페이지 로딩시의 이벤트가 더 세분화되어서 개발자가 웹 폼 이벤트를 좀 더 세밀하게 제어할 수 있게 되었다. 

1) IHttpHandler.ProcessRequest 호출
페이지 처리는 ProcessRequest메소드를 호출하면서 시작된다. ProcessRequest메소드안에는 웹 폼 로직이 구현되어 있다.
ProcessRequest메소드는 먼저 초기화를 수행하는데 그 중에는 FrameworkInitialize메소드가 포함되어 있다.
여기서는 몇가지 초기화 작업과 .aspx파일에 선언된 컨트롤 트리를 생성한다.
또한 웹파트의 초기화가 수행되고 IsCallBack, IsPostBack, IsCrossPagePostBack, PreviousPage등의 속성이 사용가능한 상태가 된다.

2) 미리 초기화(PreInit)
ASP.NET 2.0에 추가된 이벤트이다.
OnPreInit메소드가 호촐되면 개인 설정 정보(Profile)이 로딩되고 페이지 테마(Theme)가 있는 경우 초기화된다.
이 이벤트에서는 페이지에 대한 PageTheme와 MasterPage를 동적으로 정의할 수 있는 이벤트로 사용할 수 있다.

3) 초기화(Init)
들어오는 웹 요청의 실행 주기 동안 필요한 설정을 초기화한다. Init 이벤트가 발생되며 Init 이벤트는 OnInit 메소드를 호출한다.
Init 이벤트를 사용하거나, OnInit 메소드를 재정의하여 이 단계를 수행한다.
이 단계는 페이지 개발자가 초기화 작업을 수행하기에 적합한 단계이다.

4) 초기화 완료(InitComplete)
InitComplete이벤트는 페이지 초기화 단계가 끝날 때 호출된다.
이 단계에서는 페이지에 선언된 모든 컨트롤들이 초기화되지만 페이지의 상태는 아직 채워지지 않는다.
따라서 서버 컨트롤에 액세스할 수 있지만 사용자가 반환한 정보는 포함되지 않는다. 
 
5) 컨트롤 상태 로드(LoadControlState)
사용자 지정 서버 컨트롤에서 해당 컨트롤 상태를 복원하는 방법을 지정해야 하는 경우 이 메서드를 재정의한다.
ASP.NET 2.0에서 새로 추가되었다. 이 단계는 IsPostBack속성이 true일 때만 수행된다.
LoadControlState는 이전 요청에서 저장된 컨트롤 상태를 컨트롤로 로딩한다.
Control State는 ASP.NET 2.0에서 새로 등장한 상태 저장 방식이다. 컨트롤 상태는 라운드트립이 되는 동안 컨트롤의 상태 데이터를
보전하는 점에서 ViewState와 비슷하지만 페이지 개발자가 컨트롤 상태를 비활성화할 수 없다는 점이 다르다.

6) 뷰 상태 로드(LoadViewState)
ASP.NET의 서버 컨트롤은 ViewState라는 뷰 상태를 저장하는 속성을 Control 클래스에서 상속 받는다.
원래 웹 페이지는 뷰 상태를 저장하지 않아서 페이지가 전환 되었을 때 이전 페이지에 대한 정보는 유지되지 않고 사라진다.
따라서 뷰 상태를 저장하여 전환된 페이지에 전달하기 위해서는 별도로 처리해야 했지만, ASP.NET의 서버 컨트롤은 ViewState 속성을
사용해서 상태 관리를 쉽게 할 수 있다. ViewState는 System.Web.UI.StateBag 클래스 형태이며, 이름/값 쌍이 저장되어 있는 사전이다.
또한 ASP.NET 페이지 프레임워크에 의해 문자열 변수로 지속되다가, 클라이언트에 보내지고 숨겨진 변수로 다시 돌아온다.
다시 게시하는 동안, 페이지 프레임워크는 숨겨진 변수에 입력된 문자열을 분석하고 각 컨트롤의 ViewState 속성을 채운다.
컨트롤에서 속성 데이터에 전용 필드 대신 ViewState 속성을 사용하는 경우, 클라이언트로 라운드 트립하는 동안 자동으로 지속된다. ViewState를 사용할 때 주의점은 일반적으로 ViewState는 라운드트립 중에 페이지 상의 형식 데이터를 지속시키도록 사용하는 것이
바람직 하고, 암호, 연결 문자열, 파일 경로 등의 정보를 저장하기 위해 ViewState를 사용하는 것은 피해야 한다.
또한, ViewState의 모든 데이터는 클라이언트로 자동 라운드트립되며, 이 라운드트립은 성능 오버헤드에 영향을 미치므로,
ViewState를 신중하게 사용해야 한다.
ASP.NET 서버 컨트롤은 EnableViewState라는 속성을 Control에서 받는다. 이 속성을 사용하여 ViewState의 지속성을 설정하거나 해제한다.
ASP.NET 2.0에서는 ControlState가 추가되어서 중요한 컨트롤의 데이터를 해제할 수 없도록 변경되었다.
ControlState는 ViewState와는 달리 개발자가 사용여부를 셋팅할 수 없도록 추가되었다.
컨트롤내의 반드시 유지되야 하는 값들은 ControlState를 통해 사용하도록 한다.

7) 게시 데이터 로드(LoadPostData)
이 이벤트는 IsPostBack속성이 true일 때만 실행된다. 앞의 두 과정에 의해서 이전 요청 때 가지고 있던 페이지 상태가 복구되었다.
이 이벤트에서 실행하는 처리는 클라이언트에서 수정된 데이타를 컨트롤에 적용하는 것이다. 예를 들면 사용자가 TextBox의 입력창에
“bbb”란 데이터를 입력하고 포스트백을 했다면 앞의 두 이벤트(LoadControlState, LoadViewState)를 거치면서 Text속성은 “aaa”란
원래값으로 설정된다. 그러나 이 값은 클라이언트에서 사용자가 입력한 “bbb”란 값으로 변경되어야 한다.
이 이벤트에서는 사용자가 수정한 데이터를 해당 컨트롤로 전달해 주는 처리를 한다.

8) 미리 로드(PreLoad)
이 이벤트는 Load이벤트에 앞서 페이지나 컨트롤을 처리해야 하는 경우에 사용한다. 페이지에서 이 이벤트가 발생한 후에 해당 페이지와
모든 컨트롤에 대한 뷰 상태를 로딩하고 Request에 포함된 모든 포스트백된 데이터를 처리한다. 

9) 로드(Load)
데이터베이스 쿼리 설정 등과 같이 모든 요청에 공통적으로 사용되는 작업을 수행한다.
서버 컨트롤들의 트리가 구현/초기화 되며, 상태가 복원되고, 폼 컨트롤은 클라이언트측 데이터를 반영한다.
Load 이벤트가 발생되어 OnLoad 메소드를 호출한다. Load 이벤트를 사용하여 이 단계에서의 작업을 수행할 수 있다.
Load이벤트는 모든 자식 컨트롤에도 연속적으로 발생한다.
이벤트가 발생하는 순서는 부모 컨트롤에서 자식 순으로 내려가기 때문에 페이지 객체의 Load이벤트가 가장 먼저 호출된다.

10) 게시 변경 알림 보내기(RaiseChangedEvent)
이 단계에서는 현재 및 이전 게시 간의 상태 변경에 응답하여 변경 이벤트가 발생한다. 게시 데이터 처리 단계와 마찬가지로
게시 변경 이벤트를 발생시키는 컨트롤만 이 단계를 수행한다.
IPostBackDataHandler인턴페이스를 구현한 컨트롤들은 RaisePostDataChangedEvent를 호출한다.
특정 컨트롤의 데이터가 클라이언트에 의하여 변경되었을 경우 해당 컨트롤의 RaisePostDataChangedEvent를 호출해서 데이터가
변경되었음을 알린다. 예를 들면 TextBox컨트롤은 클라이언트에서 새로운 값이 입력되면 TextChanged이벤트를 발생시킨다.

11) 게시 이벤트 처리(RaisePostbackEvent)
클라이언트에서 포스트백을 일으킨 컨트롤에 대해 서버측 이벤트를 발생시킨다.
포스트백 이벤트를 처리하는 컨트롤은 IPostBackEventHandler인터페이스를 구현해야 한다.
이 인터페이스는 단 하나의 메소드인 RaisePostBackEvent를 포함하는데 포스트백이 발생하면 클라이언트에서 포스트백을 일으킨 컨트롤의
RaisePostBackEvent메소드를 호출한다.
RaisePostBackEvent인터페이스를 구현하는 대표적인 컨트롤은 Button인데 RaisePostBackEvent메소드가 호출되면
Click이나 OnCommand이벤트를 일으킨다.
이 과정에서 일어나는 또 하나의 중요한 처리는 클라이언트에서 전송된 데이터에 대한 유효성 검사이다.

12) 로드 완료(LoadComplete)
LoadComplete이벤트는 모든 포스트백된 데이터와 ViewState 데이터가 페이지와 페이지의 모든 컨트롤에 로딩된 후에 발생한다.
동적으로 추가되는 컨트롤에서 뷰 상태가 제대로 작동하려면 페이지 주기의 사전 렌더링 단계 또는 그 이전에 컨트롤을 추가해야 한다. ASP.NET 2.0에서 추가되었다. 

13) 사전 렌더링(PreRender)
출력을 렌더링하기 전에 업데이트를 수행한다.
렌더링 단계의 변경 내용은 손실 되지만, 사전 렌더링 단계의 컨트롤 상태 변경 내용은 저장할 수 있다.

14) 사전 렌더링 완료(PreRenderComplete)
PreRenderComplete이벤트는 페이지 주기의 사전 렌더링 단계가 완료될 때 발생한다.
페이지 주기의 이 단계에서는 모든 컨트롤이 만들어지고 필요한 페이지 매김이 완료되어 페이지가 출력 스트림으로 렌더링될 준비를 한다.

15) 컨트롤 상태 저장(SaveControlState)
컨트롤의 기존 상태 데이터를 저장한다. 웹페이지가 서버에 다시 게시된 후에 발생하는 컨트롤 상태의 변경내용을 저장한다.
페이지에 포함된 모든 컨트롤의 SaveControlState메소드가 연속적으로 호출된다.
각 컨트롤의 SaveControlState메소드는 저장할 컨트롤 상태를 반환하는데 이 값들은 하나의 컬렉션 안으로 수집된다.

16) 뷰 상태 저장(SaveViewState)
컨트롤의 ViewState 속성은 이 단계가 수행되면 문자열 객체에 자동으로 유지된다.
이 문자열 객체는 클라이언트에 보내지고 숨겨진 변수로 다시 반환 된다.

17) 상태 저장 완료(SaveStateComplete)
페이지와 페이지에 있는 컨트롤에 대한 모든 ViewState와 ControlState정보가 저장된 후에 이 이벤트가 발생한다.

18) 렌더링(Render)
클라이언트로 렌더링 할 출력을 생성한다. 렌더링이란 디스플레이 표면에 시각적으로 표시하는 프로세스를 말한다.
웹 요청의 경우, 실제 렌더링은 클라이언트의 웹 브라우저 등에서 수행된다. ASP.NET 런타임은 웹 요청에 반응하여 HTML을 보내야 하고,
페이지 및 자식 컨트롤은 태그 컨텐트를 출력 스트림에 기록해야 한다.

19) 삭제(Dispose)
컨트롤을 삭제하기 전에 최종 정리를 수행한다. 데이터베이스 연결에 대한 참조나 파일 참조 등이 유지된다면, 이 단계에서 해제해야 한다.

20)  언로드(Unload)
컨트롤을 삭제하기 전에 최종 정리를 수행한다. Dispose에서 정리를 수행했다면, 이 단계는 처리하지 않는다.
UnLoad 이벤트를 사용하여 이 단계의 작업을 수행할 수 있다.

[출처] 다음카페 웹스쿨