Visual Studio의 데이터베이스 기능 확장

기능 확장을 만들어 Visual Studio Premium 또는 Visual Studio Ultimate을 확장할 수 있습니다. 이러한 기능 확장을 통해 리팩터링, 데이터 생성, 단위 테스트, 데이터베이스 코드 분석 같은 Visual Studio Premium 또는 Visual Studio Ultimate의 기능을 확장할 수 있습니다. 기능 확장을 만들 때는 기본 기능을 위한 기존의 프레임워크를 사용하므로 작성해야 하는 코드의 양이 상당히 줄어듭니다.

기능 확장에는 잘 정의된 확장성 지점이 있습니다. Visual Studio SDK가 없어도 Visual Studio Premium 또는 Visual Studio Ultimate용 기능 확장을 만들 수 있습니다.

일반 고급 작업

고급 작업

지원 내용

데이터베이스 확장성의 개념에 대한 자세한 내용: 데이터베이스 기능을 확장하기 전에 Visual Studio Premium 또는 Visual Studio Ultimate에서 확장성이 작동하는 방식을 이해하고 있어야 합니다. 데이터베이스 스키마 공급자는 SQL Server 2008과 같은 특정 브랜드 및 버전의 데이터베이스에 고유한 모든 서비스를 구현합니다. 여기에는 해당 데이터베이스의 스크립트를 읽고 쓰는 파서, 스크립트를 나타내는 스크립트 DOM(스크립트 도메인 개체 모델), 그리고 데이터베이스 개체의 개체, 관계 및 속성을 모델링하는 스키마 모델이 포함됩니다. Visual Studio Premium 또는 Visual Studio Ultimate에서 기능 또는 기능 확장과 상호 작용할 때는 항상 해당 기능 및 기능 확장이 DSP 서비스, 스크립트 DOM 및 스키마 모델의 조합에 대해 작동합니다.

  • 데이터베이스 모델링

  • Database Edition의 확장성 구성 요소

  • 기능 확장의 형식

  • 데이터베이스 스키마 공급자의 핵심 구성 요소

새 데이터베이스 리팩터링 형식에 대한 지원 추가: 데이터베이스 리팩터링을 위한 기능 확장을 만들어 새 데이터베이스 리팩터링 형식을 사용할 수 있도록 할 수 있습니다. 각각의 새 리팩터링 형식에는 하나 이상의 새 리팩터링 참가자도 필요합니다.

새 데이터베이스 리팩터링 대상에 대한 지원 추가: 기존 데이터베이스 리팩터링 형식에서 데이터베이스 정보가 들어 있는 타사 응용 프로그램에서의 출력이나 텍스트 파일과 같은 새 아티팩트 형식을 업데이트할 수 있도록 할 수 있습니다. 새 리팩터링 형식을 만드는 경우에는 하나 이상의 리팩터링 참가자를 구현하여 해당 형식이 데이터베이스 프로젝트에 포함된 아티팩트에 대해 작동할 수 있도록 해야 합니다.

새 데이터베이스 코드 분석 규칙 정의: Visual Studio Premium 또는 Visual Studio Ultimate에 포함된 규칙으로는 검색되지 않는 문제를 찾을 수 있는 새 데이터베이스 코드 분석 규칙을 정의할 수 있습니다.

사용자 지정 데이터 생성기 만들기: 사용자 지정 데이터 생성기를 사용하여 중요한 정보를 공개하지 않는 사실적인 테스트 데이터를 생성할 수 있습니다. 사용자 지정 데이터 생성기를 만들어 Visual Studio Premium 또는 Visual Studio Ultimate에 포함된 데이터 생성기를 보완할 수 있습니다.

사용자 지정 데이터베이스 단위 테스트 조건 추가: 사용자 지정 테스트 조건을 정의하면 기본 제공 단위 테스트 조건이 지원하지 않는 방식으로 데이터베이스 개체의 동작을 확인할 수 있습니다.

데이터베이스 프로젝트 동작 사용자 지정: 사용자 지정 데이터베이스 프로젝트 기능을 정의하여 기본 제공 데이터베이스 프로젝트에서 지원하지 않는 방식으로 프로젝트 동작을 수정할 수 있습니다.

데이터베이스 모델링

