4. ASP.NET 주요 내장 개체

  • 58 minutes to read

ASP.NET은 Response, Request, Server, Application, Session 등의 내장 개체와 Page 클래스의 주요 멤버를 사용하여 웹 페이지에 기능을 추가할 수 있습니다. 이러한 내장 개체는 ASP.NET 웹 응용 프로그램 제작의 필수 명령어들이니 여러 개의 실습 예제를 통해서 각각의 기능을 살펴보겠습니다.

4.1. 내장 개체

ASP.NET은 여러 가지 내장 개체를 지원하여 웹 페이지에 기능을 불어넣습니다. 바로 Response 개체, Request 개체, Server 개체, Application 개체, Session 개체다. 이 개체들은 다음 장에서 학습할 서버 컨트롤과 접목시켜 웹 사이트 제작의 전부라고 할 정도로 많이 쓰이는 명령어들이니 가능하면 바로 바로 암기하도록 합니다.

4.2. Response 개체

Response라는 단어에서 알 수 있듯이 서버에서 어떤 결과를 클라이언트로 전송(응답)할 때 사용하는 개체다. Response 개체의 주요 속성 또는 메서드는 다음 표와 같습니다. 설명란에는 일단 한 줄로 요약했습니다. 잘 이해되지 않는다면 간단히 훑어보고 넘어가도 괜찮다. 각 명령어는 이후 실습해보면서 다시 설명할 것입니다. 멤버 설명 Write() 페이지에 문자열을 출력합니다. HTML을 포함하여 자바스크립트를 실행할 수도 있습니다. Redirect() 지정된 페이지로 이동합니다. Expires 현재 페이지의 소멸 시간을 설정합니다. Buffer 버퍼링 사용 여부를 결정합니다. Flush() 현재 버퍼의 내용을 출력합니다. Clear() 현재 버퍼의 내용을 비운다. End() 현재 페이지를 종료합니다. End() 메서드 이후의 코드는 실행하지 않습니다. WriteFile() 스트림(파일)을 출력합니다. Cookies[] 쿠키를 저장합니다.

<참고> 쿠키(Cookie) 웹 서버가 웹 브라우저에 보내서 저장했다가 서버의 요청이 있을 때 다시 서버로 보내 주는 문자열 정보다. 사용자가 특정 웹 사이트에 접속했을 때 관련 기록을 남겨 놓았다가 다음에 같은 웹 사이트에 접속하면 남겨둔 기록을 읽어 이전 상태로 유지하는 역할을 합니다. 쿠키는 클라이언트 컴퓨터의 웹 브라우저에서 저장하는 데이터이며, 반대로 서버에 저장하는 데이터는 세션(Session)이라고 합니다.

4.2.1 Razor Pages에서 페이지 이동

 현재 페이지로 이동: return Page();  특정 페이지로 이동: return RedirectToPage("/Index");

동영상 강의

DevASPNET 웹프로젝트 또는 WebASPNET 웹사이트에서 설명된 주요 내장개체들에 대한 전체 요약 설명 미리보기

https://youtu.be/20egxjRX2ZE

4.3 [실습] Response 개체의 주요 멤버 사용 방법

4.3.1 소개 Response 개체가 가지는 멤버들의 주요 기능을 실습을 통해서 살펴보겠습니다. 가장 사용 빈도가 높은 Write 메서드는 특히 주의 깊게 살펴보겠습니다.

<참고> 이번 내용을 "ASP.NET 주요 내장 개체 미리 살펴보기"라는 제목의 동영상 강좌로도 마련하였으니 참고하기 바랍니다.

https://youtu.be/P_1hmRPdvR0 </참고>

4.3.2. 따라하기

동영상 강의: ASP.NET Web Forms Response 개체

https://youtu.be/Ui4rx0aNANk

① Visual Studio 시작과 프로젝트 열기

  • Visual Studio를 실행하고, <파일 > 열기 > 프로젝트/솔루션> 메뉴를 클릭합니다.
  • C 드라이브 내 ASP.NET 폴더 안의 DevASPNET 폴더를 선택하여, 이전 실습에서 만들어 둔 DevASPNET 웹 프로젝트를 불러옵니다.

② 웹 폼 추가하기

  • 솔루션 탐색기에서 DevASPNET 웹 프로젝트에 마우스 오른쪽 버튼을 클릭한 후, <추가 > 새 항목> 메뉴를 선택합니다.
  • 웹 폼 템플릿을 선택하고, 이름을 FrmResponseWrite.aspx로 지정하여 웹 프로젝트에 추가합니다.

③ FrmResponseWrite.aspx 페이지 작성

  • FrmResponseWrite.aspx 페이지를 열고, 아래 코드를 입력합니다. 이 코드 내 <%= %> 구문은 코드 비하인드 페이지에서 Response.Write() 메서드를 사용해 문자열을 출력하는 것과 동일한 기능을 합니다.
<%@ Page Language="C#" AutoEventWireup="true"
    CodeBehind="FrmResponseWrite.aspx.cs" Inherits="DevASPNET.FrmResponseWrite" %>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Response 개체</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Button ID="btnClick" runat="server"
                Text="클릭" OnClick="btnClick_Click" />
            <br />
            <%="또 만나요<br />"%>
            <asp:Button ID="btnJavaScript" runat="server"
                Text="자바스크립트로 인사말 출력"
                OnClick="btnJavaScript_Click" />
        </div>
    </form>
</body>
</html>

④ 이벤트 처리기 작성

  • btnClick 버튼과 btnJavaScript 버튼에 대한 이벤트 처리기를 FrmResponseWrite.aspx.cs 파일에서 직접 작성합니다.

⑤ 코드 작성

  • FrmResponseWrite.aspx.cs의 코드 보기에서 아래와 같이 코드를 작성합니다.
using System;

namespace DevASPNET
{
    public partial class FrmResponseWrite : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            Response.Write("안녕하세요.<br />");
        }
        protected void btnClick_Click(object sender, EventArgs e)
        {
            Response.Write("<span style='color:blue;'>반갑습니다.</span><br />");
        }
        protected void btnJavaScript_Click(object sender, EventArgs e)
        {
            string strJs = @"
            <script language='JavaScript'>
            window.alert('안녕');
            </script>    
        ";
            Response.Write(strJs);
        }
    }
}

⑥ 실행과 확인

  • FrmResponseWrite.aspx에 마우스 오른쪽 버튼을 클릭하여 <시작 페이지로 설정> 메뉴를 선택하고, [Ctrl]+[F5]를 눌러 웹 브라우저에서 실행합니다.
  • 실행된 웹 페이지에서 <클릭> 버튼을 눌러 문자열이 제대로 출력되는지, 그리고 <자바스크립트로 인사말 출력> 버튼을 클릭해 자바스크립트 코드가 실행되는지 확인합니다.

Response.Buffer

DevASPNET 웹 프로젝트에 웹 폼 추가하기

