다음을 통해 공유


T4 텍스트 템플릿 작성 지침

이러한 일반적인 지침은 Visual Studio에서 프로그램 코드나 다른 응용 프로그램 리소스를 생성하는 경우 유용할 수 있습니다. 이 지침은 고정된 규칙이 아닙니다.

디자인 타임 T4 템플릿 지침

디자인 타임 T4 템플릿은 디자인 타임에 Visual Studio 프로젝트에서 코드를 생성하는 템플릿입니다. 자세한 내용은 T4 텍스트 템플릿을 사용하여 디자인 타임 코드 생성을 참조하십시오.

  • 응용 프로그램의 가변 측면을 생성합니다.
    코드 생성은 프로젝트 중에 변경되거나 응용 프로그램 버전 간에 변경될 응용 프로그램의 측면에 가장 유용합니다. 생성해야 할 것을 더욱 쉽게 확인할 수 있도록 이러한 가변 측면을 보다 고정적인 측면과 구분하십시오. 예를 들어, 응용 프로그램에서 웹 사이트를 제공하는 경우 기능을 제공하는 표준 페이지를 페이지 간 탐색 경로를 정의하는 논리와 구분합니다.

  • 하나 이상의 소스 모델에 가변 측면을 인코딩합니다.
    모델은 생성할 코드의 가변 부분에 대한 특정 값을 얻기 위해 각 템플릿에서 읽는 파일이나 데이터베이스입니다. 모델은 데이터베이스, 사용자가 디자인한 XML 파일, 다이어그램 또는 도메인별 언어일 수 있습니다. 일반적으로 Visual Studio 프로젝트에서는 한 모델을 사용하여 많은 파일을 생성하며, 각 파일은 별도의 템플릿에서 생성됩니다.

    프로젝트에서 두 개 이상의 모델을 사용할 수 있습니다. 예를 들어, 웹 페이지 간 탐색을 위한 모델을 정의하고 페이지의 레이아웃을 위한 별도의 모델을 정의할 수 있습니다.

  • 모델의 구현에 집중하는 대신 사용자의 요구 사항과 용어에 중점을 둡니다.
    예를 들어 웹 사이트 응용 프로그램에서는 모델이 웹 페이지와 하이퍼링크를 참조해야 합니다.

    모델이 나타내는 정보의 종류에 적합한 표현 형식을 선택하는 것이 가장 좋습니다. 예를 들어, 웹 사이트에 대한 탐색 경로의 모델은 상자와 화살표로 구성된 다이어그램일 수 있습니다.

  • 생성된 코드를 테스트합니다.
    수동 테스트 또는 자동화된 테스트를 사용하여 결과 코드가 사용자의 요구에 맞게 작동하는지 확인합니다. 코드가 생성된 모델과 동일한 모델에서 테스트를 생성하지 마십시오.

    경우에 따라 모델을 대상으로 일반 테스트를 직접 수행할 수 있습니다. 예를 들어, 페이지 간 탐색을 통해 웹 사이트의 모든 페이지에 도달할 수 있는지를 확인하는 테스트를 작성할 수 있습니다.

  • 사용자 지정 코드 허용: partial 클래스를 생성합니다.
    생성된 코드 외에 직접 작성하는 코드를 허용합니다. 발생할 수 있는 가능한 모든 변형을 코드 생성 체계에서 담당하는 경우는 드물기 때문에 생성된 코드에 추가하거나 생성된 코드의 일부를 재정의해야 합니다. 생성된 항목이 Visual C# 또는 Visual Basic과 같은 .NET 언어로 되어 있는 경우 다음 두 가지 전략이 특히 유용합니다.

    • 생성된 클래스가 partial 클래스여야 합니다. 이 경우 생성된 코드에 콘텐츠를 추가할 수 있습니다.

    • 클래스가 쌍으로 생성되어야 합니다. 이때 한 클래스는 다른 클래스에서 상속합니다. 기본 클래스는 생성된 메서드 및 속성을 모두 포함해야 하며 파생 클래스는 생성자만 포함해야 합니다. 이렇게 하면 생성된 메서드를 직접 작성된 코드에서 재정의할 수 있습니다.

    XML과 같은 다른 생성된 언어에서는 <#@include#> 지시문을 사용하여 직접 작성된 콘텐츠와 생성된 콘텐츠의 간단한 조합을 만듭니다. 더욱 복잡한 경우에는 생성된 파일과 직접 작성된 파일을 결합하는 후처리 단계를 작성해야 할 수도 있습니다.

  • 공통 자료를 포함 파일 또는 런타임 템플릿으로 이동합니다.
    여러 템플릿에서 비슷한 코드 및 텍스트 블록을 반복하지 않으려면 <#@ include #> 지시문을 사용합니다. 자세한 내용은 T4 Include 지시문을 참조하십시오.

    별도의 프로젝트에서 런타임 텍스트 템플릿을 빌드한 다음 디자인 타임 템플릿에서 해당 템플릿을 호출할 수도 있습니다. 이렇게 하려면 <#@ assembly #> 지시문을 사용하여 별도의 프로젝트에 액세스해야 합니다. 예제를 보려면 Gareth Jones 블로그의 "Inheritance in Text Templates"를 참조하십시오.

  • 대규모 코드 블록을 별도의 어셈블리로 이동하십시오.
    대규모 코드 블록 및 클래스 기능 블록이 있는 경우 이 코드 중 일부를 별도의 프로젝트에서 컴파일하는 메서드로 이동하는 것이 유용할 수 있습니다. <#@ assembly #> 지시문을 사용하여 템플릿의 코드에 액세스할 수 있습니다. 자세한 내용은 T4 Assembly 지시문을 참조하십시오.

    템플릿에서 상속할 수 있는 추상 클래스에 메서드를 둘 수 있습니다. 추상 클래스는 TextTransformation에서 상속해야 합니다. 자세한 내용은 T4 템플릿 지시문을 참조하십시오.

  • 구성 파일이 아닌 코드를 생성합니다.
    가변 응용 프로그램을 작성하는 한 가지 방법은 구성 파일을 받아들이는 제네릭 프로그램 코드를 작성하는 것입니다. 이러한 방식으로 작성된 응용 프로그램은 융통성이 매우 크며 비즈니스 요구 사항이 변경될 때 응용 프로그램을 다시 빌드하지 않고 다시 구성할 수 있습니다. 그러나 이 방법의 단점은 응용 프로그램의 성능이 더욱 구체적인 응용 프로그램의 성능보다 낮다는 것입니다. 또한 항상 제네릭 형식을 다루어야 하기 때문에 프로그램 코드를 읽고 유지 관리하기가 더 어렵습니다.

    이와 대조적으로 가변 부분이 컴파일 전에 생성되는 응용 프로그램은 강력하게 형식화될 수 있습니다. 이에 따라 직접 작성된 코드를 훨씬 쉽고 더욱 안정적으로 작성하고 소프트웨어의 생성된 부분과 통합할 수 있습니다.

    코드 생성의 모든 이점을 얻으려면 구성 파일 대신 프로그램 코드를 생성해 봅니다.

  • 생성된 코드 폴더 사용
    템플릿과 생성된 파일을 Generated Code라는 프로젝트 폴더에 넣어서 직접 편집해야 할 파일이 아니라는 것을 명확히 해야 합니다. 생성된 클래스를 재정의하거나 생성된 클래스에 추가하기 위해 사용자 지정 코드를 만드는 경우 해당 클래스를 Custom Code라는 폴더에 넣습니다. 일반적인 프로젝트의 구조는 다음과 같습니다.

    MyProject
       Custom Code
          Class1.cs
          Class2.cs
       Generated Code
          Class1.tt
              Class1.cs
          Class2.tt
              Class2.cs
       AnotherClass.cs
    
    

