미니디비 – 3.사용자 인터페이스

ver 0.2.0부터는 사용자가 멤버변수에 접근할 수 없습니다. 따라서 ver 0.1.2에서 제공되던 멤버변수 $Host, $User, $Password, $Database는 생성자의 인자로 전달되며, $NumRows, $NumFields는 query() 함수의 리턴값으로 되돌려지며, $Record는 next_record() 함수의 리턴값으로 되돌려집니다.

메소드

내장된 메소드는 대부분 5개 정도로 작성되어 있으나 이 중에 사용자가 접근 가능한(public) 메소드는 단 2개에 불과합니다. SQL 쿼리 문을 수행하는 query() 메소드와 SELECT 쿼리 후 각 레코드를 읽어 올(fetch) next_record() 메소드입니다. 이 메소드명은 PHPLIB에서 사용하는 메소드명과 동일하나 리턴 값은 상이합니다. 데이터베이스에 접속하는 것과 이전에 쿼리하면서 사용된 메모리를 해제시키는 등의 작업은 내부적으로 알아서 수행해주기 때문에 사용자가 명시적으로 사용할 필요가 없습니다.

array query(string query_string);

이전 버전(ver 0.1.2)에서 제공하던 멤버변수 $NumRows, $NumFields이 query() 메소드의 리턴 값으로 받을 수 있습니다. 리턴 값의 데이터 형식은 배열로 배열의 첫번째 인자가 레코드수이고, 두번째 인자가 필드수입니다. 멤버변수 $NumRows, $NumFields는 더 이상 제공되지 않습니다.

DELETE, UPDATE, INSERT 쿼리문의 경우에는 리턴되는 레코드수는 affected rows를 의미합니다. 이 때 필드수는 의미없는 값입니다.

이전에 쿼리하면서 사용된 메모리가 있으면 메모리를 해제시키고, 입력된 쿼리문자열 $query_string을 DB에 보내 실행합니다. 마지막으로 쿼리에 해당하는 레코드의 수와 레코드에 포함된 필드수를 구합니다.

query() 함수의 사용방법은 아래와 같습니다.

레코드수와 필드수를 받을 필요가 없을 때는 if ($db->query(“select * from Members”)) 와 같이 코딩합니다.

리턴되는 두개의 값들은 query() 메소드를 수행하는 중에 설정되는 값으로, 레코드수는 SELECT 쿼리에서 얻어진 레코드 수를 나타내며, 필드수는 SELECT 쿼리에서 얻어진 필드항목 수를 나타냅니다. 해당되는 레코드 또는 필드항목수가 없으면 false으로 설정됩니다.

ver 0.2.2 부터는 모든 데이터베이스에서 “REPLACE” 쿼리문을 지원합니다. 이는 MySQL에서 제공하는 쿼리문 REPLACE과 같은 동작을 합니다. 즉, 같은 레코드가 있을 경우에는 이 레코드를 삭제한 후 INSERT 쿼리를 수행합니다. 같은 레코드가 없을 경우에는 INSERT 쿼리와 동일하게 동작합니다.

그러나 “REPLACE” 쿼리의 경우에는 MySQL을 제외한 다른 데이터베이스에서는 MySQL의 “REPLACE”처럼 완벽하게 동작하는 것은 아니고 몇가지 제한점이 있습니다. 우선 프라이머리 키는 하나만 허용합니다. 그리고 이 프라이머리 키는 field 배열을 첫번째 요소로 지정하여야 합니다. 위의 예에서 userid가 배열의 첫요소이며 따라서 이 필드명이 프라이머리키가 됩니다. 향후 버전에서는 프라이머리키 인식을 미니디비 내부에서 자동으로 감지하여야 할 것으로 생각되네요.

array next_record();

