> [!warning]
> 이 페이지는 아직 미완성입니다.
데이터베이스 시스템과 상호작용하는 애플리케이션 프로그램은 범용 프로그래밍 언어의 모든 표현력을 제공하지 않는 SQL과 같은 비절차적 질의어를 사용하기 때문에, 사용자 입력, 디스플레이 출력, 네트워크 통신과 같은 계산과 동작을 수행하기 위해 **호스트 언어**에 SQL 질의를 내장해야 합니다. 이러한 데이터베이스 접근 프로그램 개발에는 크게 세 가지 주요 접근 방식이 있습니다:
1. **내장형 SQL (Embedded SQL)**: 데이터베이스 명령을 호스트 프로그래밍 언어 코드 내에 특별한 접두사(`EXEC SQL`)와 함께 포함하는 방식입니다. 이 방식에서는 **전처리기(preprocessor)**가 SQL 명령을 식별하여 DBMS가 처리할 수 있는 함수 호출로 변환합니다. SQL 문은 컴파일 시점에 식별되므로 '정적' 데이터베이스 프로그래밍 접근 방식으로도 불립니다. 호스트 언어 변수는 SQL 문 내에서 콜론(:)으로 구분됩니다.
2. **함수 호출 라이브러리(Function Call Libraries) / API (Application Programming Interface)**: 데이터베이스 호출을 위한 함수 라이브러리를 호스트 프로그래밍 언어에 제공하는 방식입니다. **ODBC(Open Database Connectivity)**는 이 범주에 속하며, JDBC(Java Database Connectivity)도 유사한 Java 언어 전용 API입니다.
3. **새로운 언어 설계**: 데이터베이스 모델 및 질의어와 호환되도록 처음부터 설계된 데이터베이스 프로그래밍 언어입니다(예: Oracle의 PL/SQL). 이 방식은 데이터베이스 모델과 프로그래밍 언어 모델 간의 차이로 인해 발생하는 **임피던스 불일치(impedance mismatch)** 문제를 최소화합니다.
---
**ODBC (Open Database Connectivity) 에 대한 논의**
ODBC는 애플리케이션 프로그램이 데이터베이스 서버와 통신하는 데 사용할 수 있는 **표준 API(Application Programming Interface)**입니다. 이는 그래픽 사용자 인터페이스(GUI), 통계 패키지, 스프레드시트 등 다양한 애플리케이션이 ODBC를 지원하는 모든 데이터베이스 서버에 연결할 수 있도록 함수를 제공합니다.
**1. ODBC의 작동 방식 및 특징:**
- **클라이언트-서버 아키텍처 지원**: ODBC는 클라이언트 프로그램이 데이터베이스 서버와 통신하는 데 사용됩니다. 클라이언트 프로그램은 일반적으로 사용자 상호작용 및 애플리케이션 논리를 처리하고, 서버는 데이터 저장 및 접근을 담당합니다.
- **드라이버 기반**: 각 데이터베이스 시스템은 ODBC를 지원하기 위해 클라이언트 프로그램과 연결되어야 하는 라이브러리(ODBC 드라이버)를 제공합니다. 클라이언트 프로그램이 ODBC API 호출을 할 때, 이 라이브러리 내의 코드가 서버와 통신하여 요청된 동작을 수행하고 결과를 가져옵니다.
- **연결 및 명령 실행**:
- 프로그램은 먼저 `SQLAllocEnv` 및 `SQLAllocConnect` 함수를 사용하여 환경 및 데이터베이스 연결 핸들을 할당합니다.
- 그 다음, `SQLConnect`를 사용하여 서버와의 연결을 설정합니다. 이 호출은 연결 핸들, 서버 주소, 사용자 ID, 비밀번호 등의 매개변수를 받습니다. `SQL_NTS` 상수는 인수가 널(null)로 끝나는 문자열임을 나타냅니다.
- 연결이 설정되면 `SQLExecDirect`를 사용하여 SQL 명령(문자열 형태)을 데이터베이스에 전송할 수 있습니다.
- **결과 검색**:
- SQL 질의 결과의 속성에 C 언어 변수를 바인딩할 수 있으며, `SQLBindCol` 함수가 이 작업을 수행합니다. 이 함수는 질의 결과에서 속성의 위치, SQL에서 C로의 유형 변환 요구 사항, 변수의 주소 등을 지정합니다.
- `SQLFetch`를 사용하여 튜플을 가져올 때 속성 값이 해당 변수에 저장됩니다. `SQLFetch`가 `SQL_SUCCESS`를 반환하는 동안 루프를 통해 모든 튜플을 가져올 수 있습니다.
- **동적 SQL 지원**: ODBC는 런타임에 SQL 질의를 문자열로 구성하고 제출하여 결과를 프로그램 변수로 가져오는 **동적 SQL** 기능을 제공합니다. 이는 `SQLExecDirect` 함수를 통해 이루어집니다. 또한, 매개변수가 있는 SQL 문을 "준비(prepared)"하여 반복적으로 실행할 수도 있습니다.
- **트랜잭션 제어**: 기본적으로 각 SQL 문은 자동으로 커밋되는 별도의 트랜잭션으로 처리되지만, `SQLSetConnectOption` 함수를 사용하여 자동 커밋을 끄고 `SQLTransact`로 명시적으로 커밋(`SQL_COMMIT`) 또는 롤백(`SQL_ROLLBACK`)할 수 있습니다.
- **카탈로그 정보 접근**: ODBC는 데이터베이스에 있는 모든 관계를 찾거나 질의 결과 또는 데이터베이스 내 관계의 열 이름과 유형을 찾는 것과 같은 다양한 작업을 위한 함수를 정의합니다.
- **오류 및 예외 처리**: `SQLCODE` 및 `SQLSTATE`와 같은 특별한 변수를 사용하여 DBMS와 프로그램 간의 오류 및 예외 조건을 통신합니다. `SQLCODE`가 0이면 성공, 양수면 데이터 없음, 음수면 오류를 나타냅니다. `SQLSTATE`는 5자리 문자열로, '00000'은 오류 없음, '02000'은 더 이상 데이터 없음 등을 나타냅니다.
- **표준화 및 적합성 수준**: ODBC는 ANSI/ISO SQL 표준의 **SQL/CLI (Call Level Interface)**의 선구자로 간주됩니다. ODBC는 기능의 하위 집합을 지정하는 적합성 수준(Core, Level 1, Level 2)을 정의합니다.
**2. ODBC와 다른 인터페이스의 관계:**
- **내장형 SQL과의 비교**: 내장형 SQL이 컴파일 시점에 SQL 문을 식별하고 전처리기를 사용하는 것과 달리, ODBC는 런타임에 SQL 명령을 문자열로 구성하고 실행하는 **동적 프로그래밍 접근 방식**을 사용합니다. 이 때문에 전처리기가 필요 없지만, SQL 명령의 구문 및 기타 확인이 런타임에 이루어져 프로그래밍이 더 복잡해질 수 있습니다.
- **JDBC와의 유사성**: JDBC는 Java 프로그램이 데이터베이스 서버에 연결하는 데 사용할 수 있는 API로, ODBC와 유사한 기능을 제공합니다. JDBC도 데이터베이스 연결을 열고, `Statement` 객체를 생성하여 질의를 실행하고 결과를 가져오는 모델을 사용합니다. JDBC 드라이버는 특정 DBMS 공급업체를 위한 JDBC API 함수 호출의 구현체이며, 이를 통해 Java 프로그램은 JDBC 드라이버가 있는 모든 RDBMS에 접근할 수 있습니다. ODBC와 JDBC는 모두 동일한 애플리케이션 프로그램 내에서 여러 데이터베이스에 쉽게 접근할 수 있게 합니다.
- **SQL/CLI**: ODBC는 SQL 표준의 일부인 SQL/CLI의 전신입니다.
- **ODBC를 통한 PHP 데이터베이스 접근**: PHP는 ODBC 표준을 지원하는 모든 시스템에 접근할 수 있는 라이브러리를 제공합니다.
**3. ODBC의 장점:**
- **DBMS 독립성/이식성**: ODBC의 가장 큰 장점은 애플리케이션 프로그램이 **다양한 DBMS 패키지로 저장된 여러 데이터베이스에 더 쉽게 접근할 수 있도록** 한다는 것입니다. 이는 데이터베이스 공급업체 간의 사소한 SQL 차이를 숨겨주어 한 데이터베이스에서 다른 데이터베이스로의 마이그레이션을 상대적으로 간단하게 만듭니다.
- **유연성**: 내장형 SQL과 달리 전처리기가 필요하지 않으며, 런타임에 SQL 명령을 동적으로 구성하고 실행할 수 있어 더 큰 유연성을 제공합니다.
**4. ODBC의 한계:**
- **복잡한 프로그래밍**: SQL 명령의 구문 및 기타 확인이 런타임에 이루어져야 하므로, 내장형 SQL보다 프로그래밍이 더 복잡해질 수 있습니다. 또한 질의 결과의 속성 유형과 개수를 미리 알 수 없는 경우 접근이 더 복잡할 수 있습니다.
- **임피던스 불일치**: SQL과 같은 관계형 모델과 C/C++ 같은 범용 프로그래밍 언어의 데이터 모델 간의 차이로 인해 발생하는 **임피던스 불일치** 문제가 존재합니다. 이는 각 언어의 데이터 유형이 데이터베이스 속성 유형과 다르기 때문에 호환되는 유형 매핑이 필요합니다.
**5. ODBC의 활용 및 예시:**
ODBC는 클라이언트-서버 데이터베이스 애플리케이션의 중요한 구성 요소이며, 예를 들어 Oracle 데이터베이스는 ODBC 호환 프로토콜을 통해 비-Oracle 시스템에 접근할 수 있는 기능을 제공하여 이기종 분산 데이터베이스 환경에서 데이터 접근을 용이하게 합니다. 또한, PostgreSQL과 같은 오픈소스 데이터베이스 시스템도 ODBC를 지원합니다.
결론적으로, ODBC는 애플리케이션이 다양한 데이터베이스 시스템과 효과적으로 상호작용할 수 있도록 하는 핵심적인 표준 데이터베이스 프로그래밍 인터페이스이며, 이는 이식성과 유연성을 제공하지만, 호스트 언어와의 임피던스 불일치 및 프로그래밍 복잡성 등의 한계도 가지고 있습니다.