마이크로소프트 데이터 액세스 컴포넌트

**마이크로소프트 데이터 접근 컴포넌트**(Microsoft Data Access Components, **MDAC**, **Windows DAC**으로도 알려져 있음)는 프로그래머가 거의 모든 자료 저장소에 접근할 수 있는 응용 프로그램을 개발할 수 있도록 해주는 상호 관련된 마이크로소프트 기술의 소프트웨어 프레임워크이다. 이 구성 요소에는 액티브엑스 데이터 오브젝트 (ADO), OLE DB, ODBC가 포함된다. 또한 젯 데이터베이스 엔진, MSDASQL (ODBC용 OLE DB 제공자), 원격 데이터 서비스(RDS)와 같이 더 이상 사용되지 않는 구성 요소도 있었다. 이전의 데이터 접근 객체 API 및 원격 데이터 오브젝트와 같이 일부 구성 요소는 구식화되기도 했다.

MDAC의 첫 번째 버전은 1996년 8월에 출시되었다. 당시 마이크로소프트는 MDAC가 독립형 프로그램이라기보다는 개념에 가까우며 광범위한 배포 방법이 없다고 밝혔다. 이후 마이크로소프트는 웹 기반 재배포 가능한 패키지 형태로 MDAC 업그레이드를 출시했다. 결국, 이후 버전은 마이크로소프트 윈도우 및 인터넷 익스플로러에 통합되었고, MDAC 2.8 SP1에서는 MDAC를 재배포 가능한 패키지로 제공하는 것을 중단했다.

역사 전반에 걸쳐 MDAC는 여러 보안 결함의 대상이 되어 권한 상승 공격과 같은 공격으로 이어졌지만, 이러한 취약점은 일반적으로 이후 버전에서 신속하게 수정되었다. 현재 버전은 2.8 서비스 팩 1이지만, 이 제품은 다양한 버전을 거쳤고 많은 구성 요소가 더 새로운 마이크로소프트 기술로 대체되거나 더 이상 사용되지 않게 되었다. MDAC는 이제 윈도우 비스타에서 Windows DAC으로 알려져 있다.

## 아키텍처
MDAC의 최신 버전 (2.8)은 여러 상호 작용하는 구성 요소로 이루어져 있으며, 이들 중 ODBC (여러 플랫폼에서 사용 가능)를 제외하고는 모두 Windows 전용이다. MDAC 아키텍처는 프로그래밍 인터페이스 계층( ADO 및 ADO.NET으로 구성), 오라클 및 마이크로소프트와 같은 데이터베이스 공급업체가 개발한 데이터베이스 접근 계층( OLE DB, .NET 관리형 제공자 및 ODBC 드라이버), 그리고 데이터베이스 자체의 세 계층으로 볼 수 있다. 이러한 구성 요소 계층은 MDAC 애플리케이션 프로그래밍 인터페이스를 통해 애플리케이션에서 모두 사용할 수 있다. 마이크로소프트 SQL 서버에 특정한 독점적인 접근 방식인 마이크로소프트 SQL 서버 네트워크 라이브러리도 MDAC에 포함되어 있다. 윈도우 애플리케이션 개발자는 데이터 접근을 위해 ADO 또는 ADO.NET을 사용하는 것이 권장되며, 이는 애플리케이션 프로그램 사용자가 MDAC에서 지원하는 데이터베이스 아키텍처를 선택하는 데 제약을 받지 않는다는 이점이 있다. 물론 개발자는 여전히 OLE DB 및 ODBC에 직접 접근하는 애플리케이션을 작성할 수 있다.

### 마이크로소프트 SQL 서버 네트워크 라이브러리
마이크로소프트 SQL 서버 네트워크 라이브러리(Net-Lib라고도 함)는 SQL 서버에서 여러 네트워크 프로토콜을 사용하여 데이터를 읽고 쓰는 데 사용된다. Net-Lib는 SQL 서버에 특화되어 있지만 마이크로소프트는 이를 MDAC에 포함시킨다. SQL 서버는 Open Data Services (ODS) 라이브러리를 사용하여 Net-Lib와 통신하며, Net-Lib는 윈도우 NT 운영 체제 라인의 Win32 서브시스템과 직접 인터페이스한다. SQL 서버 네트워크 라이브러리는 SQL 서버에 번들로 제공되는 클라이언트 네트워크 유틸리티를 사용하여 제어된다.

Net-Lib가 지원하는 각 네트워크 프로토콜에는 별도의 드라이버(장치 드라이버와 혼동하지 말 것)가 있으며, 프로토콜 스택에 세션 계층을 지원한다. Net-Lib에는 두 가지 일반적인 유형이 있다: 기본 Net-Lib와 보조 Net-Lib. 기본 Net-Lib는 슈퍼 소켓 Net-Lib와 공유 메모리 Net-Lib로 구성되며, TCP/IP 및 네임드 파이프 네트워크 라이브러리(네임드 파이프는 시스템에 영구적인 파이프라인을 통해 다른 프로세스와 통신하는 방법)를 포함하여 수많은 보조 Net-Lib가 있다. 마이크로소프트 OLE DB 제공자 for SQL Server (SQLOLEDB)는 기본 Net-Lib를 통해 통신한다.

슈퍼 소켓 Net-Lib는 컴퓨터 간 통신을 처리하고 보조 Net-Lib를 조정한다. 단, TCP/IP 보조 Net-Lib는 Windows Sockets 2 API를 직접 호출한다는 점에서 예외이다. Banyan VINES, AppleTalk, ServerNet, IPX/SPX, Giganet 및 RPC Net-Lib는 MDAC 2.5부터 제외되었다. 네트워크 라이브러리 라우터는 이 모든 프로토콜을 관리하는 역할을 했지만, 현재는 네임드 파이프 보조 Net-Lib만 라우터에 의해 관리된다. 슈퍼 소켓 Net-Lib는 윈도우 SSL API를 사용하여 데이터 암호화도 처리한다.