입력 값은 없습니다. next_record() 메소드를 수행하기 전에 반드시 query() 메소드를 수행하여야 합니다. 물론 query() 메소드에 입력된 쿼리문자열은 SELECT 쿼리 문일 때 next_record()를 사용할 수 있습니다. 현재 레코드 포인터에 해당하는 데이터베이스 테이블의 레코드 값을 읽어서 배열 형태로 되돌려줍니다. 만약 데이터베이스 테이블에 더 이상의 레코드가 없다면 false가 반환될 것입니다. 정상적으로 레코드 값이 읽혀져서 배열이 반환된다면 이 배열의 형태는 필드명에 의한 문자열 인덱스 배열(associative array; 연관배열, 연상배열)이 될 것입니다. 즉, 정수 인덱스 배열(scalar array)은 존재하지 않습니다. 만약 현재 레코드 포인터에 해당하는 레코드 값이 존재하지 않으면 false 값이 설정되어 있습니다. next_record() 메소드의 사용방법은 아래와 같습니다.

사용방법이 이전과 동일합니다. 즉, 현재 레코드 포인터에 해당하는 데이터베이스 테이블의 레코드 값을 읽어서 배열 형태로 되돌려 줍니다. 이전 버전(ver 0.1.2)에서 제공되던 멤버변수 $Record는 더 이상 제공되지 않습니다.

생성자

디비 호스트명, 사용자 id, 디비 패스워드, 디비명을 생성자의 인자로 지정하여야 합니다. 이전 버전(ver 0.1.2)에서는 객체 생성 후 멤버변수에 직접 접근하여 설정하였으나 ver 0.2.0부터는 멤버변수가 제공되지 않습니다. 따라서 아래의 예와 같이 디비 정보를 생성자의 입력인자로 직접 지정하여야 합니다. ver 0.2.2부터는 클래스명이 baseDbsql에서 MiniDB로 변경되었으며 데이터베이스 접속방식을 지정할 수 있습니다.

디비 정보를 위와 같이 별도로 지정할 수도 있지만 아래와 같이 배열을 통해 하나의 입력인자로 지정할 수도 있습니다.

객체를 복수로 생성할 경우에는 두번째 객체 생성할 때는 입력인자를 생략할 수 있습니다. 이와 같이 생략하면 데이터베이스를 새로이 연결하려고 시도하지 않고 이미 지정되어 있는 디비 정보에 의해 연결된 Link ID를 반환하게 됩니다.

만약 디비명만을 변경하여 데이터베이스에 연결하려면 아래와 같이 디비명만 새롭게 지정하여 주면 됩니다.

접속방식은 한번 지정되면 동일한 문서 내에서는 변경할 수 없습니다.

배열로 지정할 때는 각 배열의 키값을 반드시 위와 같이 “host”, “user”, “pass”, “base”, “connect”로 명시하여야 합니다.

그리고 배열 인자는 MiniDB 클래스명으로 접근할 때만 사용할 수 있으며, 각 데이터베이스별로만 사용되는 baseMsql, baseMssql, baseMysql, baseOci8, baseOracle, basePgsql, baseSybase로 객체를 생성할 때는 배열 인자를 지정할 수 없습니다. 이 때는 각 정보를 별도의 인자로 지정하기 바랍니다.

데이터베이스를 사용하기 위해서는 반드시 설정하여야 하는 값이나, 모두 사용되는 것은 아니며 사용하는 데이터베이스에 따라 설정하여야 하는 인자가 정하여져 있습니다. 데이터베이스에 따라 필요없는 인자는 빈문자열(“”)을 지정하여 주십시오. 각 데이터베이스에 따라 설정하여야 하는 인자는 아래와 같습니다.

DB 호스트명 사용자명 패스워드 디비명
MSQL 사용함 사용함
MSSQL 사용함 사용함 사용함 사용함
MySQL 사용함 사용함 사용함 사용함
Oracle(OCI) 사용함 사용함 사용함
Oracle(ORA) 사용함 사용함 사용함 사용함
PostgreSQL 사용함 사용함
SyBASE 사용함 사용함 사용함 사용함
Informix 사용함 사용함 사용함 사용함

