티스토리 뷰



"ASP.NET 레이저(Razor) 시작하기"에 이어서 C# 기반의 레이저 문법을 정리해 봅니다.

@{
    var today_str = "오늘은 " + DateTime.Now.Date.ToString() + " 입니다.";
    String req_type = Request.RequestType;
    int max_year = 2030;
}

<!DOCTYPE html>

<html lang="en">
    <head>
        <meta charset="utf-8" />
        <title>Welcome page</title>
    </head>
    <body>
    <p>페이지 방문을 환영합니다. @today_str</p>
        <p>요청 내용 :</p>
        <ul> @* 코드 외부 주석 *@
        <li>URL : @Request.Url</li>
        <li>요청형식 : @Request.RequestType</li>
        <li>길이 : @Request.ContentLength</li>
        </ul>
@{
    <p>주요 설정 :</p> @:테스트 메시지<br/>
@* 코드내 주석 *@ 
    <span>입력 가능 연도 : @max_year</span>
}
    </body>
</html>


■ 기본 문법

@{ .... } 블럭으로 표현하는 C# 코드는 C#의 문법을 그대로 준용해서 사용합니다. 변수명이나 클래스 오브젝트가 대소문자를 구분해서 사용하고 문장 끝에 세미콜론(;)을 붙이는 것은 그 이유라 할 수 있습니다. 변수 선언 또한 위의 예제와 같이 C# 처럼 var 키워드를 이용해서 타입을 미리 지정하지 않는 형태를 사용할 수 도 있고, byte, int, short, long, float, double, decimal, String, bool과 같이 데이터 타입을 지정해서 선언할 수도 있습니다. 

@* .... *@ 블럭으로 기술할 수 있는 주석문은(Comment)  @{ .... } 코드 블럭의 내부에서도 HTML코드를 기술하는 블럭 외부에서도 사용할 수 있습니다. 위의 그림은 앞선 예제를 웹브라우저를 통해서 확인한 것으로 "@* 코드 외부 주석 *@"와 "@* 코드내 주석 *@" 모두 주석 처리가 되어서 결과 페이지에는 표시되지 않음을 확인할 수 있습니다. 코드 블럭 내부에서는 C# 문법을 준용하므로 // 나 /* ... */를 통한 주석 처리도 가능합니다.

@{ .... } 코드 블럭 외부에서 변수나 오브젝트를 참조하려면 "@today_str"나 "@Request.ContentLength" 처럼 변수명이나 오브젝트 앞에 @를 붙여서 사용하면 서버의 페이지 제작 과정에 해당하는 값으로 대치시켜 줍니다. PHP에서는 <?=변수명?>으로 ASP에서는 <%=변수명%>으로 사용한 것에 비하면 아주 간단해 졌습니다. 

@{ .... } 코드 블럭 내부에서는 그냥 C# 코드처럼 작성하면 되지만 레이저 문법에서는 코드 블럭 내부에서도 <a> ... </a>처럼 HTML 태그를 시작...끝으로 구분할 수 있거나 "<input ...>"태그처럼 태그 블럭이 명확하다면 "<span>입력 가능 연도 : @max_year</span>"처럼 코드 블럭 내부에서도 HTML 코드를 자연스럽게 작성할 수 있고 태그 블럭 내부에 변수나 오브젝트 참조를 사용할 수 있습니다.  단순 텍스트를 출력하고 싶은 경우에는 "@:테스트 메시지<br/>" 처럼 "@:"를 기술하여 해당 라인의 그 이후를 C#코드가 아니라 HTML 코드로 취급하도록 지시할 수 있습니다. 단순텍스트를 "<text>...</text>"라는 태그 블럭으로 묶어서 코드 블럭 내부에서 단순텍스트를 출력할 수도 있습니다. "<text>...</text>" 태그는 레이저 코드 블럭 내부에서만 의미가 있습니다. 코드 블럭 내부에 HTML 마크업을 자연스럽게 사용할 수 있다는 점은 PHP나 ASP에서는 HTML 마크업을 출력하기 위해서 코드 블럭을 닫고/열기를 반복하면서 소스코드가 지저분해지는 현실을 생각하면 좋은 아이디어라 여겨집니다.

HTML 마크업 사이에 @변수명은 C# 변수나 오브젝트를 참조하는 것으로 취급하는데 "@변수명"이 참조가 아닌 단순 텍스트로 표시 하기 위해서는(Escape) "@@변수명" 처럼 @문자 앞에 @를 하나더 붙여주면 됩니다.


■ 또다른 C# 레이저 코드 블럭

