데이터베이스 리팩터링의 확장성 개요

데이터베이스 리팩터링의 기능을 확장하여 새 리팩터링 형식을 제공하거나 새 파일 형식을 리팩터링할 수 있습니다. 기능 확장을 만들어 데이터베이스 리팩터링에 대해 두 가지 확장성 형식을 모두 구현할 수 있습니다. 데이터베이스 리팩터링에 대한 기능 확장을 만들려면 먼저 데이터베이스 리팩터링의 구성 요소가 상호 작용하는 방식 및 이러한 구성 요소를 확장할 수 있는 위치를 이해해야 합니다.

데이터베이스 리팩터링이 새로운 대상으로 수행되도록 하려면 RefactoringContributor 추상 기본 클래스에서 상속하여 사용자 지정 리팩터링 참가자를 만들 수 있습니다. 예를 들어 데이터베이스 프로젝트에 포함된 텍스트 파일이나 XML 파일로의 리팩터링을 지원할 수 있습니다.

Visual Studio Premium 또는 Visual Studio Ultimate에 포함되지 않은 새 리팩터링 형식을 사용하도록 설정하려면 RefactoringOperation 추상 기본 클래스에서 상속하여 사용자 지정 리팩터링 작업을 만듭니다. 예를 들어 일련의 개별 IF 문에서 중첩된 조건부를 가드 절로 바꾸는 새 리팩터링 형식을 구현할 수 있습니다.

데이터베이스 리팩터링 및 리팩터링 참가자

다음 다이어그램에서는 데이터베이스 리팩터링에서 리팩터링 참가자로 알려진 구성 요소를 사용하여 특정 리팩터링 형식을 처리하는 방법을 보여 줍니다.

데이터베이스 리팩터링의 확장성 개요

데이터베이스 리팩터링의 확장성 개요

현재 Visual Studio 세션에서 처음으로 데이터베이스 리팩터링 작업을 적용하는 경우 리팩터링 기능이 모든 리팩터링 형식 및 참가자와 함께 로드됩니다. 지정한 명령이 리팩터링 기능에 전달되고 지정한 리팩터링 형식이 시작됩니다. 리팩터링 참가자 관리자는 지정한 리팩터링 형식에 대해 등록된 각 참가자를 반복합니다. 각 참가자 형식은 서로 다른 개체나 개체 집합에 적용되며, 각 형식에 서로 다른 데이터 흐름을 지정할 수 있습니다.

새 리팩터링 형식을 구현하는 경우 해당 형식의 리팩터링 작업을 지원하는 데 필요한 참가자를 만들어야 합니다. 예를 들어 중첩된 조건부를 가드 절로 바꾸는 새 리팩터링 형식을 만들 수 있습니다. 해당 리팩터링 형식은 프로시저나 함수의 본문만 변경하고 데이터베이스 개체의 이름을 변경하지 않으므로 스키마 개체 참가자와 스크립트 참가자만 만들면 됩니다.

스키마 개체 참가자

다음 다이어그램에서는 데이터베이스 스키마 개체를 처리하는 리팩터링 참가자의 데이터 흐름을 보여 줍니다.

스키마 개체 참가자의 데이터 흐름

스키마 개체 참가자의 데이터 흐름

스키마 개체 참가자가 스키마 개체의 정의를 업데이트합니다. 참가자는 데이터 스키마 모델의 COW(기록 중 복사) 저장소를 업데이트합니다. 업데이트된 모델 요소가 스크립트 DOM(스크립트 도메인 개체 모델) 빌더에 전달되어 업데이트된 스크립트 DOM을 생성하는 데 사용됩니다. 스크립트 DOM Diff 엔진에서 업데이트된 스크립트 DOM을 해당 개체의 원래 정의에 사용된 스크립트 DOM과 비교하며 업데이트된 스크립트가 생성됩니다.

참조 참가자

다음 다이어그램에서는 개체 간의 참조를 처리하는 참조 참가자의 데이터 흐름을 보여 줍니다.

참조 참가자의 데이터 흐름

참조 참가자의 데이터 흐름

참조 참가자는 데이터 스키마 모델에서 모든 참조와 해당 오프셋을 검색하고 데이터 스키마 모델의 COW(기록 중 복사) 저장소에서 참조를 업데이트합니다. 업데이트된 스크립트 DOM을 원래 스크립트 DOM과 비교하고 그 결과를 사용하여 변경된 참조를 포함하는 스크립트를 업데이트합니다.

데이터 생성 계획 및 데이터베이스 단위 테스트 참가자

다음 다이어그램에서는 데이터 생성 계획 및 데이터베이스 단위 테스트 참가자의 데이터 흐름을 보여 줍니다.

데이터 생성 계획 및 데이터베이스 단위 테스트 참가자의 데이터 흐름

DGen 및 UnitTest 참가자의 데이터 흐름

