[설문조사 사이트 테스트]
이름 :
점넷(.Net)
분류 전체보기 (176)
점넷공간 (38)
COMPUTER (1)
.NET (29)
DB (36)
SCRIPT (3)
MarkUp & CSS (3)
OS (7)
IT Story (52)
Information (7)
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Visitors up to today!
Today hit, Yesterday hit
daisy rss
tistory 티스토리 가입하기!
2008. 8. 21. 07:00

오늘은 ASP.NET 페이지 실행주기에 대해 알아 보겠습니다.

ASP.NET 페이지 실행주기?

페이지 실행주기?

실행주기?

주기?

 

과연 이게 무엇일까요?

먼저 주기란 무엇일까요?

 

네이버 사전을 찾아보았습니다.

진동현상에서 진동 중심 주위로 왕복운동이 한 번 이루어지거나 물리적인 값의 요동이 한 번 일어날 때까지 걸리는 시간을 말한다.

 

네이버 사전에서는 위와 같은 해석을 하는군요..

내용을 보면 이해 할 듯 말 듯 하시죠? (나만 그런가..)

왕복운동이 한번 이루어진다?? 물리적인 값의 요동이 한번??

자세히는 몰라도 반복적인 작업이나 행동의 한 사이클로 보시면 될듯하네요

그럼 사이클은 뭘까요..?

 

이것도 네이버 사전을 찾아봤는데 다음과 같은 해석을 하더군요..

어떤 체계가 처음 상태에서 변화하여 다시 원래의 상태로 되돌아오는 일을 말한다. 변화를 겪어도 같은 과정을 반복하므로 순환하는 과정이다. 순환과정(cyclic process)이라고도 한다.

 

, 원래 상태로 돌아오는 일을 말한다고 하는군요.

서두가 너무 길었군요^^ 계속 진행해보죠^^

 

그럼 실행주기는 실행이란 처리를 시작해서 원래 상태로 돌아오는 일?

 

그럼 페이지 실행주기는 페이지 실행 처리를 시작해서 원래 상태로 돌아오는 일?

 

ASP.NET 페이지 실행주기는?? 대충 아시겠죠? ^^; ASP.NET에서 어쩌구 저쩌구..

 

그럼 ASP.NET 페이지 실행주기에는 어떤일이 일어나는지 알아보겠습니다.

 

일반적으로 다음과 같은 순서대로 이벤트들이 발생합니다.

Init – Load – PostBack – PreRender – Render - Unload

 

사실 더 자세하게 구분이 되지만 현재 나와있는 주기로도 충분히 이해가 되리라 봅니다.

(자세한 실행주기를 원하시면 책을 참고하시면 더욱 좋을 듯 합니다.^^)

근데 왜 우리가 이 페이지 실행주기를 알아야 할까요?

페이지 실행주기를 몰라도 개발은 할 수 있다고 말하는 사람도 있습니다.

하지만 페이지를 실행 하는데 내부적으로 어떤 일들이 일어나는지 알고 접근하는 사람과 모르고 접근하는 사람하고는 큰 차이가 있다고 생각합니다.

문제해결 부분에서도 쉽게 해결할 수 있는 부분도 이해를 못해 어렵게 해결하는 경우도 있죠..

 

예를 들어보겠습니다.

먼저 아래와 같은 태그로 필요한 컨트롤들을 만들겠습니다.

<asp:TextBox ID="TextBox1" runat="server" Text="0"></asp:TextBox><br />

        <asp:Button ID="Button1" runat="server" Text="텍스트박스값1증가" onclick="Button1_Click" /><br />

        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

 

사용자 삽입 이미지

간단하게 테스트를 설명하자면

버튼 클릭시 텍스트박스의 숫자에 1을 증가시켜 다시 텍스트 박스에 입력합니다.

텍스트 박스의 값을 라벨(Label)에 출력하는 Print()라는 함수가 있습니다.

해당 Print()함수를 Load 이벤트에서 실행 했을 때와

PreRender 이벤트에서 실행 했을 때 차이점을 비교해보도록 하겠습니다.

 

