본문 바로가기

Database [DB]

[DB] 06. Application Development

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 단계

  1. Run time에 SQL statement를 동적으로 생성
  2. statement를 동적으로 컴파일
  3. 새로 컴파일된 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