전처리된 디자인 타임 T4 템플릿 지침

  • 공통 자료를 상속된 템플릿으로 이동합니다.
    상속을 사용하여 T4 텍스트 템플릿 간에 메서드와 텍스트 블록을 공유할 수 있습니다. 자세한 내용은 T4 템플릿 지시문을 참조하십시오.

    런타임 템플릿이 있는 포함 파일을 사용할 수도 있습니다.

  • 많은 양의 코드 본문을 partial 클래스로 이동합니다.
    각 런타임 템플릿에서는 템플릿과 이름이 동일한 partial 클래스 정의를 생성합니다. 같은 클래스의 다른 부분 정의가 포함된 코드 파일을 작성할 수 있습니다. 이러한 방식으로 메서드, 필드 및 생성자를 클래스에 추가할 수 있습니다. 이러한 멤버는 템플릿의 코드 블록에서 호출할 수 있습니다.

    그러면 IntelliSense를 사용할 수 있기 때문에 코드를 쉽게 작성할 수 있습니다. 또한 프레젠테이션 논리와 기본 논리 간에 더 잘 구분할 수 있습니다.

    예를 들어 MyReportText.tt의 경우

    The total is: <#= ComputeTotal() #>

    MyReportText-Methods.cs의 경우

    private string ComputeTotal() { ... }

  • 사용자 지정 코드 허용: 확장 지점을 제공합니다.
    <#+ class feature blocks #>에서 가상 메서드를 생성하십시오. 그러면 많은 컨텍스트에서 단일 템플릿을 수정하지 않고 사용할 수 있습니다. 템플릿을 수정하는 대신 최소한의 추가 논리를 제공하는 파생 클래스를 생성할 수 있습니다. 파생 클래스는 일반 코드이거나 런타임 템플릿일 수 있습니다.

    예를 들어 MyStandardRunTimeTemplate.tt의 경우

    This page is copyright <#= CompanyName() #>.
    <#+ protected virtual string CompanyName() { return ""; } #>
    

    응용 프로그램 코드의 경우

    class FabrikamTemplate : MyStandardRunTimeTemplate
    {
      protected override string CompanyName() { return "Fabrikam"; }
    }
    ...
      string PageToDisplay = new FabrikamTemplate().TextTransform();
    