반면에 공유 메모리 Net-Lib는 한 컴퓨터에 존재하는 여러 SQL 서버 인스턴스 간의 연결을 관리한다. 프로세스 간 통신을 위해 공유 메모리 영역을 사용한다. 이는 본질적으로 안전하다. 운영 체제가 다른 프로세스에서 인스턴스의 공유 메모리 영역에 접근하는 것을 허용하지 않으므로 한 컴퓨터에 존재하는 SQL 서버 인스턴스 간에 데이터 암호화가 필요 없다.

Net-Lib는 또한 인증된 연결(신뢰할 수 있는 연결이라고 함)을 지원하는 프로토콜에 대해 로그인한 사용자의 보안 컨텍스트를 가장하는 기능도 지원한다. 이를 통해 Net-Lib는 윈도우 인증을 사용하여 통합된 로그온 인증 메커니즘을 제공한다. 윈도우 인증은 윈도우 98 또는 윈도우 미에서는 지원되지 않는다.

### OLE DB
OLE DB (OLEDB 또는 OLE-DB라고도 함)는 MDAC 애플리케이션이 다양한 유형의 자료 저장소에 균일한 방식으로 접근할 수 있도록 한다. 마이크로소프트는 이 기술을 사용하여 애플리케이션을 데이터 저장소에서 분리하여 웹사이트에서 접근해야 하는 데이터를 저장할 수 있도록 했다. 이는 다양한 애플리케이션이 다양한 유형 및 소스의 데이터에 접근해야 하며, 기술별 기능을 접근하는 방법을 반드시 알 필요는 없기 때문이다. 이 기술은 개념적으로 소비자와 제공자로 나뉜다. 소비자는 데이터에 접근해야 하는 애플리케이션이며, 제공자는 컴포넌트 오브젝트 모델 (또는 COM)을 사용하여 OLE DB 인터페이스를 노출하는 소프트웨어 구성 요소이다.

OLE DB는 MDAC에서 사용하는 데이터베이스 접근 인터페이스 기술이다. OLE DB 제공자는 텍스트 파일이나 스프레드시트와 같은 간단한 데이터 저장소부터 Oracle 및 SQL 서버와 같은 복잡한 데이터베이스에 접근하기 위해 생성될 수 있다. 그러나 다른 데이터 저장소 기술은 다른 기능을 가질 수 있으므로 OLE DB 제공자는 가능한 모든 사용 가능한 인터페이스를 구현하지 않을 수 있다. 사용 가능한 기능은 COM 객체를 사용하여 구현된다. OLE DB 제공자는 데이터 저장소 기술의 기능을 특정 COM 인터페이스에 매핑한다. 마이크로소프트는 인터페이스의 가용성을 "제공자별"이라고 부르는데, 이는 관련된 데이터베이스 기술에 따라 적용되지 않을 수 있기 때문이다. 또한 제공자는 데이터 저장소의 기능을 증강할 수도 있다. 이러한 기능은 마이크로소프트 용어로 서비스라고 알려져 있다.

SQL Server용 마이크로소프트 OLE DB 공급자(SQLOLEDB)는 마이크로소프트가 SQL Server 6.5 버전 이상을 위해 제공하는 OLE DB 공급자이다.

### 범용 데이터 링크
범용 데이터 링크 파일(.udl 파일)은 연결 속성을 지정하기 위한 공통 사용자 인터페이스를 제공한다. 사용자는 데이터 링크 속성 대화 상자를 사용하여 연결 정보를 .udl 파일에 저장하여 연결 문자열에 직접 수동으로 지정하는 대안으로 사용할 수 있다. 결과적으로 이 파일은 편리한 수준의 간접성을 제공한다. 또한 대화 상자는 다양한 대상 애플리케이션을 위한 여러 대체 OLE DB 데이터 공급자를 지정한다.

### ODBC
ODBC는 프로그래밍 언어 (주로 C)를 통해 접근되는 네이티브 인터페이스로, 네이티브 라이브러리를 호출할 수 있다. MDAC에서 이 인터페이스는 DLL로 정의된다. 접근해야 하는 각 데이터베이스에는 별도의 모듈 또는 드라이버가 필요하다. ODBC API의 함수는 이러한 DBMS별 드라이버에 의해 구현된다. 마이크로소프트가 MDAC에서 제공하는 드라이버는 SQL Server ODBC 드라이버(SQLODBC)라고 불리며, 이름에서 알 수 있듯이 마이크로소프트의 SQL Server를 위해 설계되었다. SQL Server v6.5 이상을 지원한다. ODBC를 통해 프로그램은 데이터베이스의 독점적인 인터페이스를 알 필요 없이 데이터베이스에 접근할 SQL 요청을 사용할 수 있다. SQL 요청을 처리하고 개별 데이터베이스 시스템이 이해하는 요청으로 변환한다. 마이크로소프트에 따르면, "SQL Server 2012 이후에는 ODBC 드라이버가 마이크로소프트 윈도우 애저 SQL 데이터베이스를 포함한 최신 서버 기능을 위해 업데이트되어 마이크로소프트 SQL Server용 ODBC 드라이버로 출시될 것이다."

### ADO
액티브엑스 데이터 오브젝트 (**ADO**)는 OLE DB에 대한 상위 수준 프로그래밍 인터페이스이다. 계층적 객체 모델을 사용하여 애플리케이션이 OLE DB가 지원하는 소스로부터 데이터를 프로그래밍 방식으로 생성, 검색, 업데이트 및 삭제할 수 있도록 한다. ADO는 일련의 계층적 COM 기반 객체와 컬렉션(다른 많은 객체의 컨테이너 역할을 하는 객체)으로 구성된다. 프로그래머는 ADO 객체에 직접 접근하여 데이터를 조작하거나, 여러 ADO 메커니즘을 통해 데이터베이스에 SQL 쿼리를 보낼 수 있다. ADO는 9개의 객체와 4개의 컬렉션으로 구성된다.

