Visual Studio 및 T4(Text Template Transformation Toolkit)를 사용하여 코드 자동 생성

페이지 업데이트 :
페이지 생성 날짜 :

운영 환경

비주얼 스튜디오
  • 비주얼 스튜디오 2022
.그물
  • .NET 8.0
윈도우
  • 윈도우 11

필수 구성 요소

비주얼 스튜디오
  • 다소 오래된 버전에서도 작동합니다
.그물
  • 다소 오래된 버전에서도 작동합니다

처음에

일반적으로 코드를 작성할 때는 수동으로 문자를 입력하여 코드를 만든다고 생각하지만, 특정 법칙에 의해 생성해야 하는 코드나 데이터를 기반으로 코드를 작성하려는 경우에는 자동으로 생성할 수 있는 것이 편리합니다. 이 섹션에서는 T4(Text Template Transformation Toolkit)를 사용하여 코드를 자동으로 생성하는 방법에 대해 설명합니다.

T4는 스크립팅 형식이므로 T4 파일을 만든 직후 Visual Studio에서 코드를 생성하기가 매우 쉽습니다. 코드를 자동으로 생성한다고 쓰여 있지만 생성되는 것은 텍스트일 뿐이므로 프로그램 외에도 XML, JSON 등 텍스트 형식으로 무엇이든 생성할 수 있습니다.

이 팁의 주요 목적은 T4에서 실제로 코드를 자동으로 생성하는 단계를 설명하는 것이므로 T4에 대해 자세히 설명하지는 않겠습니다. C#으로 프로그램을 작성해 본 적이 있다면 바로 이해할 수 있을 것입니다. T4에 대해 더 자세히 알고 싶으시면 공식 홈페이지 및 기타 사이트를 확인해주세요.

전제 조건

이 팁에서는 다음을 가정합니다.

  • Windows에 설치된 Visual Studio
  • C#에 대한 이해

T4는 몇 가지를 제외한 대부분의 프로젝트에서 사용할 수 있으므로 기본적으로 설치 중에 작업 부하를 자유롭게 선택할 수 있습니다.

프로젝트 만들기

앞서 언급했듯이 T4는 몇 가지를 제외한 대부분의 프로젝트에서 사용할 수 있으므로 어떤 유형의 프로젝트를 생성하든 상관 없습니다. 이 경우 콘솔 앱용 프로젝트를 만들고 있습니다.

T4 파일(.tt) 만들기

프로젝트 파일 또는 폴더를 마우스 오른쪽 단추로 클릭하여 새 항목을 추가합니다.

모든 템플릿 보기 버튼을 클릭합니다.

왼쪽 트리에서 "일반"을 선택하고 가운데 목록에서 "텍스트 템플릿"을 선택합니다. 파일 이름은 임의입니다.

파일을 만든 직후 아래와 유사한 대화 상자가 나타날 수 있습니다. T4 파일이 자동으로 생성될 때 표시됩니다. T4 파일은 파일을 저장하거나 볼 때마다 자동으로 생성됩니다. 자동 생성 처리를 그대로 수행하려면 "OK"버튼을 클릭하십시오. 대화 상자가 매번 나타나지 않도록 하려면 "이 메시지를 다시 표시하지 않음"을 선택하십시오. 대화 상자에 명시된 대로 T4 파일에 불법 프로세스가 설명되어 있으면 그에 따라 실행됩니다.

파일을 추가한 후 .tt 파일이 솔루션 탐색기에 추가된 것을 볼 수 있습니다.

파일의 내용은 다음과 같습니다.

솔루션 탐색기에서 .tt 파일을 추출하면 같은 이름의 텍스트 파일이 표시됩니다. 이 파일은 자동 생성됩니다. 아직 아무것도 작성하지 않았기 때문에 파일의 내용은 비어 있습니다.

자동 생성된 파일을 .cs 파일로 만들기

T4를 사용하는 경우 프로그램 코드가 자동으로 생성되므로 기본 .txt 대신 .cs 확장을 사용하는 것이 좋습니다. 이 경우 .tt 파일을 output extension .cs 열고 .

이제 자동 생성된 파일의 확장자가 .cs되어야 합니다. 파일 이름 자체는 .tt 파일과 같으므로 변경하려면 .tt 파일의 이름을 변경합니다.

우선은 뭔가를 써서 자동으로 생성된 파일에 출력한다

T4에서는 작성한 내용이 기본적으로 그대로 출력됩니다. <# ... #> 는 T4 프로세스이고 나머지는 실제 출력 텍스트입니다.

예를 들어 다음과 같이 .tt 파일에 넣어 보겠습니다.

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>

public static class Sample
{
  public static void Hello()
  {
    Console.WriteLine("Hello T4!!");
  }
}

파일을 저장하면 자동 생성된 파일이 작성한 그대로 정확하게 출력되어야 합니다.

출력은 코드이므로 물론 Program.cs에서도 호출 할 수 있습니다.

자동으로 코드 생성 시도