Oracle(ORA)의 경우에 원래 데이터베이스에서는 호스트명를 사용하지 않으나 Mini DB 내에서 서버가 웹서버와 동일한 곳에 위치하는지 아니면 다른 곳에 위치하는지에 따라 데이터베이스에 접속하는 방법이 다르기 때문에 이를 구분하기 위해 사용합니다. 이 때 동일한 곳에 위치하면 호스트명의 값을 “localhost”로 설정하여 주시고 아니면 “remotehost”로 설정하여 주십시오.

Informix의 경우에 localhost에 연결할 경우에는 호스트명으로 빈문자열을 지정하기 바랍니다.

생성자에서는 데이터베이스에 연결되어 있지 않으면 데이터베이스를 연결시키며, 데이터베이스 연결이 중복되어 연결되지 않도록 조절하는 기능이 포함되어 있습니다.

접속방식에는 “connect”와 “pconnect”를 지정할 수 있습니다. “connect”는 쿼리하는 동안에만 일시적으로 데이터베이스와 연결하는 방식이며, “pconnect”는 일단 데이터베이스와 연결된 후에는 일정시간동안 연결상태가 계속 유지되는 방식입니다. “connect”과 “pconnect”에는 각각 장단점이 있습니다. “pconnect”를 이용하는 것이 서버 부하를 줄일 수 있기는 하지만 일정 주기의 동시 사용자만큼의 프로세스가 필요하기 때문에 사용자가 많을 때는 이에 대한 별도의 대책이 필요합니다. “connect”는 쿼리를 실행할 때마다 매번 프로세스가 생성/소멸을 반복하기 때문에 프로세스 제한을 받지 않는 반면에 서버에 다소 부담이 될 수 있겠지요. 미니디비에서 접속방식을 지정하지 않으면 기본적으로 “pconnect”방식으로 연결됩니다. 그리고 한번 지정되면 다시 지정하지 않더라도 처음 지정된 접속방식이 계속 유지됩니다.

mysql_pconnect 를 실행하는 순간 DB 로 연결하는 process 가 하나 생성됩니다. 이 프로세스들은 보통 sleep 상태로 존재하다가 쿼리가 날라오면 active 상태가 되며 쿼리가 완료되면 sleep 이 됩니다. mysql_connect 같은 경우는 쿼리를 날리고 실행이 완료되면 프로세스 자체가 사라져 버리죠.

대신 mysql_pconnect 는 여러번 실행시켜도 이미 process 가 생성되었으면 또 다른 process가 생성되지 않습니다. 즉, 하나의 유저가 하나의 process 만 있으면 된단 뜻이죠. 이것을 써야 하는 이유는 수행효율 문제에 있습니다.

mysql_connect는 쿼리를 날릴때마다 매번 실행해야 하기 때문에 프로세스가 생성되고 해제되는 많은 시간이 소모됩니다. 반면, pconnect 는 한번 뜨면 끝입니다. 이런 이유로 pconnect 를 사용합니다. 보통 이것들은 일반적으로 8시간의 timeout 주기를 갖습니다. 즉, 유저가 DB 에 접속하고 나서 사용을 완전히 멈추고 난뒤 8시간이 지나야 이 프로세스가 사라집니다. 이건 분명히 문제입니다. 왜냐하면 MySQL 의 기본설정에서 프로세스 최대개수는 일반적으로 100개이기 때문입니다. 만약 100명의 사용자가 접속하여 100개의 프로세스가 떠 있다면 101번째 사용자는 DB 로 접근할 수 없다는 에러를 받게 됩니다.

connect와 pconnect에 관련된 자세한 내용은 관련 웹사이트를 검색하여 보시기 바랍니다.

예약어

예약된 전역변수