솔루션 탐색기에서 DevASPNET 웹 프로젝트에 새로운 웹 폼을 추가하는 방법은 다음과 같습니다. 먼저, DevASPNET 프로젝트에서 마우스 오른쪽 버튼을 클릭하고 <추가 > 새 항목> 메뉴를 선택합니다. 그 후, 아래와 같이 웹 폼을 프로젝트에 추가합니다:

  • 템플릿 이름: 웹 폼
  • 이름: FrmResponseBuffer.aspx

FrmResponseBuffer.aspx 페이지의 코드 작성

솔루션 탐색기에서 FrmResponseBuffer.aspx.cs 파일을 더블클릭하여 코드 비하인드 페이지로 이동한 뒤, 아래와 같이 코드를 작성합니다. 이 페이지는 코드 비하인드 파일만을 사용하며, 별도의 코드를 페이지에 입력하지 않습니다.

코드: FrmResponseBuffer.aspx.cs

using System;

namespace DevASPNET
{
    public partial class FrmResponseBuffer : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            // 페이지 새로고침을 매번 수행
            Response.Expires = -1;
            // 버퍼링 활성화
            Response.Buffer = true;
            // 화면에 메시지 출력
            Response.Write("[1] 메시지가 표시됩니다.<br />");
            // 버퍼에 있는 내용을 화면에 출력하고 버퍼 비우기
            Response.Flush();
            // 추가 메시지 출력
            Response.Write("[2] 이 메시지는 표시되지 않습니다.<br />");
            // 버퍼 내용을 비우기
            Response.Clear();
            // 최종 메시지 출력
            Response.Write("[3] 메시지가 표시됩니다.<br />");
            // 페이지 처리 종료
            Response.End();
            // 이 코드는 실행되지 않음
            Response.Write("[4] 실행되지 않습니다.<br />");
        }
    }
}

Response.Flush() 메서드는, 서버 측에서 현재까지 Response.Write() 메서드를 통해 축적된 내용을 클라이언트에 즉시 출력하고 버퍼를 비우는 역할을 합니다. 이 메서드는 보통 콘텐츠를 부분적으로 빠르게 보여주고 싶을 때 유용하며, 전체 내용을 한 번에 버퍼링하여 출력하는 대신 중간중간 결과를 클라이언트에 전송할 수 있게 해 줍니다.

⑩ FrmResponseBuffer.aspx에 마우스 오른쪽 버튼을 클릭하여 <시작 페이지로 설정> 메뉴를 선택하고, [Ctrl]+[F5]를 눌러 실행하면 웹 브라우저에 다음과 같이 출력됩니다. 그림 4 4 FrmResponseBuffer.aspx 페이지 실행 결과

DevASPNET 웹 프로젝트에 웹 폼 추가 및 설정하기

솔루션 탐색기에서 DevASPNET 웹 프로젝트에 새로운 웹 폼을 추가하는 방법은 간단합니다. 프로젝트에서 마우스 오른쪽 버튼을 클릭하고, <추가> > 새 항목> 옵션을 선택한 후, 아래와 같이 설정하여 웹 폼을 프로젝트에 추가합니다:

  • 템플릿 이름: 웹 폼
  • 이름: FrmResponseRedirect.aspx

FrmResponseRedirect.aspx 페이지 구성

소스 보기에서 아래의 ASP.NET 마크업을 입력하고, 디자인 보기를 통해 페이지가 어떻게 렌더링되는지 확인합니다. 주의할 점으로, ImageButton 컨트롤은 일부 최신 브라우저에서 정상적으로 표시되지 않을 수 있습니다. 이 컨트롤과 관련된 이벤트 처리기는 이어서 구현됩니다.

코드: FrmResponseRedirect.aspx

<%@ Page Language="C#" AutoEventWireup="true"
    CodeBehind="FrmResponseRedirect.aspx.cs" Inherits="DevASPNET.FrmResponseRedirect" %>

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Response 개체</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:Button ID="btnDotNetKorea" runat="server" Text="닷넷코리아" OnClick="btnDotNetKorea_Click" />
            <br />
            <asp:LinkButton ID="btnDevLec" runat="server" OnClick="btnDevLec_Click">데브렉</asp:LinkButton>
            <br />
            <asp:ImageButton ID="btnVisualAcademy" runat="server" AlternateText="비주얼아카데미" ToolTip="하와소" OnClick="btnVisualAcademy_Click" Style="height: 16px" /><br />
        </div>
    </form>
</body>
</html>

FrmResponseRedirect.aspx 이벤트 처리기 구현

[F7] 키를 눌러 코드 비하인드 페이지로 이동하고, 아래 코드를 작성하여 각 버튼의 클릭 이벤트를 처리합니다. 이 코드는 사용자가 버튼을 클릭했을 때, 지정된 URL로 리디렉션합니다.

코드: FrmResponseRedirect.aspx.cs

using System;
using System.Web.UI;

namespace DevASPNET
{
    public partial class FrmResponseRedirect : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
        }

        protected void btnDotNetKorea_Click(object sender, EventArgs e)
        {
            Response.Redirect("http://www.dotnetkorea.com/");
        }

        protected void btnDevLec_Click(object sender, EventArgs e)
        {
            string strUrl = "http://www.devlec.com/";
            Response.Redirect(strUrl);
        }

        protected void btnVisualAcademy_Click(object sender, ImageClickEventArgs e)
        {
            string strUrl = String.Format("http://{0}/{1}?{2}={3}", "www.visualacademy.com", "default.htm", "UserID", "RedPlus");
            Response.Redirect(strUrl);
        }
    }
}

페이지 실행 및 확인

FrmResponseRedirect.aspx 파일에 마우스 오른쪽 버튼을 클릭하여 <시작 페이지로 설정> 옵션을 선택합니다. 이후, [Ctrl]+[F5]를 눌러 프로젝트를 실행하면, 웹 브라우저에서 해당 페이지가 표시됩니다. 이미지 버튼에 대한 이미지 경로가 지정되지 않았기 때문에, 이미지가 보이지 않거나 대체 텍스트로 표시될 수 있습니다.

그림 4 5 FrmResponseRedirect.aspx 페이지 실행 결과

각각의 버튼을 클릭하면 코드 숨김 페이지에서 작성한 URL로 이동하는 것을 알 수 있습니다. 이처럼 Redirect() 메서드는 ASP.NET 페이지에서 특정 URL로 페이지를 이동할 때 사용합니다.

4.3.3 마무리 이상으로 ASP.NET의 내장 개체 중 첫 번째로 Response 개체의 주요 명령어를 살펴보았습니다. 나머지 개체의 주요 기능도 이번 실습과 같은 순서로 작성하고 실행해볼 것입니다.

4.4. Request 개체

Request 개체는 사용자에게 어떤 값을 입력(요청) 받고자 할 때 주로 사용합니다. 사용자가 폼(Post) 또는 하이퍼링크(Get)를 통해서 전송된 값을 받거나, 현재 접속자의 IP 주소를 얻는 등 정보를 얻고자 할 때 Request 개체의 주요 멤버를 사용합니다.

