Kori 9월 16일, 2025에 포스트됨 9월 16일, 2025에 포스트됨 Antonio Zapater의 "WebStencils: What’s New in RAD Studio 13.0 Florence" 을 번역했습니다. (원문 작성: 2025년 9월, 최종 번역: 2025년 9월) 이것은 Delphi(델파이) 6 이후 WebBroker(웹브로커)에 반영된 가장 신나는 웹 업데이트라고 생각된다. RAD Studio (라드 스튜디오) 13.0 Florence(플로렌스)에 담긴 WebStencils(웹스텐실즈) 향상들은 무척 크다. 그래서 2.0 버전이라고 부르고 싶을 정도다. 여러분이 만약 RAD Studio(라드 스튜디오)의 WebStencils 템플릿 엔진을 사용해 웹 애플리케이션을 개발해 본 적이 있다면, 이번 릴리스에 포함된 기능들을 좋아할 것이다. 우리는 커뮤니티의 피드백을 반영했다. 그래서 웹 개발을 Delphi와 C++Builder(C++빌더)를 사용해 그 어느 때보다 생산적이고 즐겁게 해 줄 기능들을 추가했다. 목차 WebStencils란 무엇인가? 주요 새 기능들 완벽한 세션 관리(Session Management) 및 인증(Authentication) 데이터베이스-주도식 UI 생성 보안 기능 내장 @switch 연산자(operator) 맞춤식(Custom) 데이터 액세스 추가 개선 사항들 실제로 보기 테스트할 준비가 되었다면? WebStencils란 무엇인가? 아직 들어보지 못한 분들을 위해 설명하자면, WebStencils는 Embarcadero(엠바카데로)의 템플릿 엔진이다. 이 엔진은 WebBroker와 RAD Server (라드 서버) 모두에서 작동한다. 그래서 동적 웹 애플리케이션을 구축할 때, 여러분에게 익숙한 Delphi 또는 C++ 언어를 사용하면서 HTML 템플릿들을 활용할 수 있다. 이것의 핵심은 단순함이다: 여러분은 서버-측 렌더링(rendering)이라는 강력한 기능을 활용할 수 있다. 전혀 새로운 프레임워크를 배우지 않고도 말이다. 주요 새 기능들 완벽한 세션 관리(Session Management) 및 인증(Authentication) 이전에 게시한 미리보기 기고에서 설명했듯이, 이것은 커뮤니티가 가장 많이 요청했었던 기능이다. 이 RAD Studio 13.0은 완벽한 세션 및 인증 시스템을 제공한다. 제품 안에서 바로 사용할 수 있는 이 세 가지 컴포넌트가 들어있기 때문이다: 새 컴포넌트들: TWebSessionManager - 세션(session)의 생명주기(lifecycle)를 관리한다. 옵션들을 설정하면 된다. TWebFormsAuthenticator - HTML 폼-기반(form-based) 인증을 담당한다. 자동 리디렉션 기능을 갖추고 있다. TWebAuthorizer - 역할-기반으로(role-based) 접근 통제를 한다. 권한 부여 구역(authorization zones)을 활용한다. 매우 간단하게 설정(setup) 이 세 가지 컴포넌트를 WebModule(웹모듈) 안에 추가하면, 여러분은 모든 웹사이트 보안을 관리할 수 있다. 코드를 작성할 필요는 거의 없다. 인증(authentication) 흐름은 간단하다. 인증되지 않은 요청(request) ➜ LoginURL로 리디렉션 사용자가 자격 증명을 POST하면 ➜ OnAuthenticate 이벤트가 유효성을 검사 성공 ➜ 원래 URL 또는 HomeURL로 리디렉션 실패 ➜ FailedURL로 리디렉션 세션 데이터들은 자동으로 템플릿 안에서 사용할 수 있게 된다. @session 오브젝트를 사용하면 된다: @if session.Authenticated { <div>Welcome back, @session.UserName!</div> } @if session.UserHasRole('admin') { <a href="/admin">Admin Panel</a> } TWebSessionManager를 사용하면 여러분이 완전하게 통제할 수 있다. Session ID Storage(세션 ID 저장소😞 쿠키(기본값)들, 헤더들, 쿼리 파라미터(query parameter)들 Session Scope(세션 범위😞 요청당, 사용자당, "사용자+IP"당 Security(보안😞 사용자 범위 세션(user-scoped session)용 공유 secret이 내장되어 있다 Timeout(시간 초과😞 만료 시간을 설정할 수 있다 (기본값: 1시간) 역할 기반(role-based)인 권한 부여 구역(authorization zones)도 매우 단순하다. // admin 구역 보호 - 오직 'admin' 역할(role)을 가진 사용자만 /admin/*에 접근 가능 Zone.PathInfo := '/admin*'; Zone.Kind := zkProtected; Zone.Roles := 'admin'; 데이터베이스-주도식 UI 생성 이 기능은 여러분이 웹 폼(web form)을 작성하는 방식을 근본적으로 바꿔준다. 이제 WebStencils에서 데이터셋의 프로퍼티(property)들과 필드(field) 메타데이터에 액세스할 수 있다. 따라서, 여러분의 데이터베이스 스키마가 UI를 생성해 낸다. <!-- 동적인 폼: 모든 데이터셋에 적용 --> @foreach field in customers.fields { <div class="form-group"> <label>@field.DisplayLabel</label> @switch(field.dataType) { @case "ftString" { <input type="text" name="@field.FieldName" maxlength="@field.Size" class="form-control"> } @case "ftInteger" { <input type="number" name="@field.FieldName" class="form-control"> } @case "ftDate" { <input type="date" name="@field.FieldName" class="form-control"> } } </div> } 여러분이 어느 필드의 Visible 프로퍼티를 FireDAC(파이어닥)의 Field Editor(필드 에디터)에서 변경하면, 여러분의 웹 폼 안에 자동으로 반영되는 것을 상상해 보자. 그렇게 된다. 보안 기능 내장 새 보안 허용 목록 체계(whitelist system)가 생겼다. 그래서 민감한 데이터에 대한 우발적인 노출을 방지할 수 있다. 기본적으로 TStrings와 TDataset 클래스에 대해 일반적인(common) 안전한 프로퍼티들은 허용 목록에 이미 포함되어 있다. 하지만, 여러분은 프로젝트 요구 사항에 따라 쉽게 사용자 지정할 수도 있다. // 사용자 정의 프로퍼티를 허용 목록(whitelist)에 넣기 TWebStencilsProcessor.Whitelist.Configure(TMyClass,['SafeProperty'], nil, False); // 특정 프로퍼티를 차단하기 TWebStencilsProcessor.Whitelist.Configure(TDataSet, nil, ['ConnectionString'], False); @switch 연산자(operator) 새 @switch 연산자는 조건부 렌더링을 더욱 깔끔하게 만들어 준다. 그래서 복잡한 중첩 @if 문을 피할 수 있다. @switch(user.role) { @case "admin" { <div class="admin-panel"> <h2>Admin Dashboard</h2> </div> } @case "moderator" { <div class="mod-tools"> <h2>Moderator Tools</h2> </div> } @default { <div class="user-content"> <h2>Welcome, User!</h2> </div> } } 맞춤식(Custom) 데이터 액세스 익명 메서드(anonymous method)를 사용해 사용자 정의 변수를 추가할 수 있다. 적응성이 향상된다. // 사용자 정의 변수 추가하기: 단순한 딕셔너리 하나를 활용 type TMap = TDictionary<string, string>; ... LDict := TMap.Create; LDict.Add('APP_VERSION', '1.0.0'); LDict.Add('DEBUG_MODE', 'True'); WebStencilsEngine.AddVar('env', LDict, True, function(AVar: TWebStencilsDataVar; const APropName: string; var AValue: string): Boolean begin Result := TMap(AVar.TheObject).TryGetValue(APropName.ToUpper, AValue); end); 그러면, 이제 템플릿 안에서 활용할 수 있다. 예시 코드: <h1>@env.APP_NAME - @env.APP_VERSION</h1> @if env.DEBUG_MODE { <div class="alert-warning">Debug mode is active</div> } 추가 개선 사항들 배치 체계(Layout System)가 향상됨: 중첩 적용이 되는 @ExtraHeader가 지원됨. 복잡한 레이아웃 계층 구조에서 활용 @page 오브젝트가 향상됨: request_path와 request_segment 접근. URL 다루기가 더 좋아짐 Docker(도커) 지원: 사용 가능한 컨테이너화. 자동 데이터베이스 초기화를 갖추고 있음 실제로 보기 업데이트된 WebStencilsDemos 저장소에서 이 업데이트된 기능들을 직접 볼 수 있다: 역할-기반 탐색(navigation) 기능을 갖춘 완벽한 인증 체계 데이터베이스 메타데이터를 기반으로 동적으로 폼을 생성하기 세션-기반으로 알맞게 일시 메시지(flash message)를 제공하기 고급 검색 및 페이지 나누기를 FireDAC을 사용해 구현하기 Delphi와 C++Builder 예시 이 데모는 SQLite와 인-메모리(in-memory) 데이터 소스를 가지고 작동한다. 그래서 WebStencils가 다양한 스토리지 전략에서 널리 활용될 수 있음을 보여준다. GitHub 저장소 바로 가기 테스트할 준비가 되었다면? 새 기능들은 어렵지 않게 배울 수 있다. 또한 여러분이 가진 기존 WebStencils 템플릿들은 변경 없이 작동한다. 따라서, 여러분의 상황에 맞춰 알맞은 속도로 도입하면 된다. 도입하면 즉시 자동 세션 통합과 보안 개선의 이점을 누릴 수 있다. RAD Studio 13.0 Florence(Delphi 또는 C++Builder)를 시작하고, WebStencilsDemos 저장소를 복제고, 그 예시들을 살펴보기 바란다. 여러분이 이 새 기능들을 가지고 무엇을 만들어낼지 기대된다. 질문이나 의견이 있다면? GitHub Issues 섹션을 통해 문의하면 된다. 이 깃허브 저장소에 별표를 하고, 의견을 남겨주세요! 인용하기
Recommended Posts
이 토의에 참여하세요
지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.