컬렉션은 다음과 같다:
# **필드(Fields):** 이 컬렉션은 Field 객체 집합을 포함한다. 컬렉션은 Recordset 객체 또는 Record 객체에서 사용될 수 있다. Recordset 객체에서 Fields 컬렉션을 구성하는 각 Field 객체는 해당 Recordset 객체의 컬럼에 해당한다. Record 객체에서 Field는 트리 구조 네임스페이스(반정형 데이터 공급자, 예를 들어 Microsoft OLE DB Provider for Internet Publishing에 사용됨)를 가리키는 절대 또는 상대 URL이거나 해당 Record 객체와 관련된 기본 Stream 객체에 대한 참조일 수 있다.
# **속성(Properties):** 객체는 하나 이상의 Property 객체를 가질 수 있으며, 이는 객체의 Properties 컬렉션에 포함된다.
# **매개변수(Parameters):** Command 객체는 미리 정의된 동작을 변경하기 위해 여러 Parameter 명령을 가질 수 있으며, 각 Parameter 객체는 Command 객체의 Parameters 컬렉션에 포함된다.
# **오류(Errors):** 모든 제공자 생성 에러는 Error 객체의 컬렉션에 전달되며, Errors 컬렉션 자체는 Connection 객체에 포함된다. ADO 작업이 오류를 생성하면 컬렉션이 지워지고 컬렉션에 새 Error 객체 그룹이 생성된다.

객체는 다음과 같다.
# **연결(Connection):** 연결 객체는 OLE DB를 통한 데이터 저장소에 대한 ADO의 연결이다. 연결 객체는 세션에 대한 정보를 저장하고 데이터 저장소에 연결하는 메서드를 제공한다. 일부 데이터 저장소에는 연결을 설정하는 다른 메서드가 있으므로 특정 OLE DB 공급자에 대한 연결 객체에서 일부 메서드가 지원되지 않을 수 있다. 연결 객체는 키-값 쌍 목록으로 연결을 지정하는 연결 문자열(예: "`Provider='SQLOLEDB';Data Source='TheSqlServer'; Initial Catalog='Northwind';Integrated Security='SSPI';`")을 사용하여 'Open' 메서드로 데이터 저장소에 연결한다. 그 시작은 연결 객체가 요구하는 데이터 저장소 연결 유형을 식별해야 한다. 이는 다음 중 하나여야 한다.
#* "provider=" 구문을 사용하는 OLE DB 공급자(예: SQLOLEDB)
#* "file name=" 구문을 사용하는 파일 이름
#* "Remote provider=" 및 "Remote server=" 구문을 사용하는 원격 공급자 및 서버( RDS 참조)
#* "URL=" 구문을 사용하는 절대 URL
# **명령(Command):** 연결 객체가 데이터 소스에 대한 세션을 설정한 후, 명령 객체를 통해 데이터 공급자에게 명령이 전송된다. 명령 객체는 CommandText 속성을 사용하여 SQL 쿼리를 공급자에게 직접 보낼 수 있고, Parameter 객체 또는 Parameters 컬렉션을 사용하여 매개변수화된 쿼리 또는 저장 프로시저를 보내거나, Execute 메서드를 통해 쿼리를 실행하고 결과를 데이터셋 객체로 반환할 수 있다. Stream, RecordSet 또는 Connection 객체와 관련된 Command 객체에서 사용할 수 있는 다른 여러 메서드가 있다.
# **레코드셋(Recordset):** 레코드셋은 레코드 그룹이며, 기본 테이블에서 오거나 테이블에 대한 쿼리 결과로 올 수 있다. RecordSet 객체는 Fields 컬렉션과 Properties 컬렉션을 포함한다. Fields 컬렉션은 Field 객체 집합으로, 테이블의 해당 컬럼이다. Properties 컬렉션은 Property 객체 집합으로, OLE DB 공급자의 특정 기능을 정의한다. RecordSet은 내부에 존재하는 데이터를 검사하기 위한 수많은 메서드와 속성을 가지고 있다. 레코드셋의 레코드는 레코드의 값을 변경한 다음 `Update` 또는 `UpdateBatch` 메서드를 호출하여 업데이트할 수 있다. 새 레코드를 추가하는 것은 `AddNew` 함수를 통해 수행한 다음 `Update` 또는 `UpdateBatch` 메서드를 호출하여 수행된다. 레코드도 Delete 메서드를 사용하여 레코드셋에서 삭제한 다음 Update 메서드를 호출하여 삭제한다. 그러나 참조 무결성 위반과 같은 이유로 삭제가 발생할 수 없는 경우, 레코드셋은 `Update` 메서드 호출 후에도 편집 모드로 유지된다. 프로그래머는 업데이트를 취소하기 위해 `CancelUpdate` 함수를 명시적으로 호출해야 한다. 또한 ADO는 트랜잭션(지원되는 경우)을 롤백하고 일괄 업데이트를 취소할 수 있다. 레코드셋은 다음 세 가지 방법 중 하나로 업데이트될 수도 있다: 즉시 업데이트, 일괄 업데이트, 또는 트랜잭션 사용:
## **즉시(Immediate):** 레코드셋은 `adLockOptimistic` 또는 `adLockPessimistic` 잠금을 사용하여 잠긴다. 레코드가 변경되고 `Update` 메서드가 호출된 후 데이터 소스에서 데이터가 업데이트된다.
## **일괄(Batch):** 레코드셋은 `adLockBatchOptimistic`을 사용하여 잠기고, `Update`가 호출될 때마다 데이터는 임시 버퍼에서 업데이트된다. 마지막으로 `UpdateBatch`가 호출될 때 데이터는 데이터 소스에서 완전히 업데이트된다. 이것은 모든 작업이 메모리에서 수행된다는 장점이 있으며, 문제가 발생하면 `UpdateCancel`이 호출되어 업데이트가 데이터 소스로 전송되지 않는다.
## **트랜잭션(Transaction):** OLE DB 공급자가 허용하는 경우, 트랜잭션을 사용할 수 있다. 트랜잭션을 시작하려면 프로그래머는 `BeginTrans` 메서드를 호출하고 필요한 업데이트를 수행한다. 모든 작업이 완료되면 프로그래머는 `CommitTrans` 메서드를 호출한다. `RollbackTrans`는 트랜잭션 내에서 수행된 모든 변경 사항을 취소하고 데이터베이스를 트랜잭션 시작 전 상태로 롤백하는 데 호출될 수 있다.
# **레코드(Record):** 이 객체는 데이터베이스의 한 레코드를 나타내며 필드 컬렉션을 포함한다. 레코드셋은 Record 객체 컬렉션으로 구성된다.
# **스트림(Stream):** 주로 RecordSet 객체에서 사용되는 스트림은 바이트 스트림을 읽고 쓰는 수단이다. 주로 레코드셋을 XML 형식으로 저장하는 데 사용되며, CommandText 객체의 대안으로 OLE DB 제공자에게 명령을 보내거나 이진 또는 텍스트 파일의 내용을 포함하는 데 사용된다.
# **매개변수(Parameter):** 매개변수는 공통 기능의 동작을 변경하는 수단으로, 예를 들어 저장 프로시저는 수행해야 할 작업에 따라 다른 매개변수를 전달받을 수 있다. 이를 매개변수화된 명령이라고 한다.
# **필드(Field):** 각 Record 객체는 많은 필드를 포함하며, RecordSet 객체도 해당 Field 객체를 가지고 있다. RecordSet 객체의 Field 객체는 참조하는 데이터베이스 테이블의 컬럼에 해당한다.
# **속성(Property):** 이 객체는 OLE DB 공급자에 특화되어 있으며, 공급자가 구현한 기능을 정의한다. 속성 객체는 내장 속성(ADO에 의해 이미 구현되어 변경할 수 없는 잘 정의된 속성)이거나 동적 속성(기본 데이터 공급자에 의해 정의되며 변경될 수 있는 속성)일 수 있다.
# **오류(Error):** ADO 사용 중 OLE DB 공급자 에러가 발생하면 Errors 컬렉션에 Error 객체가 생성된다. 그러나 다른 오류는 Error 객체에 들어가지 않는다. 예를 들어, RecordSet 또는 Field 객체에서 데이터를 조작할 때 발생하는 모든 오류는 Status 속성에 저장된다.