멤버 설명 QueryString[] Get 방식으로 넘어 온 쿼리스트링 값인 key와 value를 받고자 할 때 사용합니다. Form[] Post 방식으로 넘어 온 key와 value 값을 받고자 할 때 사용합니다. Params[] 사용자에게 전송된 Get/Post 방식을 모두 받고자 할 때 사용합니다. UserHostAddress 현재 접속자의 IP 주소 문자열을 반환합니다. ServerVariables[] 현재 접속자의 주요 서버 환경 변숫값을 알려 줍니다. Cookies[] 저장된 쿠키 값을 읽어 옵니다. Url 현재 웹 페이지의 URL을 반환합니다. PhysicalApplicationPath 현재 웹 사이트의 가상 디렉터리의 물리적인 경로를 알려 줍니다.

4.5 [실습] Request 개체의 주요 멤버 사용 방법

4.5.1 소개

Request 개체는 폼 또는 쿼리스트링에서 전송된 데이터를 받고자 할 때, IP 주소를 알고자 할 때, 쿠키 값을 읽어올 때 이렇게 세 가지 경우에 가장 많이 사용됩니다. 이번 실습을 통해서 세 가지 경우에 대한 내용을 살펴보겠습니다.

4.5.2 따라하기

① Visual Studio를 실행하여 이전 실습에서 만들어 놓은 DevASPNET 웹 프로젝트를 불러옵니다.

② 솔루션 탐색기에서 DevASPNET 웹 프로젝트에 마우스 오른쪽 버튼을 클릭하여 <추가 > 새 항목> 메뉴를 클릭한 다음 FrmRequest.aspx라는 이름으로 웹 프로젝트에 웹 폼을 추가합니다.

템플릿 이름: 웹 폼 이름: FrmRequest.aspx

③ FrmRequest.aspx 페이지가 열리면 다음과 같이 입력합니다.

<%@ Page Language="C#" AutoEventWireup="true" 
    CodeBehind="FrmRequest.aspx.cs" Inherits="DevASPNET.FrmRequest" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Request 개체</title>
</head>
<body>
<form id="form1" runat="server">
    <div>
        아이디 : 
            <asp:TextBox ID="UserID" runat="server"></asp:TextBox><br />
        암호 : 
            <asp:TextBox ID="Password" runat="server"></asp:TextBox><br />
        이름 :
            <asp:TextBox ID="Name" runat="server"></asp:TextBox><br />
        나이 :
            <asp:TextBox ID="Age" runat="server"></asp:TextBox><br />
        <br />
        <asp:Button ID="btnSubmit" runat="server" Text="전송" 
            OnClick="btnSubmit_Click" />
    </div>
</form>
</body>
</html>

④ 디자인 모드에서 마우스로 폼을 더블클릭하여 코드 숨김 페이지로 이동한 뒤, 소스 모드에서 Page_Load 이벤트 처리기에 다음에 제시된 코드를 작성합니다. FrmRequest.aspx의 코드 보기를 선택하여 FrmRequest.aspx.cs 파일을 열고 다음과 같이 코드를 작성합니다.

using System;

namespace DevASPNET
{
    public partial class FrmRequest : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string strUserId = "";
            string strPassword = String.Empty;
            string strName = "";
            string strAge = String.Empty;

            // [1] Request 객체의 QueryString 컬렉션
            strUserId = Request.QueryString["UserID"];
            // [2] Request 객체의 Params 컬렉션
            strPassword = Request.Params["Password"];
            // [3] Request 객체의 Form 컬렉션
            strName = Request.Form["Name"];
            // [4] Request 객체 자체로 받기
            strAge = Request["Age"];

            string strMsg = String.Format(
                "입력하신 아이디는 {0}이고<br />"
                + "암호는 {1}입니다.<br />"
                + "이름은 {2}이고,<br />"
                + "나이는 {3}살 입니다.<br />",
                strUserId, strPassword,
                strName, strAge);

            Response.Write(strMsg);
        }
        protected void btnSubmit_Click(object sender, EventArgs e)
        {
            // ASP.NET에서는 Request 개체보다는
            // 컨트롤의 속성을 사용해서 값은 받습니다.
            string name = Name.Text;
            int age = Convert.ToInt16(Age.Text);
        }
    }
}

⑤ FrmRequest.aspx를 시작 페이지로 설정하고, [Ctrl]+[F5]를 눌러 실행합니다.

그림 4.6 FrmRequest.aspx 페이지 실행 결과

⑥ 웹 브라우저로 실행된 FrmRequest.aspx 페이지에서 문자열을 입력하고 <전송> 버튼을 클릭해서 입력한 문자열이 출력되는지 확인합니다. 폼 방식으로 전송된 값을 QueryString 컬렉션을 사용해서는 받지 못함을 확인할 수 있습니다. Request.QueryString[“UserID”] 코드를 Request[“UserID”] 형식으로 바꾸면 아이디 값도 정상적으로 받을 수 있습니다. 이런 이유로 두 가지 방식으로 전송된 값을 구분하지 않고 받을 때는 Request.Params[] 컬렉션 또는 Request[] 개체로 받습니다. Request.QueryString[] 형태로 받으려면, 주소창에 ?UserID=Red 식으로 전송하면 됩니다.

그림 4.7 값 입력 후 전송 버튼 클릭 결과

⑦ 웹 폼 추가하기

솔루션 탐색기에서 DevASPNET 웹 프로젝트에 마우스 오른쪽 버튼을 클릭하고, <추가 > 새 항목> 메뉴를 선택하여 다음과 같이 웹 프로젝트에 웹 폼을 추가합니다.

템플릿 이름: 웹 폼 이름: FrmRequestUserHostAddress.aspx

⑧ 웹 폼 코드 입력

FrmRequestUserHostAddress.aspx의 <소스 보기>를 선택하고 다음과 같이 코드를 입력합니다.

<%@ Page Language="C#" AutoEventWireup="true" 
    CodeBehind="FrmRequestUserHostAddress.aspx.cs" 
    Inherits="DevASPNET.FrmRequestUserHostAddress" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>IP 주소 얻기</title>
</head>
<body>
<form id="form1" runat="server">
    <div>
        IP 주소 얻기<br />
        <br />
        <asp:Label ID="Label1" runat="server"></asp:Label><br />
        <asp:Label ID="Label2" runat="server"></asp:Label><br />
        <asp:Label ID="Label3" runat="server"></asp:Label>
    </div>
</form>
</body>
</html>

⑨ 코드 숨김 파일 작성

생성된 웹 폼을 <디자인 보기>에서 더블클릭하거나 솔루션 탐색기에서 FrmRequestUserHostAddress.aspx.cs 파일을 더블클릭하여 코드 숨김 파일로 이동한 후, 다음과 같이 프로그램을 작성합니다.

using System;

namespace DevASPNET
{
    public partial class FrmRequestUserHostAddress : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            // 웹 폼에서 현재 접속자의 IP 주소 얻기
            this.Label1.Text = Request.UserHostAddress; // 추천
            this.Label2.Text =
                Request.ServerVariables["REMOTE_HOST"];
            this.Label3.Text =
                Request.ServerVariables["REMOTE_ADDR"];
        }
    }
}

실행 결과 확인

FrmRequestUserHostAddress.aspx를 시작 페이지로 설정하고, Ctrl+F5를 눌러 실행합니다.

그림 4.8 현재 접속자의 IP 주소 얻기 실행 결과

