T4 텍스트 템플릿(Text Template)을 사용해서 C# POCO 개체 생성
T4??? POCO 개체??
다소 생소한 용어가 많습니다.
🟢 T4 : Text Template Transformation Toolkit의준말 (코드를 생성해주는 도구)
🟢 POCO : Plain Old CLR Objects, MS 측에서는CLASS로정의
궁극적으로 제가 공부할 내용은 1️⃣T4 텍스트 템플릿을 사용해서 데이터베이스에 접근하여 해당 테이블과 열에 대한 정보를 C# 클래스 형태의 코드(POCO 개체)로 만들고, 2️⃣만들어진 코드를 활용해서 LinqToDB 라는 라이브러리를 사용해 데이터베이스에 쉽게 접근하고 가공해보도록 하겠습니다.
따라서 이번 시간에는 T4 텍스트 템플릿을 사용해서 데이터베이스에 있는 테이블과 열에 대한 정보를 C# 클래스의 형태로 변형해 보도록 하겠습니다.
T4 텍스트 템플릿에 대한 구체적인 설명과 활용도는 아래의 글을 참고 바랍니다😁
저는 DB를 C# 코드로 변환하였지만 HTML이나 또 다른 형태로의 생성도 가능하다고 합니다.
최종적으로 저는 Linq를 사용해서 DB의 데이터(List)를 자유자재로 가공할 수 있기를 희망합니다.
1. 설치
1️⃣ 사용할 데이터베이스 준비
먼저 본 실습에서 사용한 데이터베이스는 아래의 링크에서 받은 AdventureWorks2019 입니다.
먼저 데이터베이스 백업 파일을 받아서 Local DB에 복원하도록 합니다.
2️⃣LinqToDB 라이브러리 설치
패키지 관리자 콘솔에서 SqlServer용 LinqToDB 라이브러리를 설치합니다.
✅ Install-Package linq2db.sqlserver
해당 라이브러리가 제대로 설치가 된다면 해당 솔루션 내에 LinqToDB.Templates 라는 폴더가 생성됩니다.
2. 구성
1️⃣ 생성된 파일중 CopyMe.SqlServer.tt.txt 파일을 복사해서 적당한 이름으로 변경해준다.
저 같은 경우는 프로젝트 안에 Database 폴더 안에 "T4Model.tt"라는 이름으로 복붙하였습니다.
또한 해당 파일의 사용자 지정 도구가 TextTemplatingFileGenerator인지 확인합니다.
만약 아닐경우 아래와 같은 오류나 혹은 또 다른 오류가 발생할 수 있다고 합니다.
error : Failed to resolve include text for file ...tt include
2️⃣ 복붙한 tt파일내의 DB 접속 관련 정보를 입력하여 준다.
NamespaceName은 만들어질 POCO 개체의 네임스페이스를 지정해주는 속성입니다.
LoadSqlServerMetaData에 들어가는 인자들은 데이터베이스에 접속하기 위해 필요한 정보들입니다.
마지막으로 GenerateModel() 메서드를 통해 해당 데이터베이스의 스키마들이 POCO 개체로 생성됩니다.
✅ .tt 파일을 필요에 따라 수정하는데 크게 아래 4가지의 섹션으로 구성됩니다.
1. 데이터 베이스 구조 로드 프로세스의 구성 (GetSchemaOptions 객체 속성)
2. 데이터베이스 구조 로드 호출 - LoadMetadata()함수에 대한 호출입니다. 데이터베이스에 연결하고 필요한 모든 메타데이터(테이블 구조, View, 프로시저)를 가져옵니다. 여기에서 데이터베이스에 대한 연결 옵션을 지정해야 합니다.
3. 모델 생성 프로세스의 사용자 지정
4. GenerateModel()메서드를 사용해서 데이터 모델 클래스로 C# 파일을 생성
자세한 내용은 아래의 링크를 참고 바랍니다😁👍
https://linq2db.github.io/articles/T4.html
3. 저장 및 빌드
위의 구성까지 다 마치고 저장 및 빌드를 하면 .tt 파일의 하위 경로에 cs파일이 생성됩니다.
(tt 파일 내에 출력 파일의 확장자를 설정할 수 있습니다.)
저 파일을 열어보면 아래와 같이 해당 데이터베이스의 스키마(메타데이터의 집합)에 대한 정보가 POCO 개체로 저장되어 있습니다.
위의 그림은 POCO 개체의 일부를 발췌한 부분인데 ITable<T>에서 제네릭 형태로 들어간 이름은 해당 데이터베이스의 테이블 이름이라고 생각하면 됩니다. 즉 Person_Address와 같은 테이블이 똑같이 존재함을 알 수 있습니다.
조금 더 내려가면 Person.Address 테이블의 열에대한 정보도 존재하는것을 알 수 있습니다.
해당 테이블의 각 칼럼이 프로퍼티 형태로 생성되어 있고, 해당 칼럼의 세부 정보들이 어트리뷰트(Attribute)형태로 저장되어 있습니다.
오늘 만든 POCO 개체를 사용해서 다음번에는 쉽게 DB에 접근하고 가공해보도록 하겠습니다!
댓글