코드는 다음과 같습니다.

protected void Page_Load(object sender, EventArgs e)

    {

        //Print();

    }

    protected void Button1_Click(object sender, EventArgs e)

    {

        // 텍스트 박스이 값을 가져와서 정수형으로 변경

        int nValue = Convert.ToInt32(TextBox1.Text);

        // 정수값을 1증가 nValue = nValue + 1; 과 동일한 코드

        nValue++;

        // 증가된 정수값을 텍스트박스에 대입

        TextBox1.Text = nValue.ToString();

    }

    protected void Page_PreRender(object sender, EventArgs e)

    {

        //Print();

    }

    /// <summary>

    /// 텍스트 박스 텍스트 값을 라벨에 대입하는 메소드

    /// </summary>

    private void Print()

    {

        // 텍스트 박스의 텍스트 값을 라벨에 대입

        Label1.Text = TextBox1.Text;

    }

 

여기서 첫번째 테스트 Page_Load 이벤트의 주석문을 제거하고 테스트를 해보겠습니다.

 

사용자 삽입 이미지

버튼 클릭시 증가된 텍스트 박스의 텍스트가 라벨에 대입된게 아니라 이전 증가값이 대입된걸 확인할수 있습니다.

 

다음은 두번째 테스트 Page_Load 이벤트의 Print()함수 호출 부분은 주석처리하고

Page_PreRender 이벤트의 Print()함수 주석문을 제거한 후 테스트를 해보겠습니다.

 

사용자 삽입 이미지

 

이번에는 텍스트 박스의 텍스트 값과 라벨의 텍스트 값이 일치하는걸 볼 수 있습니다.

 

과연 무슨 차이가 있는걸까요?

앞에서 보여드린 페이지 실행주기를 다시 보여드리겠습니다.

Init – Load – PostBack(버튼 클릭 이벤트) – PreRender – Render – Unload

 

버튼을 눌러서 발생하는 이벤트는 PostBack 부분에서 실행이 되게 됩니다.

PostBack 이벤트시 텍스트박스의 값을 증가시키는 거죠

 

Load 이벤트에서 텍스트 박스의 값을 라벨에 대입하게 되면 아직 PostBack 이벤트가 발생하기 전이라 증가되기 전 값이 대입된 것 입니다.

 

PreRender 이벤트에서 텍스트 박스의 값을 라벨에 대입하게 되면 PostBack 이벤트보다 뒤에서 발생하기 때문에 증가된 값이 대입된 것이죠

 

이런 간단한? 문제도 페이지 실행주기를 모르는 사람한테는 크게 다가올 수도 있는 문제입니다.

 

꼭 이런 문제 때문에 페이지 실행주기를 알아야 한다는 건 아닙니다.

 

Init 이벤트와 Load 이벤트 사이에서 ViewState가 복구되고,

PreRender 이벤트와 Render 이벤트 사이에서 ViewState가 저장되는 내용 또한 중요합니다.

Init이나 Render에서 행해지는 행위들은 ViewSate에 저장이 되지 않는 것이죠

 

브라우저에서 소스보기를 해보면 다음과 같은 코드를 볼 때가 있습니다.

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTU5MTA2ODYwOQ9kFgICAw9kFgICBQ8PFgIeBFRleHQFATNkZGRT2tautF1ZGqowuiJqY/8O9RsFxg==" />

 

이건 ViewState를 사용하는 페이지에서 나타날 수 있는 태그입니다.

 

간단하게 이야기 하자면 웹에서는 원래 상태값을 가질 수 없습니다.

허나 ViewState 에 상태를 저장해두었다가 로드시 그상태를 그대로 유지 해주는것처럼 복구하는 것이죠 그런 행위가 위에서 이야기한 시점에서 발생하게 되는것이죠

 

ViewState에 대한 자세한 내용은 다음 시간에 자세히 알아 보도록 하겠습니다.

 

이것 말고도 페이지 실행주기는 웹 컨트롤 제작시에도 중요하게 여겨지는 부분이니 잘이해하셨으면 합니다.