모든 T4 템플릿 지침

  • 텍스트 생성에서 데이터 수집을 분리합니다.
    계산과 텍스트 블록을 조합하지 마십시오. 각 텍스트 템플릿에서 첫 번째 <# code block #>을 사용하여 변수를 설정하고 복잡한 계산을 수행하십시오. 첫 번째 블록에서 템플릿의 마지막까지 또는 첫 번째 <#+ class feature block #>에서는 긴 식을 사용하지 말고, 텍스트 블록이 포함되어 있는 경우를 제외하고는 루프와 조건을 사용하지 마십시오. 그러면 템플릿을 더 쉽게 읽고 유지 관리할 수 있습니다.

  • 포함 파일에 .tt를 사용하지 않습니다.
    포함 파일에는 .ttinclude와 같은 다른 파일 확장명을 사용하십시오. 런타임 또는 디자인 타임 텍스트 템플릿으로 처리할 파일에만 .tt를 사용하십시오. Visual Studio에서 .tt 파일을 인식하고 처리할 해당 속성을 자동으로 설정하는 경우도 있습니다.

  • 각 템플릿을 고정된 프로토타입으로 시작합니다.
    생성할 코드 또는 텍스트 예제를 작성하고 제대로 작동하는지 확인한 다음 코드의 확장명을 .tt로 변경하고 모델을 읽어 콘텐츠를 수정하는 코드를 증분적으로 삽입합니다.

  • 입력된 모델을 사용하십시오.
    모델에 대한 XML 또는 데이터베이스 스키마를 만들 수는 있지만 DSL(도메인별 언어)을 만드는 것이 유용할 수 있습니다. DSL에서는 스키마의 각 노드를 나타내는 클래스와 특성을 나타내는 속성을 생성한다는 장점이 있습니다. 즉, 비즈니스 모델을 기준으로 프로그래밍할 수 있습니다. 예를 들면 다음과 같습니다.

    Team Members:
    <# foreach (Person p in team.Members) 
     { #> 
        <#= p.Name #> 
    <# } #>
    
  • 모델에 대한 다이어그램을 사용하십시오.
    대다수 모델은 특히 매우 큰 경우에 가장 효과적으로 텍스트 테이블로 표시하고 관리할 수 있습니다.

    그러나 몇몇 종류의 비즈니스 요구 사항의 경우에는 복잡한 관계 및 워크플로 집합을 명확하게 나타내는 것이 중요하고 다이어그램을 사용하는 것이 가장 적합한 방법입니다. 다이어그램을 사용하면 사용자 및 기타 관련자와 쉽게 논의할 수 있다는 이점이 있습니다. 비즈니스 요구 사항 수준의 모델에서 코드를 생성하여 요구 사항이 변경되는 경우 코드의 융통성을 높이십시오.

    UML 클래스와 동작 다이어그램을 이러한 목적에 맞게 수정할 수 있는 경우가 많습니다. 고유 형식의 다이어그램을 DSL(도메인별 언어)로 디자인할 수도 있습니다. 코드는 UML과 DSL에서 생성될 수 있습니다. 자세한 내용은 응용 프로그램 모델링응용 프로그램 모델링를 참조하십시오.

참고 항목

개념

T4 텍스트 템플릿을 사용하여 디자인 타임 코드 생성

T4 텍스트 템플릿을 사용하여 런타임 텍스트 생성