데이터베이스를 모델링하기 위해 Visual Studio에서는 데이터베이스의 DDL(데이터 정의 언어)을 구성하는 스크립트와 이 스크립트를 실행한 결과로 얻어지는 데이터베이스를 모두 모델링합니다. DDL 스크립트의 모델은 스크립트 DOM에서 제공되고, 결과 데이터베이스의 모델은 스키마 모델에서 제공됩니다.

확장성 구성 요소 간의 데이터 흐름

다음 다이어그램에서는 이러한 구성 요소들 사이의 데이터 흐름을 보여 줍니다.

확장성 구성 요소 간의 데이터 흐름

확장성 구성 요소 간의 데이터 흐름

데이터베이스 개체의 정의는 데이터베이스 프로젝트에 DDL 스크립트 형태로 저장됩니다. 데이터베이스 프로젝트를 열면 이러한 스크립트에 대한 읽기 작업이 수행되고 두 개의 모델, 즉 스크립트 DOM 모델과 스키마 모델이 채워집니다. Visual Studio Premium의 기능은 두 모델 모두와 상호 작용하며, 데이터베이스 개체에 대한 변경 내용을 저장하면 이 변경 내용은 다시 DDL 스크립트에 저장됩니다.

Database Edition의 확장성 구성 요소

다음 다이어그램에서는 Database Edition의 기능을 확장할 수 있도록 하기 위해 상호 작용하는 구성 요소를 보여 줍니다.

확장성 구성 요소 간의 통신

Database Edition의 확장성 구성 요소

데이터베이스 프로젝트를 열거나 만들면 확장 관리자 구성 요소에서는 등록된 모든 데이터베이스 스키마 공급자를 로드합니다. DSP(데이터베이스 스키마 공급자)의 특정 기능을 사용할 때 확장 관리자 구성 요소에서는 해당 기능과 함께 해당 DSP를 지원하는 기능 확장을 로드합니다. 예를 들어 SQL Server 2008 데이터베이스에서 이름 바꾸기 리팩터링 기능을 사용하여 개체의 이름을 바꾸는 경우 리팩터링 기능이 로드될 뿐 아니라 SQL Server 2008용 리팩터링 형식 및 참가자도 로드됩니다.

확장 관리자

Visual Studio Premium 또는 Visual Studio Ultimate을 실행할 때 모든 데이터베이스 프로젝트, 스키마 공급자, 기능 및 기능 확장은 singleton ExtensionManager와 상호 작용합니다. 확장 관리자는 각 데이터베이스 프로젝트에 대해 DatabaseSchemaProvider에서 파생된 단일 인스턴스를 로드합니다. 예를 들어 Visual Studio Premium 또는 Visual Studio Ultimate에서 Microsoft SQL Server 2005 프로젝트가 열릴 경우 확장 관리자는 DatabaseSchemaProvider에서 파생된 Sql90DatabaseSchemaProvider의 인스턴스를 로드합니다.

확장 관리자가 확장을 로드할 때는 해당 확장에 의해 구현된 인터페이스 형식을 기반으로 합니다. 예를 들어 데이터베이스 단위 테스트 기능을 사용할 경우 확장 관리자는 기본 클래스 TestCondition에서 상속하는 등록된 확장 중 해당 데이터베이스 프로젝트의 데이터베이스 스키마 공급자와 호환되는 확장의 목록을 반환합니다.

기능 확장 호환성

리팩터링 또는 정적 코드 분석과 같은 기능은 DSP 고유의 구성 요소와 모든 DSP를 지원하는 구성 요소(DSP와 관계없는 구성 요소)로 구성됩니다. 기능 확장을 정의할 때는 해당 확장이 적절한 프로젝트 형식에 대해서만 로드되도록 해당 확장과 특정 DSP 또는 기본 DSP의 호환성을 선언해야 합니다. 예를 들어 확장이 Sql90DatabaseSchemaProvider(SQL Server 2005 프로젝트로 제한) 또는 SqlDatabaseSchemaProvider(SQL Server 2005 및 SQL Server 2008 DSP의 기본 클래스) 중 하나와 호환되도록 선언할 수 있습니다. 확장이 여러 개의 특정 DSP와 호환되도록 선언할 수도 있습니다. 이후 버전에서 기능에 문제가 발생할지 여부를 확실히 알 수 없는 경우 이 방법을 사용할 수 있습니다. 기능이 모든 DSP와 호환되도록 선언하려면 이 기능을 DatabaseSchemaProvider 기본 클래스와 호환되는 기능으로 선언합니다.