미니디비에서 내부적으로 사용하고 예약된 전역변수가 아래와 같이 있습니다.

  • $baseStaticMsql : Msql 데이터베이스 클래스에서 공용으로 사용하는 객체
  • $baseStaticMssql : Mssql 데이터베이스 클래스에서 공용으로 사용하는 객체
  • $baseStaticMysql : Mysql 데이터베이스 클래스에서 공용으로 사용하는 객체
  • $baseStaticOci8 : Oci8 데이터베이스 클래스에서 공용으로 사용하는 객체
  • $baseStaticOracle : Oracle 데이터베이스 클래스에서 공용으로 사용하는 객체
  • $baseStaticPgsql : Pgsql 데이터베이스 클래스에서 공용으로 사용하는 객체
  • $baseStaticSybase : Sybase 데이터베이스 클래스에서 공용으로 사용하는 객체
  • $baseStaticIfx : Infomix 데이터베이스 클래스에서 공용으로 사용하는 객체
  • $baseFlag : 클래스 MiniDB 정의를 한번만 인클루드하도록 해주는 플래그

예약된 클래스명

미니디비에서 클래스를 정의할 때 사용하고 클래스명들은 아래와 같습니다.

  • baseStaticMsql : Msql 데이터베이스 클래스에서 공용으로 사용하는 클래스
  • baseStaticMssql : Mssql 데이터베이스 클래스에서 공용으로 사용하는 클래스
  • baseStaticMysql : Mysql 데이터베이스 클래스에서 공용으로 사용하는 클래스
  • baseStaticOci8 : Oci8 데이터베이스 클래스에서 공용으로 사용하는 클래스
  • baseStaticOracle : Oracle 데이터베이스 클래스에서 공용으로 사용하는 클래스
  • baseStaticPgsql : Pgsql 데이터베이스 클래스에서 공용으로 사용하는 클래스
  • baseStaticSybase : Sybase 데이터베이스 클래스에서 공용으로 사용하는 클래스
  • baseStaticIfx : Infomix 데이터베이스 클래스에서 공용으로 사용하는 클래스
  • baseMsql : MSQL 데이터베이스를 사용하기 위해 작성된 클래스
  • baseMssql : MSSQL 데이터베이스를 사용하기 위해 작성된 클래스
  • baseMysql : MYSQL 데이터베이스를 사용하기 위해 작성된 클래스
  • baseOci8 : OCI8 데이터베이스를 사용하기 위해 작성된 클래스
  • baseOracle : ORACLE 데이터베이스를 사용하기 위해 작성된 클래스
  • basePgsql : PGSQL 데이터베이스를 사용하기 위해 작성된 클래스
  • baseSybase : SYBASE 데이터베이스를 사용하기 위해 작성된 클래스
  • MiniDB : 미니디비를 DB Layer로 사용하기 위해 정의된 클래스명

예약된 함수명

미니디비에서 클래스를 정의할 때 사용하고 클래스명들은 아래와 같습니다.

  • baseDestrMsql() : baseMsql 데이터베이스 클래스의 소멸자를 실행하기 위한 함수
  • baseDestrMssql() : baseMssql 데이터베이스 클래스의 소멸자를 실행하기 위한 함수
  • baseDestrMysql() : baseMysql 데이터베이스 클래스의 소멸자를 실행하기 위한 함수
  • baseDestrOci8() : baseOci8 데이터베이스 클래스의 소멸자를 실행하기 위한 함수
  • baseDestrOracle() : baseOracle 데이터베이스 클래스의 소멸자를 실행하기 위한 함수
  • baseDestrPgsql() : basePgsql 데이터베이스 클래스의 소멸자를 실행하기 위한 함수
  • baseDestrSybase() : baseSybase 데이터베이스 클래스의 소멸자를 실행하기 위한 함수
  • baseDestrIfx() : baseIfx 데이터베이스 클래스의 소멸자를 실행하기 위한 함수

답글 남기기