Embedded SQL (내장 SQL)
SQL을 프로그래밍 언어(데이터베이스 응용 프로그램)에서 사용하는 방법
- 정적 방식 : SQL을 애플리케이션 코드 내에서 사용 (내장 SQL: ESQL/C, ESQL/C++ 등 / SQLJ)
- 동적 방식 : SQL API를 사용 (SQL CLI(call level interface), ODBC, JDBC)
내장 SQL
- SQL 표준은 C, C++, Java, Cobol, Pascal, PL/1, Fortran과 같은 다양한 프로그래밍 언어에 대한 SQL의 내장을 정의
- C, C++, Java 등을 Host Language라고 부름
- 내장 SQL 프로그램은 컴파일 전에 전처리기에 의해 처리되어야 함
- 전처리기는 내장 SQL을 API 호출로 대체, 결과 프로그램은 Host-Language 컴파일러에 의해 컴파일됨
- 다양한 버전이 존재 : Oracle Pro*C / Sybase Embedded SQL / DB2 Embedded SQL (COBOL용)
내장 SQL의 구체적인 문법은 다양
명령어 예시
Cursors 커서
주요 문제는 두 언어가 데이터를 다루는 방식에서 발생하는 임피던스(impedance) 불일치를 어떻게 해결할 것인가임
예를 들어 SQL 관계는 레코드의 (다중) 집합이고 사전에 정해진 레코드 수의 범위가 없음
하지만 C 같은 많은 언어는 이러한 데이터 구조체가 존재하지 않음
집합을 지원하는 언어의 경우, 한 번에 전체 질의(query) 결과를 메모리에 저장하지 않을 수 있음
- C++은 STL을 가지고 있고, Java는 multiset을 가지고 있음
SQL은 임피던스 불일치 해결을 위해 커서를 지원
- 커서는 collection을 횡단하고 한 번에 하나의 행씩 결과를 가져오는 매커니즘을 제공
변수 :creditAmount보다 더 많이 이수한 학생들의 ID와 name을 찾기
fatch 문은 쿼리 결과의 한 튜플의 값을 Host language 변수에 넣음
- EXEC SQL fetch myCursor into :si, :sn;
-> 반복적으로 fetch를 호출하면 쿼리 결과의 연속된 튜플을 얻을 수 있음
SQL 통신 영역(SQLCA)에 있는 SQLSTATE라는 변수는 더 이상 데이터가 없음을 나타내기 위해 '02000'으로 설정
close 문은 일시적인 관계를 삭제하기 위해 사용
- EXEC SQL close myCursor;
세부 사항은 언어마다 다양함
커서를 통한 데이터 갱신
업데이트를 위한 커서라고 명시적으로 선언한 커서를 사용하여 튜플을 업데이트할 수 있음
현재 커서 위치의 튜플을 업데이트하는 방법
동적 SQL
몇몇 애플리케이션에서는 SQL을 동적으로 생성하는 것이 더 편리함 (Ex. run time) - 동적으로 바인딩하고 실행함
동적 SQL 단계
- Run time에 SQL statement를 동적으로 생성
- statement를 동적으로 컴파일
- 새로 컴파일된 statement를 실행
ODBC, JDBC
API (Application Programming Interface) : 프로그램이 데이터베이스 서버와 상호 작용할 수 있도록 하는 인터페이스
- 애플리케이션은 다음과 같은 호출(call)을 수행
- 데이터베이스 서버와 연결
- 데이터베이스 서버로 SQL 명령을 보냄
- 결과 튜플을 프로그램 변수로 하나씩 가져오기(Fetch)
ODBC(Open Database Connectivity)는 C, C++, C#, Visual Basic과 함께 사용
JDBC(Java Database Connectivity)는 Java와 함께 사용
ODBC(Open DataBase Connectivity)
- 데이터베이스 서버와 통신하기 위한 애플리케이션 프로그램 인터페이스(API)의 표준
- API는 데이터베이스와 연결 / 쿼리(질의)와 갱신(update)를 보냄 / 결과를 가져옴
- ODBC를 지원하는 각 데이터베이스 시스템은 클라이언트 프로그램과 연결되어야 하는 "드라이버" 라이브러리를 제공
- 클라이언트 프로그램이 ODBC API 호출을 수행하면, 라이브러리의 코드는 서버와 통신하여 요청된 작업을 수행하고 결과를 가져옴
ODBC 동적 SQL
- statement 준비
- 동적 SQL statement를 준비
- Placeholder를 가질 수 있음 (예시 : insert into acount values(?,?,?);) - Placeholder에 들어갈 실제값과 반복적으로 수행함
statement 준비를 위해 SQLPrepare( ) 호출
바인드할 파라미터가 필요 (SQLBindParameter( ), SQLNumResultCols( ), SQLDescribeCol( ), SQLColAttribute( ) 등)
statement를 실행하기 위해 SQLExecute( ) 호출
statement를 바로 실행하기 위해서는 SQLExecDirect( ) 호출
SQL injection 위험을 피하기 위해, SQL 문자열을 사용자 입력에 직접적으로 생성하지 않음
-> 대신 사용자 입력에 바인딩할 준비된 statement를 사용
ODBC 메타 데이터
데이터베이스의 모든 관계를 찾기 위해 / 쿼리 결과의 열의 이름과 타입 또는 DB의 관계를 찾기 위해 사용
ODBC 트랜잭션
- 각 SQL 문은 자동으로 커밋되는 별도의 트랜잭션으로 처리됨
- 연결 과정에서 자동 커밋을 비활성화할 수 있음 => SQLSetConnectOption(conn, SQL_AUTOCOMMIT, 0);
- 그러면 트랜잭션은 명시적으로 커밋되거나 롤백해야 함
- SQLTransact(conn, SQL_COMMIT); / SQLTransact(conn, SQL_ROLLBACK);
ODBC Conformance Levels
Conformance 레벨은 표준으로 정의한 함수적인 하위 집합을 명시함
- Core
- Level 1 : 메타 데이터 쿼리 지원을 요구
- Level 2 : 파라미터 값의 배열을 보내고 검색할 수 있는 능력을 요구 / 더 자세한 카탈로그 정보를 지원
- SQL Call Level Interface(CLI) 표준은 ODBC 인터페이스와 유사하지만 약간의 차이점이 있음
JDBC
SQL을 지원하는 데이터베이스 시스템과 통신하기 위한 Java API
데이터 쿼리 및 업데이트, 쿼리 결과 검색과 같은 다양한 기능을 지원
데이터베이스에 존재하는 관계 및 관계 속성의 이름 및 유형에 대한 조회를 포함한 메타 데이터 검색을 지원
데이터베이스와 통신하는 단계
- 연결(connection) 열기 -> "statement" 객체 생성
-> "statement" 객체를 사용하여 쿼리를 실행하고 결과를 검색(fetch) -> 오류 처리를 위한 예외 메커니즘 사용
SQLJ
JDBC는 지나치게 동적이어서 컴파일러에서 오류를 잡을 수 없음 / SQLJ : Java에서의 내장 SQL
ADO.NET
- Visual Basic .NET 및 C#을 위해 설계된 API / JDBC, ODBC와 유사한 데이터베이스 액세스 기능을 제공
- ODBS call(호출)로 변환됨
- OLE-DB, XML 데이터, Microsoft의 Entity Framework와 같은 비관계형 데이터 소스에도 액세스 가능
정적 / 동적 접근 방식
Embedded(내장) SQL과 SQLJ는 정적
쿼리 텍스트는 프로그램 코드 안에서 지정
데이터베이스 API도 존재
- 각 DBMS는 고유한 API를 제공
- 표준 API도 존재 : JDBC, ODBC
- DBMS에 중립적이라고 할 수 있음 : 드라이버가 호출을 잡아서 이를 DBMS별 코드로 변환
API는 더 유연하고 강력하지만 사용하기 어렵고 느림
Application Architecture 애플리케이션 구조
애플리케이션 프로그램 (응용 프로그램)
- 대부분의 데이터베이스 사용자는 SQL 같은 쿼리 언어를 직접적으로 사용하지 않음
- 응용 프로그램이 사용자와 데이터베이스 사이에서 중개자 역할을 함
- 응용 프로그램은 Front-end / Middle layer / Backend로 분할됨
- Frond-end는 사용자 인터페이스와 관련 있음
- 폼(Forms), 그래픽 사용자 인터페이스(GUI) 등이 여기에 속함 / 많은 인터페이스는 현재 웹 기반임
응용 프로그램 구조의 진화
웹 브라우저는 데이터베이스에 대한 보편적인 표준 사용자 인터페이스로 발전
- 대규모 사용자가 어디서나 데이터베이스에 액세스할 수 있도록 함
- 전문 코드를 다운로드/설치할 필요 없이 우수한 그래픽 사용자 인터페이스를 제공
- JavaScript, Flash(Adobe) 및 기타 Scripting 언어는 브라우저에서 실행되지만 투명하게 다운로드됨
웹 서버
- 웹 서버는 다양한 정보 서비스의 Front-end로 쉽게 서비스됨
- URL의 문서 이름은 서버에서 실행되는 실행 가능한 프로그램을 식별할 수 있음
- HTTP 서버가 이러한 문서에 대한 요청을 받으면 프로그램을 실행하고 생성된 HTML 문서를 다시 보냄
- 웹에 새 서비스를 설치하려면 해당 서비스를 제공하는 실행 가능한 프로그램을 만들고 설치하면 됨
- Common Gateway Interface(CGI)는 웹과 응용 프로그램 서버 간의 표준 인터페이스임
Cookies 쿠키
HTTP 프로토콜은 Connectionless 통신을 함
- 한 번 서버가 요청에 응답하면 서버는 클라이언트와의 연결을 닫음 (그리고 모든 것을 잊어버림)
- 동기 : 서버에 대한 부하를 줄임
- OS에서는 기계에서 열 수 있는 연결의 수에 엄격한 제한이 있음 - 반면에 Unix 로그인 및 JDBC/ODBC 연결은 클라이언트가 연결을 끊을 때까지 연결된 상태를 유지하며 사용자 인증 및 기타 정보를 유지함
정보(Information) 서비스는 세션 정보가 필요
예를 들어, 사용자 인증은 세션 당 한 번만 수행되어야 함 => 쿠키를 사용
쿠키(cookie) : 작은 텍스트 조각
- 서버에서 브라우저로 전송 (첫 상호 작용 시 세션을 식별하는 데 사용)
- 브라우저는 후속 상호 작용에서 해당 쿠키를 만든 서버로 전송
- 서버는 발급한 쿠키에 관한 정보를 저장 / 그리고 요청을 처리할 때 사용
- 인증 정보, 사용자 기본 설정 등을 저장하는 데 사용
- 쿠키는 영구적으로 또는 제한된 기간동안 저장
HTML 입력
- HTML은 텍스트 서식, 하이퍼텍스트 링크, 이미지 표시 기능을 포함한 테이블, 스타일시트 등을 제공
- HTML은 입력 기능을 제공
- 옵션 집합에서 선택 (팝업 메뉴, 라디오 버튼, 체크 리스트)
- 값 입력 : 텍스트 상자
- 채워진 입력은 서버로 다시 전송되어 입력값으로 무언가를 처리
Table / Form 예제
'Database [DB]' 카테고리의 다른 글
[DB] 08. Database Design Theory (1) | 2024.01.09 |
---|---|
[DB] 07. Entity-Relationship Data Model (2) | 2024.01.09 |
[DB] 05. Major Functionalities of Database Systems (2) | 2024.01.08 |
[DB] 04. SQL 2 (0) | 2024.01.07 |
[DB] 03. SQL 1 (1) | 2024.01.07 |