### ADO.NET
ADO.NET은 ADO의 최신 버전(ADO 2.8 이후, 현재는 ADO Classic으로 자주 언급됨)으로, 클래식 ADO와 함께 MDAC 2.8 스택의 일부이다. 마이크로소프트 .NET을 중심으로 구축되었다. 때로는 ADO의 진화적인 단계로 여겨지기도 하지만, 마이크로소프트에 의해 몇 가지 근본적인 구조적 변경이 이루어졌다. ADO.NET은 .NET 관리형 공급자(특히 .NET용으로 설계된 OLE DB 공급자의 수정 버전)를 통해 실행된다. 객체 구조는 더 이상 Recordset 객체를 중심으로 구축되지 않는다. 대신 Dataset 객체가 여러 소스에서 수집된 데이터를 포함하는 데 사용된다. 이는 프로그래머에게 투명하다. 이전 ADO Recordset과 달리 Dataset의 설계는 연결되지 않은 데이터 사용을 촉진한다. 개념적으로 Dataset 객체는 자체적으로 작은 인메모리 관계형 데이터베이스로 볼 수 있으며, 데이터를 어떤 방향으로든 조작할 수 있다. 데이터베이스에 변경 사항을 다시 전파하기 위해 데이터 어댑터 객체가 사용되어 데이터 소스와 DataSet 객체 간에 데이터를 전송한다. 커서도 ADO.NET에서 더 이상 사용되지 않으며, 데이터 리더 객체로 대체되었다. 이 객체는 대량의 결과를 한 번에 한 레코드씩 저장하지 않고 효율적으로 처리하는 데 사용된다.

## 더 이상 사용되지 않거나 구식화된 구성 요소
MDAC는 지속적으로 진화하는 구성 요소 프레임워크이다. 따라서 이전에 MDAC의 일부였지만 이후에 더 이상 사용되지 않거나 프레임워크에서 완전히 제거된 여러 구성 요소가 있다.

### 젯 데이터베이스 엔진 및 JRO

Jet은 Joint Engine Technology의 약자이며 마이크로소프트 액세스, 마이크로소프트 익스체인지 서버 및 비주얼 베이직에 사용되는 데이터베이스 엔진이었다. Jet은 관계형 데이터베이스 관리 시스템 (RDBMS)의 일부였으며 다른 소프트웨어가 마이크로소프트 데이터베이스에 접근하는 데 사용할 수 있는 단일 인터페이스를 제공했다. Jet은 또한 보안, 참조 무결성, 트랜잭션 처리, 색인, 레코드 및 페이지 잠금, 데이터 복제를 지원했다. 이후 Jet 버전에서는 엔진이 확장되어 SQL 쿼리를 실행하고, 문자 데이터를 유니코드 형식으로 저장하고, 뷰를 생성하고, 마이크로소프트 SQL 서버와의 양방향 복제를 허용했다. 이는 MSDE에 의해 대체되었고, MSDE는 SQL Server Express에 의해 대체되었다.