위에서 언급했듯이 내가 쓴 것이 그대로 출력되는 것을 확인했습니다 만, 이것은 일반적으로 쓴 것과 다르지 않습니다. 이제 실제로 T4 스크립트를 사용하여 코드를 자동으로 생성해 보겠습니다. 만드는 방법은 매우 다양하니 여기에서는 간단한 설명만 해주시고, 그 후 만들고 싶은 대로 다시 만들어 주세요.

이번에는 예를 들어 각 타입의 parse 메소드를 문자열에 추가하고, 변환할 수 없는 경우 지정된 기본값을 반환 ParseXXXX 하는 메소드를 만들어 보겠습니다. 이것은 어디까지나 창작의 예일 뿐이므로, 부족한 부분이 있다고 생각되는 경우에는 추가해 주세요.

자세한 설명을 하지 않아도 C#을 이해할 수 있다면 더 빨리 볼 수 있기 때문에 먼저 전체 코드를 게시하겠습니다.

<#@ template debug="false" hostspecific="false" language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>
<#@ import namespace="System.Text" #>
<#@ import namespace="System.Collections.Generic" #>
<#@ output extension=".cs" #>

<#
  List<string> types = new(){"Int", "Short", "Long", "Float", "Double", "Decimal"}; 
#>

public static class ParseExtensions
{
<# foreach (var type in types) { #>
<#   var typeLower = type.ToLower(); #>
  public static <#= typeLower #> Parse<#= type #>(this string self, <#= typeLower #> defaultValue)
  {
    return <#= typeLower #>.TryParse(self, out var val) ? val : defaultValue;
  }
<# } #>
}

우리가하고있는 일은 처음으로 만들 유형을 List 정의 한 다음 해당 수의 메소드를 생성하기 위해 변환하는 foreach 것입니다. T4의 스크립트 부분은 C#으로 작성되었으므로 C#을 이해하면 이해할 수 있어야 합니다.

이렇게 하면 다음 코드가 생성됩니다.

public static class ParseExtensions
{
  public static int ParseInt(this string self, int defaultValue)
  {
    return int.TryParse(self, out var val) ? val : defaultValue;
  }
  public static short ParseShort(this string self, short defaultValue)
  {
    return short.TryParse(self, out var val) ? val : defaultValue;
  }
  public static long ParseLong(this string self, long defaultValue)
  {
    return long.TryParse(self, out var val) ? val : defaultValue;
  }
  public static float ParseFloat(this string self, float defaultValue)
  {
    return float.TryParse(self, out var val) ? val : defaultValue;
  }
  public static double ParseDouble(this string self, double defaultValue)
  {
    return double.TryParse(self, out var val) ? val : defaultValue;
  }
  public static decimal ParseDecimal(this string self, decimal defaultValue)
  {
    return decimal.TryParse(self, out var val) ? val : defaultValue;
  }
}

생성되는 것은 코드이므로 프로그램에서 그대로 사용할 수 있습니다.

T4에 대해 조금 더 알아보기

T4 스크립트 파트는 C#으로 작성할 수 있지만 실제로 생성되는 C# 코드와 T4 C# 코드를 분리해야 합니다. 그 구분 <# .... #> 을 만드는 부분은 입니다. <# .... #> 는 T4의 스크립트 부분에서 실제로 출력되는 코드가 아니라 스크립트로 실행되는 코드입니다.

<# .... #> C# 자체의 내용은 있는 그대로이기 때문에 설명되지 않지만 <# .... #> , 프레임에는 여러 종류가 있습니다. 다음과 같은 사용 방법이 있습니다.

코드 설명
<#@ .... #> 주로 다양한 헤더의 선언에 사용됩니다. 및 선언 import 에서 T4 코드의 시작 부분에 assembly 사용됩니다.
<# .... #> T4에서 처리되는 코드를 작성합니다. 여러 줄로 나눌 수 있습니다. 이 범위에 설명된 모든 항목은 작업으로만 작동하며 출력 텍스트에는 영향을 주지 않습니다.
<#= .... #> 변수와 같은 값을 출력 결과로 출력하려는 경우에 사용됩니다. string text = "Sample"; 예를 들어, 라는 변수를 <#= text #> 작성하면 가 출력됩니다 Sample .
<#+ .... #> 클래스와 메서드를 정의하는 데 사용됩니다. 기본적으로 T4 파일의 끝에 작성됩니다.

T4 에디터 정보

Visual Studio에 확장자가 없는 경우 .tt 파일을 열면 색상이 없는 흑백 텍스트로 표시되어 보기가 다소 어렵습니다.

그 중에는 .tt 파일의 확장자를 읽기 쉽게 표시하는 것도 있으니, 마음에 드는 것을 찾아보세요. 자원봉사자들에 의해 만들어지기 때문에 연중 시기와 Visual Studio 버전에 따라 콘텐츠가 변경될 수 있습니다. 확장은 Visual Studio 메뉴의 확장에서 추가할 수 있습니다.

다음은 "T4 언어"라는 확장이 있는 Visual Studio 2022에서 본 내용입니다.