Visual Studio 개발 환경에서 실행하면 localhost를 통해 실행되며, 출력되는 값은 localhost, 127.0.0.1, ::1 중 하나로 나타납니다. 실제 IP 주소 기반에서 소스를 실행하면 해당 IP 주소가 출력됩니다.

::1

::1은 IPv6(Internet Protocol version 6)에서의 localhost 주소입니다. IPv4(Internet Protocol version 4)에서는 localhost 주소가 127.0.0.1로 사용되는데, 이는 네트워크 상에서 자신의 컴퓨터를 가리키는 특수 목적의 IP 주소입니다. 같은 방식으로, IPv6에서는 ::1이 자신의 컴퓨터를 가리키기 위해 사용됩니다.

IPv6 주소체계는 IP 주소의 부족 문제를 해결하기 위해 도입되었습니다. IPv4가 약 40억 개의 주소 공간을 제공하는 반면, IPv6는 약 340억 경의 주소 공간을 제공합니다. IPv6 주소는 8개의 16진수 그룹으로 구성되며, 각 그룹은 4개의 16진수로 표현됩니다. ::1 주소는 이 중 첫 7개 그룹이 모두 0이고, 마지막 그룹만 1인 특수 주소로, ‘루프백(loopback)’ 주소라고도 불립니다. 루프백 주소를 사용하는 연결은 네트워크를 경유하지 않고, 자신의 시스템 내에서 직접 통신하는 데 사용됩니다.

4.5.3 마무리

이번 실습을 통해 웹에서 특정 기능을 구현하려면 ASP.NET의 내장 개체를 사용해야 함을 배웠습니다. 특히, IP 주소 정보는 웹에서 데이터의 출처를 알기에 유용하므로, 해당 명령어는 웹 응용 프로그램 제작 시 반드시 활용되어야 합니다.

4.5.4 Request.RawUrl

<참고> Request.RawUrl 현재 보고 있는 페이지의 URL 및 쿼리스트링을 모두 포함한 URL을 제공합니다. 예시: /BoardView?BoardName=GOT7EVENT&Num=1024

추가 학습: 다음 샘플 코드는 뒤에서 다룰 폼뷰(FormView)와 같은 특정 컨트롤에서 항목을 추가한 후 현재 페이지를 다시 로드하는 코드입니다. <코드> protected void ctlGoodsCreate_ItemInserted(object sender, FormViewInsertedEventArgs e) { // 현재 페이지 다시 로드(쿼리 스트링 모두 포함) Response.Redirect(Request.RawUrl); }

 

**추가 학습**:
PHP는 $_GET[]과 $_POST[]으로 GET과 POST 전송 값을 받을 수 있습니다. 
 

4.5.5	모바일 장치 확인: Request.Browser와 IsMobileDevice
ASP.NET에서 모바일 장치를 확인하는 샘플 코드는 다음과 같습니다.
<코드>
// 모바일 디바이스와 데스크톱 디바이스 구분
System.Web.HttpBrowserCapabilities httpBrowser = Request.Browser;
if (httpBrowser.IsMobileDevice == true)
{
// 모바일 장치
}
else
{
// 일반 PC 장치
}

위 코드와 함께 UI 단에서는 부트스트랩 4의 Display 속성을 사용하여 XS, SM, MD, LG, XL 환경에서 특정 HTML 요소가 보일지 안 보일지 결정할 수 있습니다. https://getbootstrap.com/docs/4.0/utilities/display/

4.5.6 질문과 답변: 모바일 장치는 어떻게 확인할까요? 모바일 장치 확인: Request.Browser와 IsMobileDevice (1) 서버 단 ASP.NET에서 모바일 장치를 확인하는 샘플 코드는 다음과 같습니다.

// 모바일 디바이스와 데스크톱 디바이스 구분
System.Web.HttpBrowserCapabilities httpBrowser = Request.Browser;
if (httpBrowser.IsMobileDevice == true)
{
// 모바일 장치
}
else
{
// 일반 PC 장치
}

(2) 클라이언트 단 위 코드와 함께 UI 단에서는 부트스트랩 4의 Display 속성을 사용하여 XS, SM, MD, LG, XL 환경에서 특정 HTML 요소가 보일지 안 보일지 결정할 수 있습니다. https://getbootstrap.com/docs/4.0/utilities/display/ https://getbootstrap.com/docs/4.0/layout/grid/

명확하게 페이지 기능이 구분이 된다면, 위 1번의 서버단 코드를 사용하여 모바일 장치면 DeviceSelection.Mobile.aspx로 이동 PC 장치면 DeviceSelection.aspx로 이동 식의 코드를 구분해서 모바일 페이지와 PC 화면을 따로 만드는 방법이 있구요. 이보다는 요즘은 하나의 페이지에 (1) 번 코드와 (2)번 코드를 혼합해서 사용해서 모바일 화면에서는 숨기고 SM 이상 화면에서는 보이는 방법을 주로 사용하는게 좋습니다. 다음 샘플 코드는 UI 단에서 부트 스트랩을 사용하여 가장 작은 화면일 때(col-xs-12) 12칸을 꽉 채워서 사용하고, 일반 화면(md)일 때에는 4대4대4 형태로 3등분해서 보여주는 부트스트랩의 CSS 클래스를 사용할 수 있습니다.

즉, ASP.NET(C#)에서 모바일 장치를 확인하는 IsMobileDevice 속성에 따라서 UI단(부트스트랩)의 Grid와 Display 속성을 사용하여 레이아웃과 보이기/숨기기 기능을 적절히 사용하는 방식입니다. 즉, 데이터베이스 연동 등의 서버측 기능은 코드 비하인드에서 IsMobile 속성으로 구분해서 if ~ else 구문에서 로직을분리하고, 그에 따라서 모바일 화면은 화면 크기가 반응형에 따라서 변경되는 형태에 따라서 부트스트랩의 레이아웃(Grid)과 보이기(Bootstrap) 기능을 함께 적용해 나가면 될 것같습니다. 일단은 1 소스로 가는걸 원칙으로 하면 될 것 같습니다.

4.6 Server 객체

Server 객체는 웹 페이지에 특정 서버 페이지를 포함시키거나, 현재 페이지의 서버 측 경로를 표시하는 데 필요한 기능을 제공합니다. 이 객체를 사용하여 현재 페이지와 동일한 경로 또는 홈 디렉토리 경로 같은 경로 정보를 얻는 데 가장 자주 사용되는 메서드는 MapPath()입니다.

주요 메서드 및 속성

  • MapPath("."): 현재 파일과 동일한 경로 값을 반환합니다. “.”나 “../” 같은 표현을 사용하여 원하는 경로의 물리적 경로를 조회할 수 있습니다.
  • Execute(): 다른 파일을 포함(인클루드)한 후 제어권을 현재 페이지로 돌려줍니다.
  • Transfer(): 다른 파일을 포함(인클루드)한 후 제어권을 해당 페이지로 넘깁니다.
  • UrlPathEncode(): 전달된 쿼리스트링을 유니코드로 변환하여 한글 등의 문자 처리를 가능하게 합니다.
  • ScriptTimeout: 서버가 현재 aspx 페이지의 처리를 위해 할당하는 시간(초)을 설정합니다.

참고: URI와 URL

URI(Uniform Resource Identifier)와 URL(Uniform Resource Locator)은 인터넷(WAN) 상에서 HTML, 이미지, 동영상 같은 특정 자원에 접근하기 위해 사용되는 경로를 지정합니다. UNC(Universal Naming Convention) 경로는 로컬 네트워크(LAN) 환경에서 특정 자원에 접근하기 위해 사용되며, 다음과 같은 형식을 취합니다.

URI(URL) 구성 요소는 다음과 같이 세분화할 수 있습니다:

  • 도메인: dotnetkorea.com
  • 호스트(2차 도메인): www, ftp, mail 등
  • 프로토콜: http://, ftp://, mms:// 등
  • 포트 번호: 80, 110, 21, 23, 25, 8080 등
  • 기본 문서: Default.htm, Default.asp, Default.aspx, Index.html 등
  • 쿼리스트링: ?UserID=RedPlus&Password=1234 등
  • 내부 경로(책갈피): #top, #middle, #bottom 등

4.7 실습: Server 객체의 주요 멤버 사용법

4.7.1 소개

이번 섹션에서는 Server 객체의 가장 자주 사용되는 기능 중 하나인 현재 스크립트 파일의 실제 물리적 경로를 나타내는 Server.MapPath(".") 기능을 살펴봅니다.

4.7.2 따라하기

  1. 이미 DevASPNET 프로젝트가 열려 있는 경우 그대로 사용하고, 그렇지 않다면 Visual Studio를 실행한 후 "파일 > 프로젝트 열기" 메뉴를 선택하여 C드라이브의 ASP.NET 폴더 내에 있는 DevASPNET 폴더를 선택해 이전 실습에서 생성한 DevASPNET 웹 프로젝트를 엽니다.

  2. 솔루션 탐색기에서 DevASPNET 웹 프로젝트를 마우스 오른쪽 버튼으로 클릭하고 "추가 > 새 항목" 메뉴를 선택한 후, 이름을 FrmServerMapPath.aspx로 하여 웹 프로젝트에 웹 폼을 추가합니다.
    템플릿 이름: 웹 폼
    이름: FrmServerMapPath.aspx

  3. FrmServerMapPath.aspx 페이지를 열고 다음과 같이 입력합니다:

<%@ Page Language="C#" AutoEventWireup="true"
    CodeBehind="FrmServerMapPath.aspx.cs" 
    Inherits="DevASPNET.FrmServerMapPath" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Server 객체</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            현재 파일(웹 폼)의 물리적인 전체 경로 :
            <asp:Label ID="Label1" runat="server"></asp:Label><br />
            현재 스크립트 파일의 루트 경로 :
            <asp:Label ID="Label2" runat="server"></asp:Label><br />
        </div>
    </form>
</body>
</html> 
  1. FrmServerMapPath.aspx의 "소스 보기"를 선택하고, 네임스페이스 선언부를 포함하여 다음과 같이 코드를 작성합니다:
using System;

namespace DevASPNET
{
    public partial class FrmServerMapPath : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            // 현재 웹 폼의 서버측의 물리적 경로
            this.Label1.Text = Server.MapPath("."); // 같은 경로
            // 현재 스크립트 파일의 루트 경로
            this.Label2.Text =
                Request.ServerVariables["SCRIPT_NAME"];
        }
    }
}
  1. FrmServerMapPath.aspx에 마우스 오른쪽 버튼을 클릭하여 "시작 페이지로 설정" 메뉴를 선택하고, [Ctrl]+[F5]를 누르면 웹 브라우저에 다음과 같이 출력됩니다:
    그림 4.9 FrmServerMapPath.aspx 페이지 실행 결과