Jet에는 세 가지 모듈이 있었다. 하나는 **네이티브 Jet ISAM 드라이버**로, 마이크로소프트 액세스 데이터베이스 파일(MDB)을 직접 조작할 수 있는 Jet 동적 연결 라이브러리 (DLL)였으며, 이는 색인 순차 접근 방식 (ISAM) 데이터베이스의 수정된 형태였다. 다른 모듈은 Xbase, Paradox, Btrieve 및 FoxPro 파일을 포함하여 ISAM 데이터베이스에 접근할 수 있는 DLL인 **ISAM 드라이버**였다. 최종 모듈은 **데이터 접근 객체 (DAO) DLL**이었으며, DAO를 통해 프로그래머는 Jet 엔진에 접근할 수 있었다. 기본적으로 Access Basic 및 비주얼 베이직 애플리케이션 개발자가 Jet에 접근하는 데 사용하는 객체 지향 데이터 언어였다.

마찬가지로, Jet 데이터 소스 간 복제를 허용하는 마이크로소프트 Jet OLE DB 제공자 및 복제 객체(JRO)는 MDAC 2.6에서 제거되었다.

### MSDASQL 및 오라클 ODBC
ODBC용 마이크로소프트 OLE DB 제공자인 `MSDASQL`은 모든 ODBC 드라이버를 통해 액티브엑스 데이터 오브젝트가 데이터베이스에 접근할 수 있도록 하는 OLE DB 제공자였다. 마이크로소프트는 여러 OLE-DB 제공자(인덱싱 서비스용, 액티브 디렉터리용, Jet용, SQL 서버용, Oracle용(`MSDAORA`) 및 인터넷 퍼블리싱용)를 제공했지만, 달리 지시하지 않는 한 ADO는 MSDASQL을 기본 제공자로 사용했다. MDAC 2.5 이후에는 Oracle ODBC 드라이버와 MSDASQL 모두 Oracle 7을 지원하고 Oracle 8i를 부분적으로 지원했다. 지원되지 않는 기능은 다음과 같다.

* CLOB, BLOB, BFILE, NCHAR, NCLOB, NVARCHAR2 오라클 데이터 형식
* Oracle 7.x 및 8i에 대한 유니코드 지원
* 다중 클라이언트 오라클 인스턴스
* 중첩된 외부 조인

마이크로소프트는 처음에 64비트 운영 체제에서 MSDASQL 구성 요소를 더 이상 사용하지 않게 했다. 그리고 마이크로소프트 오라클 ODBC 드라이버는 나중에 .NET 관리형 오라클 제공자로 대체되었으며, 이는 오라클 9i를 지원했다. 그러나 Windows Server 2008 및 윈도우 비스타 SP1은 MSDASQL의 64비트 버전을 함께 제공한다.

### 원격 데이터 서비스 (RDS)
원격 데이터 서비스(RDS)는 서버에서 데이터 세트를 검색하여 클라이언트가 어떤 식으로든 변경한 다음 추가 처리를 위해 서버로 다시 보내는 것을 허용했다. 루프 및 조건문과 같은 프로그래밍 구조로 SQL을 확장하는 트랜잭트 SQL의 대중적인 채택으로 인해 이는 덜 필요해졌고, 결국 MDAC 2.7에서 더 이상 사용되지 않게 되었다. 마이크로소프트는 클라이언트가 개방형 XML 기반 표준을 통해 이를 수행할 수 있도록 SOAP Toolkit 2.0을 제작했다.

### SQLXML
SQLXML은 SQL Server 2000용으로 설계되었지만, MDAC 2.6과 함께 사용이 중단되었다. 이는 마이크로소프트의 관계형 데이터베이스가 XPath를 통해 표시되고 데이터가 XML 파일로 표시될 수 있도록 했다. 실제로 사용이 중단된 것은 아니지만 이후 MDAC 버전에서 제거되었고, 마이크로소프트는 이를 다운로드 가능한 구성 요소로 제공하며 64비트 운영 체제에서 지원할 예정이다.

### 구식화된 구성 요소
마이크로소프트는 MDAC에서 여러 구성 요소를 완전히 제거했으며 더 이상 지원하지 않는다. 다음과 같다.
* **ESQL/C:** 임베디드 SQL (E-SQL 또는 ESQL/C라고도 함)은 Visual C로 프로그래밍할 때 SQL을 사용하는 방법이다. 마이크로소프트는 SQL Server 6.5가 출시된 후 이에 대한 지원을 중단했지만, ESQL/C 런타임 환경의 일부를 COBOL 컴파일러 및 도구를 개발하는 회사인 Micro Focus에 라이선스했다.
* **DAO:** DAO, 또는 데이터 접근 객체는 마이크로소프트가 만든 객체 지향 인터페이스로, 초기 버전의 마이크로소프트 액세스 및 비주얼 베이직이 젯 데이터베이스 엔진에 접근할 수 있도록 했다. 나중에 (버전 3.5에서) Jet 엔진을 완전히 우회하고 ODBC 데이터 소스에 직접 접근할 수 있게 되었다.
* **RDO:** 원격 데이터 객체(RDO)는 ODBC를 직접 호출하는 인터페이스를 생성할 수 있는 마이크로소프트 기술이었다. RDO 버전 2.0이 마이크로소프트가 개발한 최종 버전이었다.
* **DB-라이브러리:** 애플리케이션이 SQL 서버와 상호 작용할 수 있도록 하는 C 기반 API이다. SQL 서버 2000 이후의 제품에서는 지원되지 않으며, SQL 서버 6.5 이후에는 어떤 기능도 추가되지 않았다.

## 역사
마이크로소프트는 시간이 지남에 따라 여러 버전의 MDAC를 출시했다. 배포 방법은 다양했으며 각 버전마다 기능 세트가 다르다.

