죄송합니다. 한주가 한달이 되어 버렸네요. 이번 강좌에서는 완벽한 코드 비하인드 구현에 대해서 다루도록 하겠습니다.
이번 강좌는 전에 말씀드린바와 같이 웹매트릭스를 이용한 Code-Behind에 대해서 좀더 알아보도록하겠습니다. 더불어 이번강좌에서는 완벽한 코드-비하인드를 구현합니다.
전 강좌에서는 웹매트릭스를 이용하여 코드-비하인드에 대해서 간단히 살펴보았으며 이를 위한 코드-비하인드를 위한 템플릿 사용에관해서 간단히 살펴보았습니다.템플릿 활용에 관해서는 이미 알고 계시리라 생각하고 코드를 중심으로 살펴보도록 하겠습니다.
먼저 CodeBehind2.aspx 파일을 살펴보도록 하겠습니다.
<%@ [Page Language="C#"] [CodeBehind="CodeBehind2.aspx.cs"] Inherits="Unicycle.CodeBehind2" [AutoEventWireup="false"] %>
<html> <head> <title></title> <link href="/css/unicycle.css" type="text/css" rel="stylesheet" /> </head> <body> <form id="frmCodeHibehind2" runat="server"> <asp:Label id="lblPageLoad" runat="server"></asp:Label> <br> <asp:Label id="lblPagePreRender" runat="server"></asp:Label> <br> <br> <asp:Button id="btnButton" Text="click me" runat="server"></asp:Button> </form> </body> </html>
|
보시는 바와 같이 CodeBehind=""와 Inherits="" 그리고 AutoEventWireup=""를 지정하였습니다.CodeBeind와 Language 그리고 AutoEventWireup 속성은 필요 없지만 Visual Studio.NET에서 개발시에 자주 보이는 것들이라 적었으며 실제 서비스에서는 사용되지 않아도 되기에 []로 묶어서 표시하였습니다.
AutoEventWireup은 이벤트와 해당 이벤트 핸들러를 자동으로 매칭 시킬 것인지에 대한 속성인데 표현력의 한계로MSDN의 내용을 발췌했습니다. ^^;;
MSDN :
Page 지시문의 AutoEventWireup 특성이 true로 설정되거나 기본값이 true이므로 생략된 경우 페이지 프레임워크에서 페이지 이벤트 특히, Page_Init 및 Page_Load 메서드를 자동으로 호출합니다. 이 경우 명시적 Handles 절이나 대리자는 필요하지 않습니다.
AutoEventWireup 특성의 단점은 페이지 이벤트 처리기에 미리 예측할 수 있는 이름이 필요하다는 것입니다. 그 결과 이벤트 처리기의 이름을 지정하는 데 있어 유연성이 제한됩니다. 따라서 Visual Studio에서 AutoEventWireup 특성은 기본적으로 false로 설정되고 디자이너에서 페이지 이벤트를 메서드에 바인딩하는 명시적 코드를 생성합니다.
AutoEventWireup을 true로 설정하면 Visual Studio에서 이벤트를 바인딩하는 코드를 생성하고 페이지 프레임워크에서 그 이름을 기준으로 자동으로 이벤트를 호출합니다. 그 결과 페이지를 실행하면 같은 이벤트 코드가 두 번 호출될 수 있습니다. 따라서 Visual Studio에서 작업할 때는 항상 AutoEventWireup을 false로 설정해야 합니다.
이번에는 실제 코드가 들어있는 C# 클래스 파일인 CodeBehind2.aspx.cs의 소스를 보도록 하겠습니다.
namespace Unicycle { using System;
using System.Web; using System.Web.UI;
public class CodeBehind2 : Page { protected System.Web.UI.WebControls.Label lblPageLoad; protected System.Web.UI.WebControls.Label lblPagePreRender;
protected System.Web.UI.WebControls.Button btnButton; public CodeBehind2() { }
override protected void OnInit(System.EventArgs e) { InitControls(); base.OnInit(e);
Response.Write("OnInit<br>"); }
private void InitControls() { //control initialization
// 이벤트 핸들러 등록 this.Load += new System.EventHandler(this.Page_Load); this.PreRender += new System.EventHandler(this.Page_PreRender); this.btnButton.Click += new System.EventHandler(this.btnButton_Click); }
private void Page_Load(object sender, System.EventArgs e) { lblPageLoad.Text = "Page_Load Event!!<br>"; }
private void Page_PreRender(object sender, System.EventArgs e) { lblPagePreRender.Text = "Page_PreRender Event!!<br>"; }
private void btnButton_Click(object sender, System.EventArgs e) { Response.Write("Button Clicked!!<br>p"); } } }
|
녹색 부분중 OnInit 메소드는 이벤트 핸들러를 등록하는 부분으로 MSDN을 보면 "서버 컨트롤 주기의 처음 단계로 서버 컨트롤을 초기화할 때 발생합니다."라고 나와있으며 이 이벤트를 발생시키는 메소드가 OnInit 메소드입니다. 즉 이부분에서 콘트롤에 대한 초기화를 해주면 된다는결론이 나옵니다. ^^;; 그리고 Page 클래스를 상속하기때문에 override를 해 주었구요..
CodeBehind2.aspx.cs 파일을 라이브러리로 만들기 위해서 컴파일을 해야 합니다. 그리고 저는 CodeBehind2.dll의 이름으로 컴파을을 하고애플리케이션의 bin 폴더로 넣어 주도록 하겠습니다. 다들 아시겠지만 ASP.NET은 사용되는 라이브러리를 검색할 때 해당 웹 애플리케이션루트에 있는 bin 폴더를 검색하기 때문입니다.
이로서 완벽한 코드-비하인드 구현을 위한 준비를 하였습니다. 그럼 붉은색은 무엇이냐구요? 이 부분은 이미 정해진 이벤트 핸들러를 등록해 주는부분입니다. 다시 말하자면 버튼이 클릭되었을 때 수행되는 메소드를 지정해 주는 부분입니다. delegate를 사용한다는 것입니다. 더불어 Visual Studio .NET에서는 InitializeComponent()라는 메소드를 사용하고 있으며
/// <summary>
/// 디자이너 지원에 필요한 메서드입니다.
/// 이 메서드의 내용을 코드 편집기로 수정하지 마십시오.
/// </summary>
라는 문구로 고치면 큰일이 나는것 처럼 경고를 주고 있습니다(옛날 베타 버전에서는 가끔 컨트롤의 이벤트 핸들러가 삭제되지 않는 현상이 있어 직접 삭제해 주기도 하였습니다.).위의 코드에서는 Page_Load(), Page_PreRender(), btnButton_Click() 메소드를 이벤트 핸들러로 등록해 주었습니다.
이제 컴파일을 할 차례군요. 저는 compile.bat 파일을 만들어 컴파일을 하도록 하겠습니다. pause를 사용하는 이유는 배치 파일을 더블클릭하여 실행시키면 컴파일 결과를 눈으로 확인하기도 전에 command창이 없어지기 때문에 확인을 위해서 추가하였습니다.
@echo CodeBehind2.cs를 컴파일합니다. csc /t:library /r:System.dll,System.Web.dll /out:../bin/CodeBehind2.dll CodeBehind2.aspx.cs
pause
|
이제 모든 준비가 마쳐졌으니 실행을 해 보겠습니다.
1번은 위의 코드를 그대로 컴파일하여 실행시킨 것이고 2번은 PreRender에 주석처리를 해 놓고 다시 컴파일한 후 실행시킨 화면입니다.
1. PreRender 이벤트 핸들러 등록 | 2. PreRender 이벤트 핸들러 미등록 |
 |  |
웹매트릭스를 이용한 코드-비하인드 구현이었습니다. 손으로 하기에는 너무 많은 작업이 아닌가 생각됩니다. 역시 최고의 방법은 Visual Studio .NET인 것 같습니다.^^;; 다음 강좌부터는 Data Pages의 템플릿을 다루도록 하겠습니다.
다음 강좌에서 뵙겠습니다. 감사합니다.