4.7.3 마무리

Server.MapPath() 메서드를 사용하여 현재 스크립트 파일의 물리적 경로를 나타냈습니다. Server 객체에는 현재 웹 폼에서 다른 파일을 포함하여 실행하는 Execute() 메서드 등 다양한 기능이 있습니다. 그러나 이러한 내용은 지면의 한계로 여기서는 자세히 다루지 않습니다. 추가적인 명령어에 대한 정보는 MSDN 사이트나 검색 엔진을 통해 확인할 수 있습니다.

4.8 Application 객체

Application 객체는 전역 응용 프로그램 상태를 관리하는 데 사용되며, 어플리케이션 영역에서 저장된 값을 웹 페이지 어느 곳에서든 참조할 수 있게 해줍니다. 이 객체는 애플리케이션 수준의 변수를 관리하는 데 주로 사용되며, Application["이름"] = 값; 형식으로 값을 저장합니다.

주요 메서드 및 이벤트

  • Lock(): 애플리케이션 변수를 잠그는 메서드입니다. 이를 사용하면 동시에 여러 요청이 같은 변수를 수정하는 것을 방지할 수 있습니다.
  • UnLock(): 잠긴 애플리케이션 변수의 잠금을 해제합니다.
  • Add(): 새로운 애플리케이션 변수를 추가할 때 사용됩니다.
  • Application_Start(): 웹 애플리케이션이 시작될 때 발생하는 이벤트입니다. 첫 번째 사용자가 웹 사이트를 방문할 때 발생하며, Global.asax 파일에서 설정합니다.
  • Application_End(): 웹 애플리케이션이 종료될 때 발생하는 이벤트입니다. 마지막 사용자가 웹 사이트를 떠난 후에 발생하며, Global.asax 파일에서 설정합니다.

4.9 Session 객체

Session 객체는 사용자별 상태 정보를 저장하고 관리하기 위해 사용되며, 서버 측 메모리에 사용자 정보를 키와 값 형태로 저장합니다. Application 변수가 공용적으로 접근 가능한 반면, Session 변수는 각 사용자별로 생성되어 개별적인 데이터를 유지합니다. 이는 사용자가 웹 사이트를 방문했을 때 해당 사용자에게만 특정한 값을 저장하고 유지하고 싶을 때, 예를 들어 회원 로그인 상태를 유지할 때 유용합니다.

주요 멤버

  • SessionID: 현재 세션의 고유 번호 값을 반환합니다.
  • SessionTimeout: 세션의 유지 시간을 설정합니다. 기본값은 20분이며, 필요에 따라 조정할 수 있습니다.
  • Abandon(): 현재 세션을 종료합니다.
  • Session_Start(): 사용자(세션)가 방문할 때 실행되는 이벤트입니다.
  • Session_End(): 사용자가 사이트를 떠난 후 실행되는 이벤트입니다.

추가 학습

웹 페이지는 기본적으로 페이지 간에 값을 유지하지 않습니다. 예를 들어, A 페이지에서 생성된 데이터를 B 페이지에서 직접 사용할 수 없습니다. 이러한 한계를 극복하고 공통 데이터를 관리하기 위해 상태 관리가 필요합니다. 상태 관리 방법으로는 Session 객체 사용이나 데이터베이스를 통한 영구적인 데이터 저장이 있습니다. 즉, A 페이지에서 생성된 데이터를 세션 객체나 데이터베이스에 저장한 후, B 페이지에서 해당 데이터를 로드할 때 이를 다시 읽어오는 방법을 사용할 수 있습니다.