### MDAC 1.0
MDAC 1.0은 1996년 8월에 처음 출시되었다. 마이크로소프트에 따르면, "MDAC 1.0은 독립 실행형 설치 프로그램이라기보다는 개념으로 존재했다." MDAC 1.0 스택은 ODBC 3.0, OLE DB 1.1, ADO 1.0 및 Advanced Data Connector (ADC) 1.0으로 구성되었다. 마이크로소프트에 따르면 ADC 1.0은 MDAC 1.5의 원격 데이터 서비스의 전신이었다. 또한 Access/Jet, SQL Server 및 Oracle 데이터베이스용 ODBC 드라이버도 포함되었다. MDAC 1.0은 여러 메커니즘을 통해 출시되었다: Advanced Data Connector는 인터넷 정보 서비스 (IIS) 3.0과 함께 제공되었고 다운로드 가능한 cab 파일로 제공되었다. OLE DB 1.1 및 ADO 1.0은 OLE DB 1.1 SDK와 함께 제공되었으며, 이는 비주얼 스튜디오 97과 함께 제공되었고 다운로드도 가능했다. MDAC 1.0은 IIS 3.0에 포함된 Active Server Pages와 함께 제공되었고, Visual InterDev 1.0과도 함께 제공되었다.

### MDAC 1.5
MDAC 1.5는 1997년 9월에서 1998년 3월 사이에 출시되었으며, MDAC 1.0보다 더 중앙 집중적인 배포 메커니즘을 사용했다. 마이크로소프트 인터넷 익스플로러 4.0, 인터넷 클라이언트 SDK 4.0과 함께 출시되었고, 1997년 전문 개발자 콘퍼런스 (PDC)에서 배포된 CD-ROM을 통해서도 제공되었다. MDAC 1.5의 다섯 가지 버전이 있었다.
* **MDAC 1.5 (초기 출시):** 인터넷 익스플로러 4.0 및 인터넷 클라이언트 SDK에 포함.
* **MDAC 1.5a:** 마이크로소프트 웹사이트에서 다운로드 가능.
* **MDAC 1.5b:** Windows NT 4.0 Option Pack 및 Office 97과 함께 제공.
* **MDAC 1.5c:** ADO 스레딩 및 ODBC 연결 풀링 문제를 수정했으며 마이크로소프트 웹사이트를 통해 배포되었다. ADO/MDAC 런타임 구성 요소만 포함되었다.
* **MDAC 1.5d:** 윈도우 98 및 인터넷 익스플로러 4.01 서비스 팩 1에 포함되었다.

MDAC 1.5의 여러 버전은 다음과 같이 구성되었다.
* ODBC 3.5
* OLE DB 1.5
* ADO 1.5
* Advanced Data Connector를 대체한 원격 데이터 서비스 1.5.

이 버전의 MDAC에는 권한 상승 공격에 취약하게 만드는 보안 결함이 있었다. 이 취약점으로 인해 IIS와 MDAC가 모두 설치된 시스템은 권한 없는 웹 사용자에게 IIS 시스템에서 권한 있는 사용자로 셸 명령을 실행할 수 있는 기능을 부여했다. 이로 인해 공격자는 멀티홈 인터넷 연결 IIS 시스템에서 공용 연결을 통해 사설 백엔드 네트워크로 SQL 및 기타 ODBC 데이터 요청을 터널링하기 위해 MDAC를 사용할 수 있었다. 또한 사용자는 IIS 시스템의 보안된, 게시되지 않은 파일에 무단으로 접근할 수 있었다.

MDAC 1.5는 Windows NT 3.51 SP5에서 지원되는 마지막 데이터 접근 구성 요소 릴리스였다.

### MDAC 2.0
MDAC 2.0은 Data Access 2.0 SDK와 함께 배포되었으며 MDAC 1.5의 내용, ODBC 3.5 SDK 및 OLE DB 1.5 SDK, OLE DB for OLAP Specification이 포함되었다. 또한 핵심 제품에 대한 많은 업데이트가 포함되었으며, IIS 서버에서 악의적으로 사용되는 것을 방지하는 RDS에 추가된 보안 기능도 포함되었다. 이 버전은 Windows NT 4.0 SP4에 포함되었고, 전체 Data Access SDK가 포함된 Visual Studio 6.0과도 함께 제공되었다.

### MDAC 2.1
MDAC 2.1은 SQL 서버 7.0 및 SQL 서버 6.5 SP5와 함께 배포되었다. MDAC 2.1 SP1은 인터넷 익스플로러 5와 함께 배포되었고, MDAC 2.1 SP1a (GA)는 마이크로소프트 오피스 2000, 백오피스 4.5 및 비주얼 스튜디오 98 SP3와 함께 배포되었다. 그러나 이러한 MDAC 버전 중 어느 것도 월드 와이드 웹을 통해 일반 대중에게 공개되지 않았다. MDAC 2.1 SP2는 마이크로소프트 웹사이트에서 배포되었다. 2.1에 포함된 구성 요소는 다음과 같다.
* ADO 2.1
* RDS 2.1
* OLE DB 2.1
* ODBC, SQL 서버 및 오라클용 OLE DB 제공자
* JRO 2.1
* Jet 드라이버
* RDO.

이 버전에는 검사되지 않은 버퍼로 인해 권한 상승 공격이 발생할 수 있는 보안 취약점이 있었다. 이는 얼마 후에 발견되었고 MDAC 2.1, 2.5, 2.6에 영향을 미쳤으며 이후 패치에서 해결되었다.