예제

단일 DSP와 호환되는 확장 정의

// SqlSchemaObjectDesigners is defined as compatible with all Sql 
// database services providers.  
[DatabaseSchemaProviderCompatibility (typeof(Sql90DatabaseSchemaProvider))]
internal class SqlSchemaObjectDesigners : ISchemaObjectDesigners
{
}

여러 DSP와 호환되는 확장 정의

// Extension InconclusiveCondition is defined as compatible with all 
// SQL Server database services providers and Oracle database 
// services providers.
[DatabaseSchemaProviderCompatibility (typeof(SqlDatabaseSchemaProvider))]
[DatabaseSchemaProviderCompatibility (typeof(OracleDatabaseSchemaProvider))]
public sealed class InconclusiveCondition : TestCondition
{
}

모든 DSP와 호환되는 확장 정의

// Extension ReportingService is defined as compatible with all
// database services providers.
[DatabaseSchemaProviderCompatibility (typeof(DatabaseSchemaProvider))]
internal class ReportingService : IReportingService
{
}

어떤 DSP와도 호환되지 않는 확장 정의

// Extension ExecutionTimeCondition is defined as compatible with no
// database services providers.  That means if a feature
// has an ExtensionManager constructed with null, it will load
// those extensions defined as binding to 
// DspCompatibilityCategory.None
[DatabaseSchemaProviderCompatibility (DspCompatibilityCategory.None)]
public sealed class ExecutionTimeCondition : TestCondition
{
}

기능 확장의 형식

Visual Studio Premium 또는 Visual Studio Ultimate의 여러 기능을 향상시키는 기능 확장을 만들 수 있습니다. 다음 표에서는 만들 수 있는 확장 형식에 대해 설명합니다.

기능

확장 형식

설명

데이터베이스 단위 테스트

단위 테스트 조건

테스트의 성공 또는 실패를 확인하는 사용자 지정 어설션을 추가할 수 있습니다. 대부분의 단위 테스트 API는 공용이지만 확장성 지점을 나타내지 않습니다. 이러한 API는 Visual C# 또는 Visual Basic 같은 관리 코드로 작성되는 데이터베이스 단위 테스트를 만드는 데 사용됩니다. 자세한 내용은 데이터베이스 단위 테스트의 사용자 지정 조건 정의를 참조하십시오.

데이터 생성

데이터 생성기

Visual Studio Premium 또는 Visual Studio Ultimate에서 데이터 생성기가 제공되는 경우 확장성 API를 사용하여 사용자 지정 데이터 생성기를 만들 수 있습니다. 자세한 내용은 사용자 지정 데이터 생성기를 통해 특수 테스트 데이터 생성를 참조하십시오.

데이터베이스 코드 분석

코드 분석 규칙

데이터베이스 코드의 특정 문제를 검사하는 사용자 고유의 코드 분석 규칙을 정의할 수 있습니다. 자세한 내용은 데이터베이스 코드를 분석하기 위한 추가 규칙 만들기 및 등록을 참조하십시오.

데이터베이스 리팩터링

리팩터링 대상

기존 리팩터링 형식을 확장하여 새 파일 형식 등의 새 대상에 대해 작동하도록 할 수 있습니다. 자세한 내용은 연습: 텍스트 파일에서 작동하도록 데이터베이스 이름 바꾸기 리팩터링 확장을 참조하십시오.

데이터베이스 리팩터링

리팩터링 형식

중첩된 조건을 가드 절과 바꾸는 것과 같은 새 리팩터링 형식을 만들 수 있습니다. 자세한 내용은 사용자 지정 데이터베이스 리팩터링 형식 또는 대상 만들기를 참조하십시오.

데이터베이스 스키마 공급자의 핵심 구성 요소