세션 개체의 사용은 A 페이지에서 저장된 데이터를 B 페이지로 이동했을 때, 코드를 통해 이 데이터를 쉽게 읽어올 수 있다는 장점을 제공합니다.

4.10 실습: Application과 Session을 사용한 페이지 간 데이터 유지

4.10.1 소개

이 실습에서는 A.aspx와 B.aspx 페이지 간 데이터를 유지하는 방법을 살펴봅니다. 공통적으로 사용되는 데이터는 Application 객체 변수를 통해, 사용자별 개인 데이터는 Session 객체 변수를 통해 관리합니다. 이를 통해 어떻게 데이터를 유지하고 관리하는지 예제를 통해 학습합니다.

4.10.2 따라하기

  1. DevASPNET 프로젝트가 이미 열려 있다면 그대로 사용하고, 그렇지 않다면 Visual Studio를 실행 후 "파일 > 프로젝트 열기" 메뉴를 클릭하여 C 드라이브의 ASP.NET 폴더 안에 있는 DevASPNET 폴더를 선택해 이전 실습에서 만든 DevASPNET 웹 프로젝트를 불러옵니다.

  2. 솔루션 탐색기에서 DevASPNET 웹 프로젝트에 마우스 오른쪽 버튼을 클릭하여 "추가 > 새 항목" 메뉴를 클릭한 후, 이름을 FrmApplicationSession.aspx로 설정하여 웹 프로젝트에 웹 폼을 추가합니다.
    템플릿 이름: 웹 폼
    이름: FrmApplicationSession.aspx

  3. FrmApplicationSession.aspx 페이지를 열고, 다음과 같이 입력합니다:

<%@ Page Language="C#" AutoEventWireup="true"
    CodeBehind="FrmApplicationSession.aspx.cs"
    Inherits="DevASPNET.FrmApplicationSession" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Application 및 Session 객체</title>
</head>
<body>
<form id="form1" runat="server">
<div>
    현재 페이지가 모든 사용자에 의해 
    <asp:Label ID="lblApplication" runat="server"></asp:Label>
    번 호출되었습니다.<br />
    현재 페이지가 나에 의해서 
    <asp:Label ID="lblSession" runat="server"></asp:Label>
    번 호출되었습니다.<br />
    나의 고유 접속번호 :
    <asp:Label ID="lblSessionID" runat="server"></asp:Label><br />
    현재 세션 유지시간 :
    <asp:Label ID="lblTimeout" runat="server"></asp:Label><br />
</div>
</form>
</body>
</html>
  1. FrmApplicationSession.aspx의 "소스 보기"를 선택하고, 네임스페이스 선언부를 포함하여 다음과 같이 코드를 작성합니다:
using System;

namespace DevASPNET
{
    public partial class FrmApplicationSession : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            // Application 변수 1 증가
            if (Application["Count"] == null)
            {
                Application.Lock(); // 변수 수정 잠그기
                Application["Count"] = 1; // 초기화
                Application.UnLock(); // 잠금 해제
            }
            else
            {
                Application["Count"] = (int)Application["Count"] + 1;
            }
            // Session 변수 1 증가
            if (Session["Count"] == null)
            {
                Session["Count"] = 1;
            }
            else
            {
                Session["Count"] = (int)Session["Count"] + 1;
            }
            // 출력
            this.lblApplication.Text = Application["Count"].ToString();
            this.lblSession.Text = Session["Count"].ToString();
            this.lblSessionID.Text = Session.SessionID;
            this.lblTimeout.Text = Session.Timeout.ToString();
        }
    }
}
  1. FrmApplicationSession.aspx를 마우스 오른쪽 버튼으로 클릭하여 "시작 페이지로 설정" 메뉴를 선택하고, [Ctrl]+[F5]를 눌러 실행하면 웹 브라우

저에 다음과 같이 출력됩니다. 다음 그림은 두 브라우저에서 같은 경로를 요청한 내용을 보여줍니다.
그림 4.10 FrmApplicationSession.aspx 페이지 실행 결과

새로고침을 하거나 새로운 웹 브라우저를 열고 해당 URL을 요청하면, 각 세션은 1씩 증가하고, 애플리케이션 객체 변수는 웹 페이지를 요청할 때마다 지속적으로 값이 증가하는 것을 확인할 수 있습니다.

4.10.3 마무리

이 실습을 통해 '책을 따라 연습 - 결과 확인 - 소스 분석' 순서로 진행하는 과정을 경험하셨기를 바랍니다. 처음에는 모든 내용을 완벽히 이해하기 어려울 수 있으므로, 전체 개념을 학습한 후에는 앞 부분의 내용을 다시 보며 반복 학습하는 것이 중요합니다. Application과 Session을 통한 상태 관리는 ASP.NET에서 매우 중요한 개념으로, 이를 통해 웹 사이트 전체의 데이터를 효과적으로 관리할 수 있습니다.

<참고> Application과 Session을 사용한 상태 관리

ASP.NET은 웹 사이트 전체에서 사용할 수 있는 전역 변수 개념으로 Application과 Session을 도입했습니다.

  • Application 변수: 공통(Public) 성격을 가지며, Application["변수명"] = "값"; 형태로 선언되어 모든 사용자에게 동일한 값을 공유합니다. 예를 들어, 사용자 A가 Application["Count"] = 100;으로 초기화하면 사용자 B가 Application["Count"]를 조회했을 때, 100이 출력되는 방식입니다. 이 변수는 웹 서버에 단 한 개만 생성되며, 모든 사용자가 공통으로 접근 가능합니다.

  • Session 변수: 전용(Private) 성격을 가지며, 각 사용자별로 별도의 공간에 저장됩니다. Session["변수명"] = "값"; 형태로 선언하며, 사용자 A의 세션 변수와 사용자 B의 세션 변수는 서로 다르게 관리됩니다. 예를 들어, 사용자 A가 Session["Count"] = 100;으로 초기화해도 사용자 B는 해당 세션 변수를 볼 수 없습니다. 세션 변수는 각 사용자별로 서버 메모리를 사용하기 때문에, 메모리 관리에 주의가 필요합니다. 예컨대, 세션 하나당 1KB의 데이터를 저장한다고 가정할 때, 1000명의 사용자가 있으면 약 1MB의 메모리를 사용하게 됩니다.

Application과 Session 변수는 웹 프로젝트의 Global.asax 파일에서 일반적으로 관리합니다. 이 파일은 웹 사이트에 접근하는 모든 사용자의 요청을 관리하는 게이트웨이 역할을 합니다. 여기에는 응용 프로그램과 관련된 다양한 유용한 이벤트 처리기가 포함되어 있으며, 다음 네 가지 이벤트가 가장 자주 사용됩니다:

  • Application_Start(): 웹 사이트를 처음 방문하는 사용자가 있을 때 실행됩니다.
  • Session_Start(): 새 사용자 세션이 시작될 때 실행됩니다.
  • Session_End(): 사용자 세션이 종료될 때(기본적으로 마지막 요청 후 20분 뒤) 실행됩니다.
  • Application_End(): 웹 사이트의 마지막 사용자가 나간 후 실행됩니다.

