연습: 사용자 지정 데이터 생성기 만들기
데이터베이스 스키마를 개발하는 경우 프로덕션 데이터를 최대한 근접하게 나타내는 데이터로 테스트 데이터베이스를 채워 제안된 변경 내용을 보다 효과적으로 테스트할 수 있습니다. 사용자 지정 데이터 생성기는 기본 제공 생성기에 비해 사용자의 사양을 보다 정확하게 충족하는 테스트 데이터를 제공합니다. 예를 들어 지정된 목록에서 임의의 문자열을 사용하거나 지정된 범위의 숫자를 사용하여 테이블 열을 채우는 생성기를 만들 수 있습니다. 자세한 내용은 데이터 생성기 확장성 개요를 참조하십시오.
이 단계별 항목에서는 임의의 주소 문자열을 생성하는 사용자 지정 데이터 생성기를 만듭니다. 이 연습에서는 다음 작업을 수행합니다.
Generator에서 상속된 사용자 지정 주소 데이터 생성기의 클래스 라이브러리를 만듭니다.
생성기 출력으로 사용할 출력 속성을 추가합니다.
데이터를 생성하도록 OnGenerateNextValues 메서드를 재정의합니다.
생성기 어셈블리에 서명합니다.
등록에 사용되는 어셈블리와 연결된 XML 파일을 만듭니다.
데이터베이스 프로젝트와 데이터 생성 계획을 만들어 사용자 지정 데이터 생성기를 테스트합니다.
사전 요구 사항
이 연습을 완료하려면 Visual Studio Premium 또는 Visual Studio Ultimate이 설치되어 있어야 합니다.
사용자 지정 생성기의 클래스 라이브러리 만들기
첫 번째 단계에서는 사용자 지정 주소 데이터 생성기의 클래스 라이브러리를 만듭니다.
사용자 지정 생성기의 클래스 라이브러리를 만들려면
Visual C# 클래스 라이브러리 프로젝트를 만들고 이름을 SampleGenerator로 지정합니다.
솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭한 다음 참조 추가를 클릭합니다.
.NET 탭을 클릭합니다.
구성 요소 이름 열에서 다음 구성 요소를 선택합니다.
Microsoft.Data.Schema
Microsoft.Data.Schema.Sql
Microsoft.Data.Schema.Tools
팁
구성 요소를 여러 개 선택하려면 Ctrl 키를 누른 상태에서 클릭합니다.
필요한 모든 구성 요소를 선택했으면 확인을 클릭합니다.
솔루션 탐색기에서 프로젝트의 참조 노드 아래에 선택한 참조가 표시됩니다.
코드 창의 맨 위에서 클래스 선언 앞에 다음 코드 줄을 추가합니다.
using Microsoft.Data.Schema.Tools.DataGenerator; using Microsoft.Data.Schema.Extensibility; using Microsoft.Data.Schema; using Microsoft.Data.Schema.Sql;
클래스 이름을 Class1에서 AddressGenerator로 바꿉니다.
경고
기본적으로 클래스에 지정하는 이름은 열 정보 창의 생성기 열에 있는 목록에 표시되는 이름입니다. 기본 제공 생성기 또는 다른 사용자 지정 생성기와 충돌하지 않는 이름을 지정해야 합니다.
public class AddressGenerator { }
다음 예제와 같이 클래스가 Generator에서 상속되도록 지정합니다.
public class AddressGenerator : Generator { }
다음 예제와 같이 DatabaseSchemaProviderCompatibilityAttribute를 추가합니다.
[DatabaseSchemaProviderCompatibility(typeof(SqlDatabaseSchemaProvider))] public class AddressGenerator : Generator { }
확장 호환성 특성에 대한 자세한 내용은 Visual Studio의 데이터베이스 기능 확장을 참조하십시오.
파일 메뉴에서 모두 저장을 클릭합니다.
생성기에 출력 속성 추가
앞 단원에서는 Generator 클래스에서 상속된 클래스 라이브러리를 만들었습니다. 이 단원에서는 클래스에 출력 속성을 추가합니다. 출력 속성에는 생성된 데이터의 값이 들어 있습니다. 또한 출력 속성은 해당 생성기에서 생성할 수 있는 데이터 형식을 지정합니다.
출력 속성을 추가하려면
다음 예제와 같이 주소를 생성하는 데 사용할 멤버 변수를 만듭니다.
이 주소 변수는 이후 단계에서 출력 속성에 사용됩니다.
private Random _random; private string _street; private string _city; private string _state; private int _zipCode; private string _address; private static readonly List<String> _states = new List<string>() { "AK", "AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA", "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD", "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ", "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC", "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY" };
다음 예제와 같이 _random 멤버 변수에 대한 private 속성을 만듭니다.
private Random Random { get { if (_random == null) _random = new Random(base.Seed); return _random; } }
다음 예제와 같이 _address 멤버 변수에 대한 private 속성을 만들고 이 속성에 OutputAttribute를 추가합니다.
[Output(Description = "Generates street and city values of \"2150 Newton Street, San Francisco\", with random state and zip code.", Name = "Address")] public string Address { get { return this._address; } }
파일 메뉴에서 모두 저장을 클릭합니다.
OnGenerateNextValues 메서드 재정의
Visual Studio에서는 필요한 각 값 집합에 대해 각 생성기의 OnGenerateNextValues 메서드를 호출합니다. 데이터 생성기를 만들 때 이 메서드를 재정의하여 각 출력 속성에 대해 값을 생성하는 논리를 제공해야 합니다.
OnGenerateNextValues 메서드를 재정의하려면
다음 예제와 같이 OnGenerateNextValues 메서드를 재정의합니다.
protected override void OnGenerateNextValues() { this._street = "2150 Newton Street"; this._city = "San Francisco"; this._state = _states[Random.Next(0, _states.Count)]; this._zipCode = Int32.Parse(String.Format("{0}{1}{2}{3}{4}", GetRandomDigit(1), GetRandomDigit(), GetRandomDigit(), GetRandomDigit(), GetRandomDigit())); this._address = String.Format("{0}, {1}, {2} {3}", _street, _city, _state, _zipCode); }
_zipcode 변수의 값을 만드는 데 사용되는 다음 메서드를 추가합니다.
private int GetRandomDigit() { return GetRandomDigit(0); } private int GetRandomDigit(int lowNumber) { return Random.Next(lowNumber, 10); }
파일 메뉴에서 모두 저장을 클릭합니다.
생성기 서명
다음에는 사용자 지정 데이터 생성기에 강력한 이름으로 서명해야 합니다.
강력한 이름을 사용하여 생성기에 서명하려면
프로젝트 메뉴에서 SampleGenerator 속성을 클릭합니다.
서명 탭에서 어셈블리 서명 확인란을 선택합니다.
강력한 이름 키 파일 선택 상자에서 **<새로 만들기...>**를 클릭합니다.
강력한 이름 키 만들기 대화 상자가 나타납니다.
키 파일 이름 상자에 SampleGeneratorKey를 입력합니다.
암호를 입력하고 확인한 다음 확인을 클릭합니다.
솔루션을 빌드할 때 이 키 파일이 어셈블리에 서명하는 데 사용됩니다.
파일 메뉴에서 모두 저장을 클릭합니다.
빌드 메뉴에서 솔루션 빌드를 클릭합니다.
사용자 지정 데이터 생성기가 만들어졌습니다.
생성기 어셈블리 등록
어셈블리 서명 및 컴파일을 마친 후 다음 단계에서는 생성기 어셈블리를 등록하기 쉽도록 프로젝트에서 생성된 버전, 문화권, PublicKeyToken 등의 어셈블리 정보를 수집합니다.
어셈블리 정보를 수집하려면
보기 메뉴에서 다른 창, 명령 창을 차례로 클릭하여 명령 창을 엽니다.
명령 창에서 다음 코드를 입력합니다. FilePath 대신 컴파일된 .dll 파일의 경로 및 파일 이름을 입력합니다. 이때 경로 및 파일 이름을 따옴표로 묶습니다.
참고
기본적으로 컴파일된 .dll 파일의 경로는 SampleGenerator\bin\Debug입니다.
? System.Reflection.Assembly.LoadFrom(@"<FilePath>").FullName
Enter 키를 누릅니다. 이 줄은 특정 PublicKeyToken이 포함된 다음과 유사합니다.
" SampleGenerator, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nnnnnnnnnnnnnnnn"
이 어셈블리 정보를 적어 두거나 복사합니다. 이 정보는 다음 절차에서 사용됩니다.
다음으로, 이전 절차에서 수집한 어셈블리 정보를 사용하여 XML 파일을 만듭니다.
XML 파일을 만들려면
솔루션 탐색기에서 SampleGenerator 프로젝트를 선택합니다.
프로젝트 메뉴에서 새 항목 추가를 선택합니다.
템플릿 창에서 XML 파일 항목을 찾아 선택합니다.
이름 텍스트 상자에 SampleGenerator.Extensions.xml을 입력한 다음 추가 단추를 클릭합니다.
솔루션 탐색기에서 해당 프로젝트에 SampleGenerator.Extensions.xml 파일이 추가됩니다.
참고
dll 이름(이 경우 "SampleGenerator" 뒤에 ".Extensions.xml"이 붙은 이름)을 사용해야 어셈블리가 제대로 등록됩니다.
SampleGenerator.Extensions.xml 파일을 열고 다음 XML과 일치하도록 업데이트합니다. 이전 절차에서 검색한 어셈블리의 버전, 문화권 및 PublicKeyToken을 바꿉니다.
참고
확장 형식에서는 정규화된 클래스 이름을 사용해야 합니다. 이 경우에 확장 형식은 "SampleGenerator.AddressGenerator"입니다.
<?xml version="1.0" encoding="utf-8"?> <extensions assembly="" version="1" xmlns="urn:Microsoft.Data.Schema.Extensions" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:Microsoft.Data.Schema.Extensions Microsoft.Data.Schema.Extensions.xsd"> <extension type="SampleGenerator.AddressGenerator" assembly="SampleGenerator, Version=1.0.0.0, Culture=neutral, PublicKeyToken=nnnnnnnnnnnnnnnn" enabled="true"/> </extensions>
파일 메뉴에서 모두 저장을 클릭합니다.
다음에는 어셈블리와 XML 파일을 Extensions 디렉터리에 복사합니다. Visual Studio Premium은 시작 시 %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions 디렉터리 및 하위 디렉터리에 있는 모든 확장을 확인하여 세션에서 사용할 수 있도록 등록합니다.
어셈블리와 XML 파일을 Extensions 디렉터리에 복사하고 등록하려면
%Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\ 디렉터리에 CustomGenerators라는 폴더를 만듭니다.
ProjectFolder\SampleGenerator\SampleGenerator\bin\Debug\ 디렉터리에 있는 SampleGenerator.dll 어셈블리 파일을 앞에서 만든 %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\CustomGenerators 폴더에 복사합니다.
ProjectFolder\SampleGenerator\SampleGenerator\ 디렉터리에 있는 SampleGenerator.Extensions.xml 파일을 앞에서 만든 %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\ CustomGenerators 디렉터리에 복사합니다.
참고
%Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions 디렉터리의 폴더에 확장 어셈블리를 저장하는 것이 좋습니다. 이렇게 하면 제품에 포함된 확장과 사용자 지정 확장을 식별하는 데 도움이 됩니다. 확장을 범주별 폴더로 구성하는 것도 좋습니다.
주소 생성기 테스트
주소 데이터 생성기를 만든 후에는 Visual Studio의 새 인스턴스를 시작해야 합니다. Visual Studio에서는 시작 시 %Program Files%\Microsoft Visual Studio 10.0\VSTSDB\Extensions\CustomGenerators 디렉터리에 추가된 SampleGenerator 어셈블리를 등록합니다. 다음에는 주소 데이터 생성기가 올바르게 작동하는지 확인할 수 있는 데이터베이스 프로젝트를 만듭니다.
데이터베이스 프로젝트를 만들려면
Visual Studio의 새 인스턴스를 시작합니다. 그러면 SampleGenerator.dll 어셈블리가 인식되고 등록됩니다.
파일 메뉴에서 새로 만들기를 가리킨 다음 프로젝트를 클릭합니다.
새 프로젝트 대화 상자가 나타납니다.
설치된 템플릿에서 데이터베이스 노드를 확장하고 SQL Server 노드를 클릭합니다.
템플릿 목록에서 SQL Server 2008 데이터베이스 프로젝트를 클릭합니다.
이름에 SampleGeneratorDB를 입력합니다.
참고
연습: CHECK 제약 조건에 맞는 사용자 지정 데이터 생성기 만들기의 모든 단계를 완료하여 SampleGeneratorDB 프로젝트를 이미 만든 경우에는 9단계로 이동할 수 있습니다.
솔루션용 디렉터리 만들기 확인란을 선택합니다.
위치, 솔루션 이름 및 소스 제어에 추가에 대해 기본값을 적용한 다음 확인을 클릭합니다.
확인을 클릭합니다.
새 데이터베이스 프로젝트 SampleGeneratorDB가 솔루션 탐색기에 나타납니다.
보기 메뉴에서 데이터베이스 스키마 뷰를 클릭합니다.
스키마 뷰가 아직 표시되지 않은 경우 표시됩니다.
다음에는 varchar SQL 형식의 열 하나만 있는 간단한 테이블을 프로젝트에 추가합니다.
데이터베이스 프로젝트에 테이블을 추가하려면
스키마 뷰에서 SampleGeneratorDB 노드, 스키마 노드, dbo 노드를 차례로 확장하고 테이블 노드를 클릭합니다.
프로젝트 메뉴에서 새 항목 추가를 클릭합니다.
참고
스키마 뷰에서 SampleGeneratorDB 프로젝트를 마우스 오른쪽 단추로 클릭하고 추가를 가리킨 다음 테이블을 클릭할 수도 있습니다.
템플릿에서 테이블을 클릭합니다.
참고
범주 목록에서 테이블 및 뷰를 클릭하면 테이블의 템플릿을 보다 쉽게 찾을 수 있습니다.
이름에서 새 테이블에 지정할 이름으로 Addresses를 입력합니다.
추가를 클릭하여 데이터베이스 프로젝트에 테이블을 추가합니다.
솔루션 탐색기의 사용자 데이터베이스 프로젝트에 해당 테이블에 대한 새 파일이 표시됩니다. 스키마 뷰에는 새 테이블 개체가 표시됩니다. Transact-SQL 편집기가 나타나고 새 테이블에 대한 정의가 표시됩니다.
Transact-SQL 편집기에서 다음 예제와 일치하도록 테이블 정의를 수정합니다.
CREATE TABLE [dbo].[Addresses] ( address varchar(100) )
파일 메뉴에서 Addresses.table.sql 저장을 클릭합니다.
테이블을 추가한 후에는 데이터베이스를 배포용으로 구성할 수 있습니다.
프로젝트 배포 설정을 구성하려면
솔루션 탐색기에서 SampleGeneratorDB(솔루션이 아닌 프로젝트)를 클릭합니다.
프로젝트 메뉴에서 SampleGeneratorDB 속성을 클릭합니다.
프로젝트 속성 창이 나타납니다.
참고
솔루션 탐색기에서 SampleGeneratorDB를 마우스 오른쪽 단추로 클릭하고 속성을 클릭할 수도 있습니다.
배포 탭을 클릭합니다.
배포 작업에서 배포 스크립트(.sql)를 만들고 데이터베이스에 배포를 클릭합니다.
편집 단추를 클릭하여 대상 연결을 지정합니다.
SampleGeneratorDB 데이터베이스를 배포할 데이터베이스 서버에 연결하기 위한 정보를 지정합니다.
데이터베이스 이름 선택 또는 입력에 SampleGeneratorDB를 입력합니다.
확인을 클릭합니다.
대상 연결이 연결 문자열로 채워집니다. 또한 대상 데이터베이스 이름이 SampleGeneratorDB로 설정됩니다.
다른 옵션에 대해 기본값을 적용합니다.
파일 메뉴에서 선택한 항목 저장을 클릭합니다.
프로젝트 빌드 설정이 저장됩니다.
다음에는 데이터베이스 프로젝트를 빌드합니다.
데이터베이스 프로젝트를 빌드하려면
빌드 메뉴에서 솔루션 빌드를 클릭합니다.
데이터베이스 프로젝트가 빌드됩니다. 성공하면 상태 표시줄에 "빌드했습니다."라는 메시지가 나타나고 출력 창에 빌드 결과가 표시됩니다.
다음에는 데이터베이스 프로젝트를 배포합니다.
데이터베이스 프로젝트를 데이터베이스 서버에 배포하려면
솔루션 탐색기에서 SampleGeneratorDB(솔루션이 아닌 프로젝트)를 클릭합니다.
빌드 메뉴에서 SampleGeneratorDB 배포를 클릭합니다.
데이터베이스 프로젝트가 빌드 구성에서 지정한 연결을 사용하여 배포됩니다. 상태 표시줄과 출력 창에 "배포되었습니다."라는 메시지가 나타납니다.
데이터 생성 계획 만들기 및 구성
다음에는 데이터 생성 계획을 만듭니다. 데이터 생성 계획에는 데이터로 채우려는 테이블과 열에 대한 정보가 있습니다. 자세한 내용은 방법: 데이터 생성 계획 만들기를 참조하십시오.
데이터 생성 계획을 만들고 구성하려면
솔루션 탐색기에서 데이터 생성 계획 노드를 선택합니다.
프로젝트 메뉴에서 새 항목 추가를 클릭합니다.
범주 창에서 데이터 생성 계획을 클릭합니다.
템플릿 창에서 데이터 생성 계획을 클릭합니다.
이름 텍스트 상자에 SampleGenerator.dgen을 입력합니다.
추가를 클릭합니다.
데이터 생성 계획이 만들어집니다. 데이터 생성 계획이 나타납니다.
데이터 생성 계획 창은 가로로 두 개의 창으로 분할되어 있습니다. 위쪽 창에는 데이터베이스 프로젝트 스키마에 정의된 테이블(이 경우 dbo.Addresses 테이블)이 나열되고, 아래쪽 창에는 위쪽 창에 강조 표시되어 있는 테이블에 대한 열 정보(이 경우 address 열)가 표시됩니다.
참고
데이터 생성 미리 보기 창이 열리지 않는 경우 데이터 메뉴를 열고 데이터 생성기를 가리킨 다음 데이터 생성 미리 보기를 클릭하여 이 창을 열 수 있습니다. 기본적으로 데이터 생성 미리 보기 창은 데이터 생성 계획 창의 맨 아래에 도킹되어 탭으로 표시됩니다. 보기를 확장하려면 창을 클릭한 다음 창 메뉴에서 탭 문서를 클릭합니다. 제목 표시줄을 마우스 오른쪽 단추로 클릭한 다음 탭 문서로 도킹을 클릭할 수도 있습니다.
SampleGenerator.dgen 디자이너에서 dbo.Addresses 테이블과 address 열이 모두 검사되었는지 확인합니다.
SampleGenerator.dgen 디자이너에서 address 열을 선택하고 생성기 드롭다운 메뉴를 클릭하여 AddressGenerator를 선택합니다.
이제 사용자 지정 주소 생성기가 올바르게 구성되었습니다.
파일 메뉴에서 모두 저장을 클릭합니다.
데이터 생성 계획을 실행하여 주소 데이터 생성
마지막으로, 데이터 생성 계획을 실행하여 사용자 지정 주소 데이터 생성기의 동작을 확인합니다.
데이터 생성 계획을 실행하려면
솔루션 탐색기에서 SampleGenerator.dgen을 클릭합니다.
참고
데이터 생성 계획도 열려 있어야 합니다. 계획이 열려 있지 않으면 먼저 계획을 엽니다.
데이터 메뉴에서 데이터 생성기를 가리킨 다음 데이터 생성을 클릭합니다.
데이터베이스에 연결 대화 상자가 나타납니다.
데이터 생성 연결 정보 목록에서 SampleGeneratorDB 데이터베이스를 클릭하고 확인을 클릭합니다.
새 행을 삽입하기 전에 테이블 내용을 지우라는 메시지가 표시되면 예를 클릭합니다.
데이터가 생성됩니다. 채우기 창에서 상태 열이 데이터 생성 상태로 업데이트됩니다. 상태 표시줄에 모든 테이블에 대한 데이터 생성 요약이 표시됩니다.
(선택 사항) 다른 도구를 사용하여 데이터베이스에 로그온합니다. 이 단계에서 Visual Studio Premium에 제공된 Transact-SQL 편집기를 사용할 수 있습니다. 자세한 내용은 Microsoft 웹사이트의 Transact-SQL 편집기를 사용하여 데이터베이스 스크립트 및 개체 편집을 참조하십시오.
다음 쿼리를 실행하여 새 데이터를 표시합니다.
use SampleGeneratorDB select * from dbo.Addresses
결과 탭에 임의의 주 및 우편 번호 값을 갖는 주소가 표시됩니다.
다음 단계
Visual Studio Premium 및 Visual Studio Ultimate에는 생성기의 Min 및 Max 속성을 사용하여 날짜가 반드시 특정 범위 내에 있도록 하는 CHECK 제약 조건이 있는 열에 사용할 수 있는 DateTime 생성기가 포함되어 있습니다. 연습: CHECK 제약 조건에 맞는 사용자 지정 데이터 생성기 만들기에서는 날짜가 반드시 두 가지 범위 중 한 범위 내에 있도록 하는 CHECK 제약 조건이 있는 열에 대한 사용자 지정 데이터 생성기를 만듭니다.
참고 항목
작업
참조
Microsoft.Data.Schema.Tools.DataGenerator
개념
기타 리소스
Editing Database Scripts and Objects with the Transact-SQL Editor