Jump to content
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr ×
과거의 기술자료(읽기 전용): https://tech.devgear.co.kr

Recommended Posts

에 포스트됨

Antonio Zapater"WebStencils: What’s New in RAD Studio 13.0 Florence" 을 번역했습니다. (원문 작성: 2025년 9월, 최종 번역: 2025년 9월)

WebStencils-13-5673840.jpg?ssl=1

이것은 Delphi(델파이) 6 이후 WebBroker(웹브로커)에 반영된 가장 신나는 웹 업데이트라고 생각된다. RAD Studio (라드 스튜디오) 13.0 Florence(플로렌스)에 담긴 WebStencils(웹스텐실즈) 향상들은 무척 크다. 그래서 2.0 버전이라고 부르고 싶을 정도다.

여러분이 만약 RAD Studio(라드 스튜디오)의 WebStencils 템플릿 엔진을 사용해 웹 애플리케이션을 개발해 본 적이 있다면, 이번 릴리스에 포함된 기능들을 좋아할 것이다. 우리는 커뮤니티의 피드백을 반영했다. 그래서 웹 개발을 Delphi와 C++Builder(C++빌더)를 사용해 그 어느 때보다 생산적이고 즐겁게 해 줄 기능들을 추가했다.

목차


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) 흐름은 간단하다.

  1. 인증되지 않은 요청(request) ➜ LoginURL로 리디렉션
  2. 사용자가 자격 증명을 POST하면 ➜ OnAuthenticate 이벤트가 유효성을 검사
  3. 성공 ➜ 원래 URL 또는 HomeURL로 리디렉션
  4. 실패 ➜ 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)가 생겼다. 그래서 민감한 데이터에 대한 우발적인 노출을 방지할 수 있다. 기본적으로 TStringsTDataset 클래스에 대해 일반적인(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 섹션을 통해 문의하면 된다. 이 깃허브 저장소에 별표를 하고, 의견을 남겨주세요!
 

이 토의에 참여하세요

지금 바로 의견을 남길 수 있습니다. 그리고 나서 가입해도 됩니다. 이미 회원이라면, 지금 로그인하고 본인 계정으로 의견을 남기세요.

Guest
이 토픽(기고/질문)에 답하기

×   서식있는 텍스트로 붙여넣기.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   이전에 작성한 콘텐츠가 복원되었습니다..   편집창 비우기

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

중요한 정보

이용약관 개인정보보호정책 이용규칙 이 사이트가 더 잘 작동하기 위해 방문자의 컴퓨터에 쿠키가 배치됩니다. 쿠키 설정 변경에서 원하는 설정을 할 수 있습니다. 변경하지 않으면 쿠키를 허용하는 것으로 이해합니다.