이러한 메커니즘을 통해 ASP.NET은 사용자의 상태 정보를 효과적으로 관리할 수 있습니다, Application과 Session을 적절히 활용하면 웹 애플리케이션에서 다양한 사용자의 데이터를 유연하게 처리할 수 있습니다.

4.11 Page 클래스 개요

ASP.NET 웹 페이지는 System.Web.UI.Page 클래스에서 파생됩니다. 이 클래스는 ASP.NET의 핵심으로, 웹 개발에 필수적인 다양한 기능과 속성을 제공합니다. 핵심 멤버는 아래와 같이 요약할 수 있습니다:

  • IsPostBack: 페이지가 처음 로드되었는지, 아니면 다시 게시(PostBack)되었는지를 판별합니다.
  • ClientScript.RegisterClientScriptBlock(): 자바스크립트 코드를 동적으로 페이지에 추가합니다.
  • Header: 웹 폼의 <head> 태그 내용을 관리합니다.
  • Title: 페이지의 제목을 동적으로 설정하거나 조회합니다.
  • SetFocus(): 지정된 컨트롤에 포커스를 설정합니다.

4.11.1 처음 로드와 다시 게시(PostBack)

  • 처음 로드: 사용자가 웹 페이지를 처음 요청할 때 발생합니다.
  • 다시 게시(PostBack): 사용자가 웹 폼의 서버 컨트롤(예: 버튼)을 클릭하여 페이지가 다시 로드되는 현상입니다.

4.11.2 Page.IsPostBack 속성

IsPostBack 속성은 페이지가 처음 로드되었는지 아니면 다시 게시(PostBack)되었는지를 확인하는 데 사용됩니다. 이는 페이지 로드의 성격에 따라 다른 처리를 할 필요가 있을 때 유용합니다.

4.11.3 Page_Load 이벤트 처리기와 Button_Click 이벤트 처리기

ASP.NET 페이지 로드 시 Page_Load 이벤트 처리기에 작성된 코드가 먼저 실행됩니다. 이후, 페이지의 버튼이 클릭되면 해당 버튼의 Button_Click 이벤트 처리기가 실행됩니다. 주의해야 할 두 가지 사항은:

  1. 처음 로드 시 처리: 처음 로드할 때만 수행해야 할 작업은 if(!Page.IsPostBack){} 블록 안에 구현해야 합니다.
  2. 버튼 클릭 고유 기능 구현: 버튼 클릭 시 Page_Load를 건너뛰고 버튼의 고유 기능만 수행하려면, 버튼의 CausesValidation 속성을 false로 설정합니다.

4.11.4 Page 지시문

ASP.NET 웹 폼은 <%@ Page %> 지시문으로 시작하며, 이를 통해 웹 폼의 동작을 선언적으로 제어할 수 있습니다. 주요 속성으로는:

  • Language: 페이지의 프로그래밍 언어를 지정합니다.
  • AutoEventWireup: 이벤트를 자동으로 연결합니다.
  • CodeFile: 코드 비하인드 파일을 지정합니다.
  • Inherits: 코드 비하인드 파일의 클래스를 지정합니다.

추가 속성으로는:

  • Trace: 페이지 추적 정보를 출력합니다.
  • Debug: 디버깅 정보를 상세히 출력합니다.
  • ValidateRequest: 서버로의 HTML 태그 전송을 허용합니다.
  • MaintainScrollPositionOnPostback: 다시 게시 시 스크롤 위치를 유지합니다.

이러한 기능과 속성들은 ASP.NET 웹 페이지 개발의 기본을 이루며, 웹 애플리케이션의 다양한 요구사항을 충족시키는 데 필수적입니다.## 4.11 Page 클래스 개요

ASP.NET 웹 페이지는 System.Web.UI.Page 클래스에서 파생됩니다. 이 클래스는 ASP.NET의 핵심으로, 웹 개발에 필수적인 다양한 기능과 속성을 제공합니다. 핵심 멤버는 아래와 같이 요약할 수 있습니다:

  • IsPostBack: 페이지가 처음 로드되었는지, 아니면 다시 게시(PostBack)되었는지를 판별합니다.
  • ClientScript.RegisterClientScriptBlock(): 자바스크립트 코드를 동적으로 페이지에 추가합니다.
  • Header: 웹 폼의 <head> 태그 내용을 관리합니다.
  • Title: 페이지의 제목을 동적으로 설정하거나 조회합니다.
  • SetFocus(): 지정된 컨트롤에 포커스를 설정합니다.

4.11.1 처음 로드와 다시 게시(PostBack)

  • 처음 로드: 사용자가 웹 페이지를 처음 요청할 때 발생합니다.
  • 다시 게시(PostBack): 사용자가 웹 폼의 서버 컨트롤(예: 버튼)을 클릭하여 페이지가 다시 로드되는 현상입니다.

4.11.2 Page.IsPostBack 속성

IsPostBack 속성은 페이지가 처음 로드되었는지 아니면 다시 게시(PostBack)되었는지를 확인하는 데 사용됩니다. 이는 페이지 로드의 성격에 따라 다른 처리를 할 필요가 있을 때 유용합니다.

4.11.3 Page_Load 이벤트 처리기와 Button_Click 이벤트 처리기

ASP.NET 페이지 로드 시 Page_Load 이벤트 처리기에 작성된 코드가 먼저 실행됩니다. 이후, 페이지의 버튼이 클릭되면 해당 버튼의 Button_Click 이벤트 처리기가 실행됩니다. 주의해야 할 두 가지 사항은:

  1. 처음 로드 시 처리: 처음 로드할 때만 수행해야 할 작업은 if(!Page.IsPostBack){} 블록 안에 구현해야 합니다.
  2. 버튼 클릭 고유 기능 구현: 버튼 클릭 시 Page_Load를 건너뛰고 버튼의 고유 기능만 수행하려면, 버튼의 CausesValidation 속성을 false로 설정합니다.

4.11.4 Page 지시문

ASP.NET 웹 폼은 <%@ Page %> 지시문으로 시작하며, 이를 통해 웹 폼의 동작을 선언적으로 제어할 수 있습니다. 주요 속성으로는:

  • Language: 페이지의 프로그래밍 언어를 지정합니다.
  • AutoEventWireup: 이벤트를 자동으로 연결합니다.
  • CodeFile: 코드 비하인드 파일을 지정합니다.
  • Inherits: 코드 비하인드 파일의 클래스를 지정합니다.

추가 속성으로는:

  • Trace: 페이지 추적 정보를 출력합니다.
  • Debug: 디버깅 정보를 상세히 출력합니다.
  • ValidateRequest: 서버로의 HTML 태그 전송을 허용합니다.
  • MaintainScrollPositionOnPostback: 다시 게시 시 스크롤 위치를 유지합니다.

이러한 기능과 속성들은 ASP.NET 웹 페이지 개발의 기본을 이루며, 웹 애플리케이션의 다양한 요구사항을 충족시키는 데 필수적입니다.

4.12 실습: Page 객체의 주요 멤버 사용 방법