### MDAC 2.5
MDAC 2.5는 2000년 2월 17일에 출시되었으며 윈도우 2000과 함께 배포되었고, MDAC 서비스 팩은 윈도우 2000 서비스 팩과 병행하여 출시되었다. 또한 마이크로소프트 웹사이트를 통해서도 배포되었다. 세 가지 서비스 팩이 출시되었다. 2.5에 포함된 구성 요소는 다음과 같다.
* ADO 2.5
* ADO MD 2.5
* ADOX 2.5
* RDS 2.5
* OLE DB 2.5
* 다수의 OLE DB 제공자
* JRO 2.5
* ODBC 3.51
* 다수의 ODBC 드라이버
* 다수의 Jet 드라이버.

이 버전의 MDAC에서 몇 가지 문제가 발견되었다. OLE DB 세션 풀링을 사용할 때 마이크로소프트 COM+는 OLE DB를 계속 로드하고 언로드하려고 시도했으며, 이로 인해 OLE DB 세션 풀링이 CPU 사용률 100%로 실행되는 충돌이 발생할 수 있었다. 이 문제는 나중에 수정되었다. 마이크로소프트는 MDAC 2.5 서비스 팩 2 및 MDAC 2.5 서비스 팩 3에서 수정된 버그 목록을 전체 공개했다. 또한 SQL 서버 드라이버에서 검사되지 않은 버퍼가 발견되어 보안 취약점(나중에 수정됨)이 존재했다. 이 결함은 MDAC 2.5 SP2에서 도입되었다.

### MDAC 2.6
MDAC 2.6은 2000년 9월에 출시되었으며 웹을 통해 마이크로소프트 SQL 서버 2000과 함께 배포되었다. MDAC 2.6 RTM, SP1 (2001년 6월 20일 출시), SP2 (2002년 6월 11일 출시)는 마이크로소프트 SQL 서버 2000 서비스 팩과 병행하여 배포되었으며 마이크로소프트 웹사이트에서도 다운로드할 수 있었다.

이 MDAC 버전부터 마이크로소프트 Jet, 마이크로소프트 Jet OLE DB 제공자, ODBC 데스크톱 데이터베이스 드라이버는 포함되지 않았다. 대신 이들은 수동으로 설치할 수 있었다. 마이크로소프트는 또한 SQL 서버 7.0 클러스터에 MDAC 2.6을 설치하지 말라는 경고를 발표했다. "클러스터의 노드에 직접 또는 다른 프로그램 설치를 통해 MDAC 2.6 이상을 설치하면 SQL 서버 에이전트 또는 다른 SQL 서버 서비스에 치명적인 오류가 발생할 수 있기 때문"이었다. 이 문제는 Veritas Software의 윈도우 서버용 Backup Exec 9.0에 영향을 미쳤다. Backup Exec 9.0은 마이크로소프트 SQL 서버 2000 데스크톱 엔진(MSDE 2000)을 데이터베이스로 설치하기 때문이었다. 리비전 4367은 MDAC 버전 2.6 SP2를 설치했고, 리비전 4454는 MDAC 버전 2.7 SP1을 설치했는데, 이 버전에는 문제가 없었다.

### MDAC 2.7
MDAC 2.7은 2001년 10월에 마이크로소프트 웹사이트를 통해 출시되었다. 2002년 4월에는 윈도우 XP 출시와 마이크로소프트 웹사이트를 통해 새로 고침 릴리스가 발행되었다. 버전 2.7은 미국 영어, 중국어(번체 및 간체), 독일어, 일본어, 한국어, 브라질 포르투갈어, 체코어, 덴마크어, 그리스어, 슬로바키아어, 슬로베니아어, 스페인어, 핀란드어, 프랑스어, 헝가리어, 이탈리아어, 네덜란드어, 노르웨이어, 폴란드어, 포르투갈어, 러시아어, 스웨덴어, 튀르키예어로 제공되었다. 히브리어 및 아랍어는 윈도우 XP를 통해서만 사용 가능했다.

주요 기능 변경 사항은 마이크로소프트의 64비트 운영 체제 지원이었으나, Banyan VINES 지원은 이 MDAC 버전에서 제외되었다. 몇 가지 알려진 문제가 있었다. MDAC 2.7은 마이크로소프트 SQL 서버 6.5 또는 SQL 서버 7.0을 실행하는 클러스터 서버에서 계속 연결 문제를 일으켰으며, 마이크로소프트는 해결책을 제공하지 않았다. 마이크로소프트 SQL 서버 ODBC 드라이버를 사용하여 ODBC 데이터 원본 이름 (DSN)을 생성하거나 구성할 때 네트워크 라이브러리 프로토콜이 DSN이 네임드 파이프를 사용하도록 구성되었음에도 불구하고 예기치 않게 TCP/IP로 전환될 수 있었다. 이 문제는 인포월드 기자 랜들 C. 케네디가 발견했으며, 그는 이 변경 사항이 실제로는 MDAC 2.6에서 이루어졌지만 전혀 문서화되지 않았다고 밝혔다. 이 문제는 윈도우 XP 컴퓨터에서 클라이언트/서버 데이터베이스 워크로드를 테스트할 때 발견되었다. 인포월드는 TCP/IP를 사용할 때 전체 서버 CPU 사용률이 8%만 증가했지만, 10 사용자 워크로드의 경우 초당 문맥 교환이 150% 이상 감소했다고 주장한다(이는 물론 불가능하다. 그러면 음수 문맥 교환률이 되기 때문이며, 저자가 글을 쓸 당시 어느 행성에 있었는지에 따라 감소율은 33% 또는 60%이다). 그들은 Net-Lib의 기본 동작에 대한 근본적인 기능 변경이 관련 없는 문서에 스쳐 지나가듯 언급된 것에 대해 실망했다. 윈도우 XP 사용자들도 때때로 SQL 서버에 연결하는 데 문제가 발생했는데, SQL 서버가 로컬 컴퓨터에서 발견하는 인증서를 사용하려고 시도하지만, 사용 가능한 인증서가 두 개 이상인 경우 어떤 것을 사용해야 할지 알지 못했기 때문이었다. 마이크로소프트 분석 서비스 2000 RTM을 사용하려고 시도할 때 큐브를 찾아볼 때 오류가 가끔 나타나기도 했다. 마이크로소프트는 또한 윈도우 95, 윈도우 98, 윈도우 미의 설치 프로그램에서 MDAC 설치 프로그램이 설치 오류를 만나면 롤백되지 않도록 하는 문제를 발견했다.