DSP(데이터베이스 스키마 공급자)는 다음과 같은 세 가지 구성 요소 그룹으로 구성됩니다.

  • 스크립트 DOM - DDL 및 DML 문이 모두 포함된 임의의 SQL 스크립트를 모델링하는 개체 모델과 지원 서비스입니다.

  • 스키마 모델 - 데이터베이스 인스턴스의 테이블, 뷰 및 저장 프로시저 같은 개체를 모델링하는 개체 모델과 지원 서비스입니다.

  • 사용자 상호 작용 서비스 - 핵심 구성 요소에서 개체 이름을 나타내는 문자열, 개체 형식 및 범주를 나타내는 아이콘, 해당 개체를 표시할 계층 구조 등의 사용자 인터페이스 리소스에 액세스할 수 있게 해 주는 서비스 컬렉션입니다.

DSP의 주 기능은 DDL 스크립트를 스크립트 DOM 및 스키마 모델 표현 모두에서 처리할 수 있도록 하고, 두 모델 표현에서 스크립트를 재현하는 반대 기능을 사용할 수 있도록 하는 것입니다.

스크립트 DOM

스크립트 DOM에서는 DDL 스크립트를 해당 스크립트를 나타내는 개체 모델로 구문 분석하는 구현을 제공합니다. 스크립트 DOM에서는 모델에서 원래 스크립트를 재현하는 구현도 제공합니다.

다음 다이어그램에서는 스크립트 DOM을 통한 데이터 흐름을 보여 줍니다.

스크립트 DOM을 통한 데이터 흐름

스크립트 DOM을 통한 데이터 흐름

스크립트 DOM 파서는 구조화되지 않은 텍스트 파일에 저장된 스크립트를 IScriptFragment 인터페이스에서 상속된 개체로 변환합니다. 스크립트 DOM의 스크립트 생성기는 IScriptFragment 인터페이스에서 상속된 개체를 받아 원래 스크립트를 생성합니다. Visual Studio Premium 또는 Visual Studio Ultimate에 포함된 SQL Server용 데이터베이스 스키마 공급자에서는 IScriptFragment가 AST(추상 구문 트리)와 토큰 스트림을 추상화합니다.

토큰은 스크립트의 구조화되지 않은 표현을 제공합니다. 컬렉션의 각 토큰에는 다음 항목이 포함되어 있습니다.

  • 토큰 형식(예: 키워드 또는 문자열 리터럴)

  • 토큰 문자열

  • 토큰이 발생한 소스 파일

  • 해당 파일 내에서 토큰이 발생한 위치의 오프셋

AST(추상 구문 트리)는 스크립트의 구조화된 표현을 제공합니다. AST의 각 노드는 일괄 문, 단일 문 또는 문의 구성 요소(예: 식)를 나타냅니다. AST는 스크립트의 구문 분석이 완료된 후 스크립트를 분석하는 데 사용됩니다. AST는 스크립트를 프로그래밍 방식으로 빌드하는 데도 사용됩니다.

스키마 모델

스키마 모델 표현은 라이브 데이터베이스 인스턴스를 모델링하는 인터페이스 기반의 개체 모델입니다. 인터페이스는 파생 계층 구조로 정렬되며, 이 계층 구조에는 모든 DSP에서 공유하는 단일 추상 계층이 포함될 뿐 아니라 보다 구체적인 모델 정보를 대상으로 하는 추상 계층이 개수에 제한 없이 포함됩니다. 예를 들어 ISql90Table 인터페이스는 추상 계층 인터페이스 IDatabaseTable을 상속하는 ISqlTable을 상속합니다. 스키마 모델은 IScriptFragment 개체를 받아 스키마 모델 요소로 변환하며, 스키마 모델 요소에서 IScriptFragment 개체로의 역변환을 수행하기도 합니다. 스키마 모델은 여러 개의 모델 작성기 구현으로 구성됩니다. 각 구현은 시스템의 다른 리소스에서 모델을 만듭니다. 예를 들어 ScriptModelComposer는 데이터베이스 프로젝트에서 유지 관리되는 스크립트 파일에서 모델을 작성합니다.

스키마 모델 인프라(ModelStore 및 해당 지원 클래스)는 모델 요소에서 직접 통합된 스크립트 DOM 참조를 구현합니다. 이를 통해 임의의 스크립트가 포함된 저장 프로시저 등의 개체에 대한 모델링이 가능해집니다.