데이터 생성 계획의 참가자는 XPathNavigator를 사용하여 XML 파일인 데이터 생성 계획에서 변경 내용을 찾아 업데이트합니다.

데이터베이스 단위 테스트 참가자는 데이터베이스 단위 테스트를 위해 .resx 파일을 분석하고 이 파일에 저장된 스크립트 문자열을 추출합니다. 이러한 스크립트 문자열은 데이터베이스 스크립트 참가자와 동일한 데이터 흐름을 사용하여 처리됩니다.

데이터베이스 스크립트 참가자

다음 다이어그램에서는 데이터베이스 스크립트 참가자의 데이터 흐름을 보여 줍니다.

데이터베이스 스크립트 참가자의 데이터 흐름

데이터베이스 스크립트 참가자의 데이터 흐름

데이터베이스 스크립트 참가자는 배포 전 스크립트 및 배포 후 스크립트, 다른 .sql 스크립트, 데이터베이스 단위 테스트에서 추출한 SQL 스크립트 문자열의 업데이트를 처리합니다. 모델 작성기는 이 스크립트를 사용하여 데이터 스키마 모델의 임시 저장소에 해당 모델을 빌드합니다. 임시 저장소는 수정된 스크립트 DOM 모델을 만드는 데 사용됩니다. 이 수정된 모델을 원래 스크립트의 모델과 비교하고 그 차이를 사용하여 최종 업데이트된 스크립트를 생성합니다.

사용자 지정 참가자

고유한 사용자 지정 참가자를 만들어 이 항목의 앞부분에서 설명하지 않은 추가 리팩터링 대상을 지원할 수 있습니다. 예를 들어 사용자 지정 참가자를 만들어 텍스트 파일, 데이터베이스 설명서 또는 타사 도구의 출력을 업데이트할 수 있습니다. 리팩터링 대상을 지원하는 데 필요한 올바른 데이터 흐름을 확인해야 합니다. 새 대상 형식이 기존 참가자의 대상 형식과 비슷한 경우 이 항목의 앞부분에서 설명한 형식을 참조해야 합니다.

데이터베이스 리팩터링 형식

새 리팩터링 형식을 만들어 새로운 형식의 리팩터링을 사용하도록 설정할 수 있습니다. 다음과 같은 기본 클래스에서 상속되는 클래스를 4개 이상 구현하여 새 리팩터링 형식을 만듭니다.

  • RefactoringCommand
    이 클래스를 등록하여 새 리팩터링 형식을 제공합니다. 이 클래스는 명령을 사용할 수 있어야 하는 모델 요소를 지정하고, 사용자가 명령을 클릭하면 리팩터링 작업을 호출합니다.

  • RefactoringOperation
    이 클래스는 리팩터링 작업이 미리 보기 창과 상호 작용하는 방식을 지정하고, 작업을 설명하는 속성을 지정하고, ContributorInput을 만듭니다.

  • ContributorInput
    이 클래스는 입력 데이터를 RefactoringContributor에 저장합니다. 주 참가자가 리팩터링 작업을 완료하는 데 보조 참가자가 필요한 경우 ContributorInput에서 파생된 클래스를 여러 개 만들어야 할 수도 있습니다. 예를 들어 개체 이름을 변경하는 경우 개체 자체뿐 아니라 개체에 대한 모든 참조를 수정해야 합니다. 따라서 기호에 사용되는 ContributorInput과 기호에 대한 모든 참조에 사용되는 ContributorInput을 각각 하나씩 만듭니다.

  • RefactoringContributor
    이 클래스는 지정된 입력에 따라 변경 제안 목록을 빌드합니다. ContributorInput과 마찬가지로 RefactoringContributor에서 파생된 클래스를 여러 개 만들어야 할 수도 있습니다. 보조 ContributorInput이 필요한 경우 주 RefactoringContributor에서 해당 입력을 만듭니다. 리팩터링 참가자와 호환되는 데이터베이스 스키마 공급자를 선언해야 합니다. 또한 리팩터링 형식과 리팩터링 명령의 모든 참가자를 등록해야 합니다.

데이터베이스 리팩터링 대상

등록된 리팩터링 형식을 확장하여 새 모델 요소 형식이나 새 파일과 같은 새로운 대상으로 수행되도록 할 수 있습니다. 리팩터링이 새로운 대상으로 수행될 수 있게 하려면 새 리팩터링 참가자를 만들어야 합니다. 새 참가자는 해당 리팩터링 형식에 대해 정의된 ContributorInputs 중 하나에서 작업할 수 있어야 합니다. 다음과 같은 기본 클래스에서 상속되는 클래스를 하나 이상 구현하여 새 리팩터링 대상이나 참가자를 만듭니다.

  • RefactoringContributor
    이 클래스는 지정된 입력에 따라 변경 제안 목록을 빌드합니다. 리팩터링 참가자와 호환되는 데이터베이스 스키마 공급자를 선언해야 하며, 리팩터링 형식의 모든 참가자를 등록해야 합니다.