C나 C#에서 세미콜론(;)은 단문, 브레이스{}는 복문을 표현할 때 사용하고 복문을 코드 블럭(Code Block)이라 부릅니다. 레이저 C# 문법에서 코드 블럭을 @{ ... } 사이에 표현하는 것과 C#의 코드 블럭 표현과 연관성을 가집니다. 레이저 C# 문법의 코드 블럭은 단순히  @{ ... }로만 표현하는 것을 넘어서서 "@if (a > 100) { ... }"와 같이 C#에서 코드 블럭을 표현하는 주요 표현식을 그대로 사용할 수 있으며 if, for, foreach, while, switch 등을 들 수 있습니다. 

    <ul>
    @for(var i = 1; i <= 5; i++) {
        <li>@i item </li>
    }
    </ul>

    <ul>
    @foreach (var ri in Request.Cookies) {
        <li>@ri</li>
    }
    </ul>

    <ul>
    @{
        int svcnt = Request.ServerVariables.Count;
    }
    @while (svcnt > 0) {
        svcnt --;
        <li>@Request.ServerVariables[svcnt]</li>
    }
    </ul>

    @if (IsPost) {
        <p>This is POST!</p>
    } else {
        <p>This is GET!</p>
    }

    @switch(DateTime.Now.DayOfWeek.ToString()) {
    case "Sunday":
    case "Saturday":
        <p>주말 입니다!</p>
        break;
    default:
        <p>평일 입니다! @DateTime.Now.DayOfWeek</p>
        break;
    }

위의 예제에서도 살펴 볼 수 있듯이 C#의 문법을 그대로 가져와서 레이저 C# 코드 블럭을 간편하게 작성할 수 있습니다. 단순 코드 블럭을 나타내는 @{의 @와 { 사이에 if, for, foreach, while, switch등의 키워드와 괄호 표현식을 삽입하는 것으로 간편하게 루프나 분기가 필요한 레이저 C# 표현식을 사용할 수 있는 것입니다. 각 코드 블럭 내부 에서의 표현은 기본 코드 블럭 사용법과 동일합니다. 각 키워드의 사용법에 대해서는 C#과 동일하므로 생략합니다. 서버에서 페이지를 작성하는 과정에 파일이 없거나 기타 예외 상황이 발생하면 페이지 오류 또는 서버 에러가 발생할 수 있는데 이런 경우도 C# 처럼 try...catch문을 적용해서 사용자 친화적인 예외 처리를 할 수 있습니다. 예를 들면 Response.Redirect 메소드를 통해서 오류 발생시 직전 화면이나 홈으로 이동시킬 수 있을 것입니다.


■ 페이지 오브젝트

ASP.NET에서는 개발자가 별도로 선언하거나 정의하지 않아도 기본적으로 제공하는 오브젝트들이 있습니다. 앞선 예제에서 사용한 Request, IsPost, Datetime 등이 시스템에서 제공하는 오브젝트의 예 입니다. 

ASP.NET 오브젝트 중의 핵심은 클라이언트에서 올라온 요청 정보를 담고 있는 Request와 내려갈 응답 정보를 담고 있는 Response로 이들을 페이지 오브젝트라(Page Objects) 합니다. 이들 오브젝트의 사용 가능한 속성이나 메소드는 위의 그림처럼 웹매트릭스("무료 웹 개발도구 웹매트릭스 설치하기 - WebMatrix3" 참조)나 비주얼스튜디오의 편집기에서 제공하는 자동 완성 기능의 도움을 받아 편리하게 사용할 수도 있습니다.

Request와 Response외에도 Page, Server, Layout, IsPost 등의 속성을 사용할 수 있으며 href, RenderBody, RenderPage, RenderSection, Write, WriteLiteral 등의 메소드를 활용할 수 있습니다. 상세한 설명은 아래와 같은 MSDN 페이지를 참조하세요.


■ 데이터 형 변환

웹 클라이언트와 서버간의 데이터 송수신은 대부분이 문자열입니다. 숫자를 입력 받는 항목에서 사용자가 숫자를 입력했더라도 바이너리(Binary) 값이 아니라 0~9로 구성된 숫자값이 전송되는 것입니다. 그러므로 서버에서의 데이터 조작은 대부분 문자열 처리 과정으로 이루어지지만 숫자 값에 대한 연산이 필용한 경우 적절한 형변환이 필요합니다. 0~9로 구성된 숫자값을 이진값(Binary)으로 변환해야 하는데 원래의 C#에서는 TryParse를 사용하거나 try...catch로 ToInt16나 Parse와 같은 형변환 과정의 예외를 처리해 주었습니다. 안전하게 처리하려면 조금 복잡했었습니다. 

그러나, 레이저에서는 문자열에 대해서 IsInt(), IsBool(), IsFloat(), IsDecimal(), IsDateTime()과 같은 메소드를 사용해서 문자열의 데이터형을 사전에 검증할 수 있고 AsInt(), AsBool(), AsFloat(), AsDecimal(), AsDateTime() 메소드로 문자열을 원하는 데이터 형으로 간편하게 변환할 수 있습니다. 물론 각 데이터 형을 ToString()을 사용하여 문자열로 변환할 수 있습니다.


댓글
댓글쓰기 폼
«   2022/12   »
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 31
글 보관함