스키마 모델은 요소 및 주석의 컬렉션으로 구성됩니다. 요소는 모델링되는 아티팩트(테이블, 뷰, 저장 프로시저, 트리거, 열 등)를 나타내며, 주석은 임의의 데이터를 모델과 연결하는 데 사용됩니다. 주석은 데이터베이스 프로젝트의 핵심 구성 요소에서 사용되며 프로젝트 기능 및 기능 확장에서도 사용될 수 있습니다. 요소와 주석은 모두 이름이 지정될 수도 있고 익명일 수도 있습니다.

모델 요소

요소는 속성과 관계로 구성됩니다. 속성은 정수, 부울 값, 문자열 등의 기본 데이터를 나타내며 모델의 정보를 캡처하는 데 사용됩니다. 관계는 요소 간의 명명되고 형식화된 연결을 나타냅니다. 예를 들어 ISqlTable 요소는 테이블을 해당 열과 연결하는 "Columns"라는 ISqlColumn 형식의 관계를 유지 관리합니다.

기본적인 관계 유형에는 다음 세 가지가 있습니다.

  • 피어 - 한 요소가 임의의 방식으로 다른 요소에 종속되어 있음을 나타냅니다. SQL Server에서 뷰와 테이블 간의 관계는 피어 관계로 모델링할 수 있는 가장 적절한 경우입니다.

  • 구성 - 한 요소가 다른 요소로 구성됨을 나타냅니다. SQL Server에서 테이블과 테이블 열 간의 관계는 구성 관계로 모델링할 수 있는 가장 적절한 경우입니다. 구성 관계의 주요 원칙은 두 요소가 동시에 단일 작업으로 만들어진다는 것입니다. 즉, 요소를 만들거나 제거하는 데 종속성 순서가 없습니다. 하지만 연관 종속성이 가능하도록 하기 위해 부모에서 자식으로의 종속성 방향은 모델에서 유지됩니다. 예를 들어 열에 특정 형식에 대한 종속성이 있는 경우 부모 테이블의 구성 열에 대한 종속성은 해당 테이블도 이 형식에 종속되어야 함을 의미합니다.

  • 계층 - 계층 구조를 나타냅니다. 계층 관계는 부모에서 자식으로가 아니라 자식에서 부모로의 종속성 방향이 적용되므로 구성 관계와는 다릅니다. SQL Server에서는 스키마와 테이블 또는 뷰 등의 소유된 개체 간의 관계가 이러한 예에 해당됩니다. 테이블은 해당 스키마와의 계층 관계에 참여합니다.

다음 다이어그램에서는 스키마 모델에서 나타낼 수 있는 세 가지 유형의 관계를 보여 줍니다.

스키마 모델의 개체 관계

스키마 모델의 개체 관계

모델의 각 관계에서는 해당 관계가 다중 관계인지 단일 관계인지를 선언합니다. 모든 경우에 요소는 빈 관계를 유지할 수 있습니다. 모델은 실제 아티팩트의 불완전한 모델일 수 있습니다.

요소는 저장소 구현에서 다음 기능을 지원하기 위해 인터페이스를 기반으로 합니다.

  • 강력한 요소 형식화(ID)

  • 다중 상속

    • 시스템에서 DSP에 관계없는 부분과 DSP에 고유한 부분을 모두 지원

    • 관련이 없는 요소 형식 간의 "품질" 공유 지원

  • 버전 유연성 및 확장성

모든 모델 요소 클래스는 public IModelElement 인터페이스를 구현합니다. 이 클래스에서 ModelStore 메타데이터 API를 사용하여 속성, 관계 및 주석에 액세스할 수 있습니다. IDatabaseTable과 같은 인터페이스는 보다 단순하고 유지 관리하기 쉬운 방식으로 속성 및 관계에 대한 액세스(컴파일 시 바인딩됨)를 제공하는 역할을 합니다.

모델 주석

주석은 요소와 마찬가지로 속성으로 구성됩니다. 하지만 주석은 요소와 달리 관계에 참여하지 않습니다. 대신 주석은 요소나 모델 저장소 자체에 연결됩니다. 주석은 강력하게 형식화되며, 단일 주석 인스턴스를 여러 요소뿐 아니라 모델 저장소에도 연결할 수 있습니다. 모델에 연결된 주석은 모델에 "전역적"인 주석 인스턴스를 나타냅니다.