MDAC 2.7에 대한 몇 가지 보안 문제가 마이크로소프트에 의해 해결되었다. Next Generation Security Software Ltd의 데이비드 리치필드는 데이터 소스에 연결하는 데 사용되는 MDAC의 ODBC 함수 중 하나에 검사되지 않은 버퍼가 포함되어 있어 보안 취약점이 발생한다고 보고했다. 수정된 또 다른 취약점은 공격자가 클라이언트가 브로드캐스트한 SQL Server 검색 메시지에 특별히 제작된 패킷으로 응답하여 버퍼 오버플로를 유발할 수 있다는 것이었다. 또 다른 결함은 공격자가 브로드캐스트에 다른 특별히 제작된 패킷으로 응답할 때 코드가 원격으로 실행될 수 있다는 것이었다.

### MDAC 2.8
MDAC 2.8은 2003년 8월에 출시되었으며 마이크로소프트 Windows Server 2003과 마이크로소프트의 Data Access Technologies 웹사이트를 통해 배포되었다. 제품에 새로운 기능을 추가하지 않았지만 여러 버그 및 보안 문제를 수정했다. 서버가 "안전하지 않은" 모드로 실행되도록 하는 레그 파일(레지스트리 변경을 자동화)이 제거되어 RDS가 시스템에 무단 접근을 얻기 위해 악용될 수 있었으며 Shape 쿼리 문자열의 길이에 새로운 제한이 부과되었다. 또한 몇 가지 ODBC 관리자 변경 사항도 있었다.

2005년 5월 23일, 마이크로소프트 데이터 접근 기술의 수석 프로그램 관리자인 브래드 로즈는 MDAC 2.8 SP1이 마이크로소프트가 출하할 MDAC의 마지막 독립 실행형 재배포 가능 패키지라고 발표했다. MDAC는 이제 마이크로소프트 운영 체제의 공식 구성 요소이지만, 이전에 출시된 웹 배포 가능 버전에 대한 버그 및 보안 수정 사항은 계속 제공할 예정이다. 그러나 마이크로소프트는 SQL 네이티브 클라이언트 (SQLNCLI)라는 새로운 구성 요소를 만들었는데, 이는 OLE DB 및 ODBC 라이브러리를 하나의 DLL로 결합한 독립 실행형 데이터 접근 API이다. 이는 이제 운영 체제 상태에 의존하는 MDAC와는 독립적으로 형성되었다. 개발자는 이제 이 라이브러리에 연결하여 MDAC의 다른 버전에 구축된 애플리케이션을 운영 체제 업데이트 시 MDAC 업데이트로 인해 손상되는 상황을 피할 수 있다.

윈도우 7 SP1은 MDAC 2.8의 상위 호환성을 깨뜨렸다. 윈도우 7 SP1에서 컴파일되어 MDAC ADO에 의존하는 소프트웨어는 윈도우 7 SP1 이전 버전(윈도우 7 RTM, 비스타, XP 포함)에서는 작동하지 않는다. 마이크로소프트는 일부 애플리케이션에 대해 이 문제를 해결하는 솔루션을 제공했지만 VBA 애플리케이션은 여전히 영향을 받는다. 이 문제에 대한 수정 사항은 2012년 2월에 출시되었다.

### 윈도우 DAC 6.0
윈도우 비스타는 더 이상 MDAC를 사용하지 않고, ADO, OLE DB, ODBC 구성 요소의 업데이트된 버전으로 구성된 Windows DAC를 사용할 것이다. 마이크로소프트에 따르면, "Windows DAC는 윈도우 비스타와 함께 작동하기 위한 일부 변경 사항을 포함하고 있지만, 기능적으로는 MDAC 2.8과 거의 동일하다."

### 버전 확인
컴퓨터에 설치된 MDAC 버전을 확인하는 방법은 두 가지가 있다. 윈도우 2000, 윈도우 XP 및 윈도우 서버 2003의 경우, 마이크로소프트의 Component Checker 프로그램을 통해 각 설치된 MDAC DLL의 값을 MDAC 파일 매니페스트와 비교하는 방법이 있다. 두 번째 방법은 윈도우 레지스트리에서 키 `HKEY_LOCAL_MACHINE\Software\Microsoft\DataAccess\FullInstallVer`를 확인하는 것이다. 마이크로소프트는 이 정보가 MDAC 파일이 시스템에 설치된 버전과 비교했을 때 2.1 이전 버전의 MDAC에서는 부정확할 수 있다고 언급한다.

## 각주

## 더 읽어보기

* MSDN, ["ADO API Reference"](https://web.archive.org/web/20110927010437/http://msdn.microsoft.com/en-us/library/windows/desktop/ms678086(v=vs.85).aspx). Microsoft. Archived September 27, 2011; accessed May 3, 2014.
* MSDN, ["ADO Programmer's Guide"](https://web.archive.org/web/20110930203525/http://msdn.microsoft.com/en-us/library/windows/desktop/ms681025(v=vs.85).aspx). Microsoft. Archived September 30, 2011; accessed May 3, 2014.

## 외부 링크
* [마이크로소프트 MDAC 센터](https://docs.microsoft.com/en-us/previous-versions/aa937729(v=msdn.10))
* [MDAC 다운로드](https://docs.microsoft.com/en-us/previous-versions/aa937730(v=msdn.10))
* MDAC 역사

분류:마이크로소프트 API