4.12.1 소개

이 실습에서는 Page 객체의 핵심 기능을 활용하여 웹 페이지 제목 설정, 스타일시트 적용, 자바스크립트 실행 등을 실습합니다. 이 기능들은 웹 페이지를 더욱 동적이고 사용자 친화적으로 만드는 데 중요한 역할을 합니다.

4.12.2 따라하기

  1. 프로젝트 준비: DevASPNET 프로젝트가 열려 있으면 그대로 사용, 아니면 Visual Studio를 실행하여 "파일 > 프로젝트 열기"를 선택하고 C드라이브 내의 ASP.NET 폴더에서 DevASPNET 프로젝트를 불러옵니다.

  2. 웹 폼 및 스타일시트 추가: 솔루션 탐색기에서 "추가 > 새 항목"을 선택하여 FrmPageLoad.aspx 웹 폼과 DevASPNET.css 스타일시트를 프로젝트에 추가합니다.

  3. 스타일시트 정의:

    body, div, td {
        background-color: Yellow;
    }
    
  4. 페이지 마크업:

    <%@ Page Language="C#" AutoEventWireup="true"
        CodeBehind="FrmPageLoad.aspx.cs" Inherits="DevASPNET.FrmPageLoad" %>
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>Page 클래스</title>
    </head>
    <body>
    <form id="form1" runat="server">
        <div>
            <asp:Button ID="btnPostBack" runat="server" 
            Text="다시 게시(PostBack)" OnClick="btnPostBack_Click" />
            <asp:Button ID="btnNewLoad" runat="server" 
            OnClick="btnNewLoad_Click" Text="다시 로드" />
        </div>
    </form>
    </body>
    </html>
    
  5. 코드 비하인드: Page 로드 시 동적으로 제목 변경, 스타일 적용, 버튼 클릭 시 자바스크립트 실행 코드 작성:

    using System;
    using System.Web.UI;
    using System.Web.UI.HtmlControls; // 네임스페이스 추가
    using System.Web.UI.WebControls;
    
    namespace DevASPNET
    {
        public partial class FrmPageLoad : System.Web.UI.Page
        {
            protected void Page_Load(object sender, EventArgs e)
            {
                // 페이지 제목 동적 설정
                Title = "제목이 바뀝니다.";
                Page.Title = "제목이 출력됩니다.";
                Page.Header.Title = "Page 클래스";
    
                // 스타일시트 적용
                HtmlLink objHtmlLink = new HtmlLink();
                objHtmlLink.Href = "DevASPNET.css";
                objHtmlLink.Attributes.Add("rel", "stylesheet");
                objHtmlLink.Attributes.Add("type", "text/css");
                Page.Header.Controls.Add(objHtmlLink);
    
                // 스타일 동적 적용
                Style objButtonStyle = new Style();
                objButtonStyle.ForeColor = System.Drawing.Color.Navy;
                objButtonStyle.Font.Size = 9;
                objButtonStyle.Font.Name = "Verdana";
                Page.Header.StyleSheet.RegisterStyle(objButtonStyle, null);
                this.btnNewLoad.CssClass = objButtonStyle.RegisteredCssClass;
                this.btnPostBack.CssClass = objButtonStyle.RegisteredCssClass;
    
                // 페이지 로드 메시지
                if (!Page.IsPostBack)
                {
                    Response.Write("[1] 폼이 처음 로드할 때에만 실행<br />");
                }
                Response.Write("[3] 폼이 로드할 때마다 실행<br />");
            }
    
            protected void btnPostBack_Click(object sender, EventArgs e)
            {
                string strJs = @"<script>window.alert('포스트백 됨');</script>";
                ClientScript.RegisterClientScriptBlock(this.GetType(), "MyScript", strJs);
            }
    
            protected void btnNewLoad_Click(object sender, EventArgs e)
            {
                Response.Redirect("FrmPageLoad.aspx");
            }
        }
    }
    
  6. 실행 및 결과 확인: FrmPageLoad.aspx를 시작 페이지로 설정, 실행하여 다양한 기능의 동작을 확인합니다.

4.12.3 마무리

이 실습을 통해 IsPostBack 속성의 중요성을 이해하고, Page 클래스의 다양한 멤버를 활용하는 방법을 배웠습니다. 페이지 로드 시나 이벤트 발생 시 동적으로 웹 페이지의 행동을 변경하는 방법은 ASP.NET 웹 개발에서 자주 사용되는 핵심 기술입니다.

4.13 [참고] Windows Forms 기본 클래스들

4.13.1 Application 클래스

Application 클래스는 Windows Forms 애플리케이션의 실행을 관리합니다. 가장 주로 사용되는 기능 중 하나는 애플리케이션을 종료하는 Application.Exit() 메서드입니다.

  • Application.Exit(): 실행 중인 Windows Forms 애플리케이션을 종료합니다.

4.13.2 MessageBox 클래스

MessageBox 클래스를 사용하면 사용자에게 메시지 박스를 표시할 수 있습니다. Show() 메서드는 다양한 오버로드를 제공하여, 필요에 따라 다른 형태의 메시지 박스를 생성할 수 있습니다.

  • MessageBox.Show(): 사용자에게 메시지 박스를 표시합니다. 이 메서드를 통해 정보, 경고, 에러 등을 사용자에게 알릴 수 있습니다.

4.13.3 SystemInformation 클래스

SystemInformation 클래스는 현재 시스템에 대한 다양한 정보를 제공합니다. 이 클래스를 통해 개발자는 사용 중인 컴퓨터의 시스템 정보를 프로그램 내에서 활용할 수 있습니다.

  • SystemInformation.ComputerName: 실행 중인 컴퓨터의 이름을 반환합니다.

4.14 Blazor – NavigationManager

Blazor 애플리케이션에서는 NavigationManager 클래스를 사용하여 C# 코드에서 페이지 이동을 처리할 수 있습니다. 이 클래스를 활용해 SPA(Single Page Application)에서의 라우팅을 구현할 수 있습니다.

  • NavigateTo() 메서드: 지정된 URL로 브라우저를 리다이렉트합니다.

ASP.NET Core Blazor 라우팅에 대한 더 자세한 정보는 공식 문서에서 확인할 수 있습니다.

4.15 [실습] URI 및 NavigationManager 클래스 사용하기

이 실습 세션에서는 Blazor 애플리케이션 내에서 NavigationManager 클래스를 사용하여 URI를 기반으로 한 페이지 이동을 실습합니다. 이 과정을 통해 Blazor에서의 프로그래매틱한 라우팅 방법을 학습하게 됩니다.

VisualAcademy Docs의 모든 콘텐츠, 이미지, 동영상의 저작권은 박용준에게 있습니다. 저작권법에 의해 보호를 받는 저작물이므로 무단 전재와 복제를 금합니다. 사이트의 콘텐츠를 복제하여 블로그, 웹사이트 등에 게시할 수 없습니다. 단, 링크와 SNS 공유, Youtube 동영상 공유는 허용합니다. www.VisualAcademy.com
박용준 강사의 모든 동영상 강의는 데브렉에서 독점으로 제공됩니다. www.devlec.com