나가실 문은 오른쪽 하단입니다
전편에서 언급한 내용의 과정 중에 중요한 부분인 .cshtml을 .cs로 변환하는 것은 파싱 작업이다.
파싱 코드를 작성하기 위해서는 일단 그 대상에 대하여 주의 깊게 관찰해야 할 필요가 있다.
저자는 cshtml의 razor에 대한 경험이 없으므로 간단히 몇 가지 문법에 대해서 알아보았다.
일단 구현에 당장 필요할 것 같은 부분을 3가지로 구분 지었다.
- 인라인 표현식
- 코드 블록
- 코드 블록을 가지고 있는 예약어 (for, if, while...)
1. 인라인 표현식
오류가 나는 구문의 유무를 짝수와 홀수로 구분 지었다. (str은 문자열 상수이다)
전체적으로 @로 시작을 했으나, @로 끝나지 않기에 파싱 하기가 까다롭다.
//1의 경우는 .??? 가 html 영역으로 판정이 되지만
//2의 경우는 변수가 될 수 있는 문자열이 있으므로 해당 속성이나 메서드가 없으면 오류가 난다.
//3의 경우는 변수가 될수 없는 문자열이 있으므로 .###이 html이 되고
//4의 경우는 Null conditional operator가 되므로 뒤에 있는 것이 오류가 나고
//5의 경우는 언뜻 Null-coalescing operator가 될 것 같지만, 실상은 str+"??ss" 가 된다. 연산자로 활용을 하기 위해서는 @(str??"ss") 처럼 괄호로 묶어 줘야 한다.
//6의 경우는 함수 호출의 형태가 되므로 오류가 난다. (인덱스로 요소에 접근할 수 없는 타입이라면 [] 도 마찬가지)
정리를 하자면
괄호로 묶여있지 않는 인라인 표현에 ( , . , ?. , [가 포함되었을 때는 객체의 타입에 따라서 특별한 처리 로직이 필요하다.
2. 코드 블록
다른 서버 페이지를 경험했다면 매우 직관적으로 비슷함을 느낄 수 있다.
블록 안의 요소가 C#의 구문이 되고 다시 @가 다시 들어가면 위에서 설명한 인라인 표현식이 된다.
그리고 < (꺽쇠 기호)로 시작하는 태그 형식을 만나면 다시 html영역으로 판정됨을 알 수 있다.
이 것의 아이디어는 React.js의 jsx를 차용한 것에 틀림이 없는 것 같다는 느낌을 준다.
JSP에서는 저런 식으로 표현을 하려면 코드 영역을 닫았다가 열었다가를 반복을 해야 하는데, 그에 비해 저런 방식은 파싱 로직은 다소 복잡해지나 페이지를 작성하는 입장에서는 매우 간결하고 보기 좋은 형태가 된다.
관련된 파싱 로직에 대해서는 예전에 작성한 글이 있으므로 자세한 내용은 생략한다.
2021.11.24 - [React] - JSX TO JS 변환 구현
참고로 코드 블록 안에서 또 다른 코드 블록은 오류가 난다.
3. 코드 블록을 가지고 있는 예약어
제목에서 이미 모든 것을 설명하고 있다.
위에서 이미 언급한 내용의 규칙들이 적용됨을 쉽사리 유추할 수 있다.
html의 텍스트 엘리먼트 바로 옆에 @이를 붙일 경우 인라인 표현식으로 판별되지 않는다
위 내용에서 안녕0 을 의도하여도 안녕@i 가 출력된다.
인라인 표현식이 그런 경우에도 우선순위를 가지게 하려면 @(i) 처럼 괄호로 엮어줘야 한다.
참고로 2에서 언급할 내용이긴 한데, 여기서 적을 게 없어서 이곳으로 했다.
4. 그 밖의 ETC
- 다른 페이지를 include 하는 특별한 태그. (Partial)
- 부모 페이지를 상속하는 기능 (Layout)
- 사전에 예약이 되어 있는 특별한 변수의 사용. (ViewModel, ViewData ViewBag, TempData)
외 에도 여러가지 기능이 있으나, 꼭 필요하다고 생각되는 기능만 만들 예정이다.
사실 먼저 언급한 3가지만 하더라도... 혼자서 하기에는 조금 벅차다.
그렇다.
클라우디아 같은 ... 조력자가 있었으면 좋겠다.
'C# > 근웹 연대기' 카테고리의 다른 글
c#으로 근본 없는 웹서버 개발기 20 : cshtml layout (이론) (0) | 2022.01.11 |
---|---|
c#으로 근본 없는 웹서버 개발기 19 : cshtml 파리미터 분석(이론) (0) | 2022.01.09 |
c#으로 근본 없는 웹서버 개발기 17 : 서버페이지 렌더링 계획 (0) | 2022.01.07 |
c#으로 근본 없는 웹서버 개발기 16 : node express? (2) | 2022.01.05 |
c#으로 근본 없는 웹서버 개발기 15 : multipart/form-data 파일전송 (0) | 2021.12.27 |