반응형
먼저 PHP에서 DB접속을 하는 경우, 기존에는 PHPLIB, 최근에는 PEAR :: DB나 PEAR :: DB_Data Object 등을 이용하여 처리 구현을 합니다.PHP에서는 이러한 모듈 덕분에 DB에 쉽게 접근할 수 있기 때문에 실용적인 web 서비스를 쉽게 구축할 수 있습니다.현재의 PHP 에서는, PEAR 라이브러리가, 사실상의 표준 라이브러리의 위치설정에 있습니다.그러나 PEAR ::DB는 해당 기능에 비해 실행 속도가 느려지는 경우가 많고, PEAR ::DB_Data Object는 DB의 스키마 정의에 따라 동작하는 구성으로 되어 있어 해당 설계 개념에 익숙하지 않으면 사용하기 어려운 느낌을 지울 수 없습니다.따라서 PEAR::DB 정도의 기능밖에 가지고 있지 않아 기능면에서 리치는 아니지만, 그만큼 PEAR::DB_Data Object보다 자유도가 높아 손쉽게 사용할 수 있고, PEAR::DB보다 실행속도가 더 빠른 DB 액세스 모듈이 있으면 이용 가치가 있다고 생각됩니다.본고에서는, 그러한 위치에 있는 DB접속 모듈로서 ′ADOdb′을 소개합니다.대상 독자주에, LAMP 구성(Linux+Apache+MySQL+PHP)의 환경하에서, Web 애플리케이션 구축을 실시한 경험이 있는 분을 대상으로 하고 있습니다.특히 PEAR ::DB 대체 방안을 검토 중이어서 ADOdb를 모르시는 분이나 일본어 자료가 없어 어려움을 겪으셨던 분에게 유익할 것입니다.필요한 환경 필자는 본 글의 내용에 관하여 White Box Enterprise Linux 3.0 Resipin1, CentOS 4.0(x86-64판)과 같은 여러 LAMP 환경에서 개발 및 동작 확인을 하고 있습니다.Google 등으로 검색하면 ADOdb를 이용하고 있는 PHP로 쓰여진 애플리케이션을 Windows 상에서 동작시키는 화제 등을 찾을 수 있기 때문에 Windows 상에서도 문제없이 동작하는 것이라고 생각할 수 있습니다.ADOdb는 ADOdb는 PHP에서 DB접속을 하기 위한 모듈입니다.키워드를 「php adodb」라고 해 일본어로 구글하면, 침입 검지 시스템 「Snort」의 프런트엔드 「ACID」의 동작에 필요한 모듈이므로, 인스톨의 방법은 이것 저것, 등이라고 쓰여진 페이지를 많이 볼 수 있습니다.「ACID」외에도, 「PostNuke」 「Moodle」 「phpWiki」 「Tiki」 「Mantis」 등, PHP로 구축된 유명한 애플리케이션으로 이용되고 있습니다.본고의 독자라면 어느 하나쯤은 시험해본 경험이 있을 것입니다.해외에서는 실적이 있는 모듈입니다.표준 지위에 있는 PEAR :: DB, PEAR :: DB_Data Object를 제쳐두고 유명 프로젝트에 채용 실적이 있는 것은 ADOdb에 어떤 우위성이 있음을 보여줍니다.먼저 PEAR :: DB와의 비교에서 속도적 우위성이 있습니다.조금 오래된 정보가 되지만 벤치마크 결과를 게재한 Comparing ADODB with PEAR DB, MDB, dbx, Metabase and Native MySQL을 보면 ADOdb는 PEAR ::DB보다 더 빠르게 동작한다고 나와있습니다.Zend Optimizer 등 코드를 프리컴파일하여 캐시를 해놓고 PHP 실행 자체를 고속화하는 환경 하에서는 ADOdb와 PEAR :: DB의 차이는 줄어드는 경향이 있습니다.그러나 ADOdb에는 C언어로 쓰여진 공유 라이브러리와 연계하여 속도를 벌어들이는 확장이 준비되어 있습니다.또한 PEAR::DB가 지원하는 DB의 종류는 본고 집필 시점의 일본어 매뉴얼에 기재되어 있는 종류로 13종류인데 반해 ADOdb에서는 38종류로 되어 있습니다.이들 중에는 같은 DB의 다른 버전을 위해서 각각 조정된 것을 다른 종류로 세고 있는 것도 포함되어 있습니다.그러나 예를 들어, PEAR ::DB에서는 ODBC를 거쳐야만 사용할 수 있는 DB2를 ADOdb에서는 충분히 테스트한 DB로 사용할 수 있는 등 ADOdb의 우위성이 인정됩니다.다음으로 PEAR: DB_DataObject 에서는 DB의 스키마 정의를 자동으로 취득하여 해당 DB를 핸들링할 전용 객체를 생성합니다.객체의 구성원으로 접근을 하면 DB내 정보에 접근할 수 있기 때문에 SQL로부터 어느 정도 벗어날 수 있다는 장점이 있습니다.하지만 DB에서 얻을 수 있는 정보를 객체에서 얻을 수 있는 것처럼 DB의 논리구조로만 표현해서 SQL에서 조작되는 실체를 은폐하는 정도의 기능이라면 그렇게 구현하는 것은 어렵지 않습니다.또한 객체를 조작하기 위한 표현을 SQL로부터 분리하려고 한 결과, 결국 SQL보다 표현력이 떨어지는 업계 표준이 아닌 API를 구축하게 될 위험성과 그 폐해가 더 크다고 생각됩니다.SQL은 이제 오래된 냄새가 나지만 SQL로 바뀌는 표준 DB 조작 API가 존재하지 않는 이상 놓치는 것은 위험할 것입니다.ADOdb에도 그러한 야심찬 기능이 구현되어 있습니다만, 반드시 사용해야만 하는 것도 아니고, 충분히 테스트도 이루어지지 않은 느낌이기 때문에 당분간은 관망할 것입니다.ADOdb는 그 밖에도 각종 DB를 추상화하여 동일시 하기 위한 틀, SQL문 생성 지원 기능, DB에 대한 조작을 로깅하여 DB의 성능을 감시하는 기능 등을 담고 있습니다.Nagadodb의 기본적인 기능 ADOdb는 기본적으로 DB와의 접속을 나타내는 ADO Connection형 객체에 대해 DB조작을 부여하여 그 결과를 ADO Record Set형 객체로 취득할 수 있도록 하고 있습니다.다만, RecordSet이라는 이름에서 알 수 있듯이 SQL에서의 Select 실행 결과를 반환하는 것이 기본으로 생각하고 있습니다.DB에 대한 INSERT/UPDATE/DELETE 와 같은 작업의 경우, 조작으로 인해 영향을 받은 줄 수 등의 정보를 ADO Connection형 객체로부터 얻게 되어 있습니다.그럼 실제로 어떤 조작을 실시할 수 있는지 차례로 살펴보도록 하겠습니다.여기에서는 필자가 실무로 이용할 수 있도록 작성한 「Nagadodb」클래스의 내용을 들여다보면서, 해설합니다.Nagadodb는 필자의 생각에 따라 ADOdb를 이용하기 쉽게 만든 래퍼입니다.Php Documenter에서 처리할 수 있는 그런 일본어 코멘트를 가지고 있기 때문에 필자와 설계사상이 다른 분은 코멘트와 코드를 읽고 나름대로의 래퍼를 만들 수 있을 것입니다.먼저 ADOdb와 Nagadodb가 동작할 수 있는 환경을 만들어 보겠습니다.ADOdb 자체는 ADOdb 공식 페이지에서 링크를 따라 다운로드 할 수 있습니다.Project: ADOdb: File List에서 최신판의 adodb-x.xx-for-php를 다운로드해 주세요.본고 집필 시점에서의 최신판은, 「4.61」입니다.ADOdb는 아직도 열정적으로 개발이 계속되고 있는 프로젝트이므로 자주 업데이트되고 있습니다.본고의 정보가 낡아 버려서 올바르지 않게 될 가능성이 있으므로 주의해 주십시오.다운로드 후 펼쳐서 여러분 각각의 정책에 따라 배치해 주십시오.반드시 Document Root 이하에 놓아야 합니다.여기에서는「/usr/local/php-modules/」에「adodb」디렉토리를 배치한 것으로서 이야기를 진행합니다.다음으로, 상기 「nagadodb.zip」을 다운로드하고, 전개해 주세요.안에 들어있는 2개의 디렉토리 중 nagadodb 디렉토리를 여러분 각각의 정책에 따라 배치해 주시기 바랍니다.이것도 굳이 Document Root 이하에 둘 필요는 없습니다.여기에서는「/usr/local/php-modules/」에「nagadodb」디렉토리를 배치한 것으로서 이야기를 진행합니다.즉, 「adodb」디렉토리와 나란히 배치하는 것으로 합니다.만일 adodb 디렉토리와 nagadodb 디렉토리를 다른 장소에 배치하는 경우에는 아래에 나타내는 수정을 실시해 주십시오.Nagadodb는 ADOdb의 래퍼이기 때문에 ADOdb의 위치를 알고 있어야 합니다.「 nagadodb . inc 」 では 、 if ( ! defined ( ′ NAGA _ ADODB _ PATH ′ )) {
/** adodb.inc.php 위치 지정(외부에서 지정도 가능) */
define ( ′ NAGA _ ADODB _ PATH ′ , ′ .. / adodb ′ ) ;
}} 라고 하는 기술에 의해서, ADOdb 의 위치를 설정하고 있습니다.ADOdb의 위치에 따라서 변경이 필요하시면 이 모듈을 읽기 전에 define()을 통해서 대응할 수 있습니다.nagadodb.zip의 경우 nagadodb.zip에 포함되는 또 하나의 디렉토리 htdocs의 test.conf에 수정해야 할 부분이 있습니다.′nagadodb.zip′에 포함되는 또 하나의 디렉토리, ′htdocs′ 디렉토리는 DocumentRoot 이하에 배치해야 합니다.이 디렉토리에 있는 파일에 웹 서버를 통해서 접근하는 것으로 Nagadodb 동작 샘플을 시험할 수 있게 되어 있습니다.또, ADOdb에 포함되는 로그 기능을 확장해서 이용하기 위해서, 「adodb」디렉토리의 「adodb-perf.inc.php」내에서 정의되고 있는 function & adodb_log_sql(&$conn, $sql, $inputarr)에 추가합니다.이 처리 흐름을 읽어보면 $tracer에 문자열을 조립하고 있는 처리를 찾을 수 있습니다.ここ に 、 global $ _ NAGA _ ADODB _ TRACER ;
if ( isset ( $ _ NAGA _ ADODB _ TRACER )) $ tracer . =
′.$_NAGA_ADODB_TRACER; 와 같은 처리를 $tracer = (string) substr ($tracer, 0,500); 의 직전, 즉, $tracer 확정 직전에 넣는 수정을 해 주세요.일명 ′학′이란 놈이죠.이 동작샘플에서는 MySQL을 상정한 것이고 시험용 DB라던가 사용자를 작성하는 것도 PHP상에서 하게 되어 있습니다.따라서 최초 DB를 작성하는 ′setup.php′만 root권한으로 DB에 접속시켜야 합니다.구체적으로는 ′test.conf′의 // DSN 문자열 (DB 작성용)
define(′ROOT_DSN′, ′mysql://root:@localhost′);에 정의되어 있는 DSN(DataSourceName) 문자열을 적절하게 수정해야 합니다.MySQL은 본인이 설정할 때까지 root패스워드가 미설정 상태일 경우가 많기 때문에 만약 root패스워드가 미설정일 경우에는 수정할 필요가 없습니다.제대로 root비밀번호를 설정하셨다면//DSN문자열(DB작성용)
define(′ROOT_DSN′, ′mysql://root:pass@localhost′);으로서 DSN 문자열에 패스워드를 넣어 주세요.DSN 표현은 PEAR에서도 사용되고 있기 때문에 여러분들에게 친숙하게 다가올 것입니다.MySQL을 사용하려면 일반적으로 $db = new Nagadodb ( ′ mysql : // user : pass @ localhost / db _ name ? persist ′ ) ; の よう に 書けます 。마지막 파라미터 persist는 DB로의 지속적 접속을 지정합니다.상당히 번거로운 준비를 부탁했지만, 준비가 되면 조속히 샘플을 움직여 보도록 합시다.setup.php에 웹 서버를 경유해서 브라우저를 이용해서 한번만 접속해 주세요.그러면 ′test.sql′을 실행해서 ′DB를 생성했습니다.′라는 답변을 얻을 수 있습니다.DB클라이언트(mysql 명령어 등)를 사용해서 DB를 확인하시면 테이블 등이 생성되어 있음을 확인하실 수 있습니다.setup.php′에서는 Nagadodb형 객체의 생성과 execute File 메서드 실행을 하고 있습니다.executeFile 메서드는 SQL 문의 기술된 파일을 실행하는 메서드입니다.지정된 파일의 내용을 SQL 문으로 해석하여 적힌 순서대로 순서대로 실행을 합니다.또한, 제2인수를 받을 수도 있고, 제2인수를 배열로 $argArr [′name′]] = ′value′; 형식으로 이름과 그에 맞는 값의 조를 여러 개 주면 파일 내에 기술된 ′$name′ 을 모두 맞는 값으로 바꾼 후 SQL 문을 실행합니다.SQL 문장을 여러 개 조합해서 정형적인 처리를 하고 싶을 때 이용할 수 있겠죠.Nagadodb의 execute File 메서드의 기능은 ADOdb와 직접 관련된 것은 아니지만 이러한 기능들은 유익합니다.PHP로 구축된 많은 어플리케이션에서 변수의 내용을 바탕으로 SQL 문을 조립하기 위해서 코드 내에 SQL 문이 채워져 버리는 경향이 있습니다.execute File 메서드와 같이 PHP와 SQL 문을 분리할 수 있는 구조가 있으면 본래 서로 다른 두 기술을 분리하여 유지보수 할 수 있습니다.SQL문에는 잘 알지만 PHP는 사용해 본 적이 없는 직원들에게는 분리된 SQL문 구축과 최적화를 업무에 부여할 수 있습니다.접속하고 싶은 DB가 MySQL이 아닌 경우에는 ′test.sql′의 내용을 참고,′nagadodb_db′이라는 DB를 생성하고′test′테이블과 ′adodb_logsql′테이블을 그 안에 만들어 사용자 이름′nagauser′패스워드′nagapass′에서 풀 접할 수 있도록 하세요.그래야 ′setup.php′를 실행한 것과 같은 상태를 만들 수 있습니다.이 경우, ′test.conf′의 // DSN 문자열
define ( ′ NAGA _ DSN ′ ,
mysql://nagauser: nagapass@localhost/nagadodb_db?persist′);를 수정해야 합니다.예를 들어 PostgreSQL7.x를 사용하고 있다면//DSN문자열
define ( ′ NAGA _ DSN ′ ,
postgres7://nagauser:nagapass@localhost/nagadodb_db?persist′); 등으로 할 필요가 있습니다.초기화가 끝나면 index.php에 웹 서버를 경유해서 브라우저를 이용해서 접근을 해 주세요.이 샘플에서는 메모를 남길 수 있습니다.일단 새로운 메모를 남겨보도록 하죠.ID 란에 아무것도 넣지 않고 memo 란에 메모를 쓰고 ′새로고침′을 누르면 메모일람에 새로운 메모가 추가되는 것을 확인할 수 있습니다.신규등록 시 index.php에서는 Nagadodb 오브젝트를 생성하고 작업로그를 모두 남기도록 설정한 후 $record의 내용에 따라 DB에 추가를 합니다.DB 조작 로그를 다룰 방법을 결정하는 Nagadodb의 set Logging Level 메서드는 인수에 따라 DB가 조작된 것을 로그로 남깁니다.ADOdb의 LogSQL 메서드를 사용하여 수행한 SQL 문을 로그로 남길 수 있습니다.이 기능을 사용하기 위한 시스템이 setLoggingLevel 메소드로 구현되어 있습니다.인수에 full을 주면 모든 DB 작업을 로그로 남깁니다.로그는 ′adodb_logsql′ 테이블에 남겨집니다.ADOdb가 구현하고 있는 로그 기능에서는 실행된 SQL 문장과 함께 SQL 문을 실행한 컴퓨터의 IP 주소, SQL 문을 실행한 PHP 파일을 기록하게 되어 있습니다.그러나, 실제의 로그로서 활용하는 것을 생각하면, 누가 그 PHP 파일을 실행했는지 특정할 수 있는 정보가 필요합니다.Nagadodb에서는 ADOdb가 구현하고 있는 로그 기능을 확장하여 SQL 문을 실행하는 PHP 파일을 브라우징한 단말기의 IP 주소와 사용자 에이전트 문자열도 함께 기록하도록 하고 있습니다.준비를 하는 부분에서 adodb-perf.inc.php에 대해서 수행한 핵은 이 기능을 위해서 입니다.만약 기록해야 될 내용을 변경하고 싶다면 setTracer 메서드를 사용할 수 있습니다.DB에 추가를 하려면 Nagadodb의 insert 메소드가 있습니다.insert 메서드에서는 추가할 데이터 배열 표현을 바탕으로 한 줄의 데이터를 테이블에 추가합니다.배열 표현은 컬럼 이름을 배열의 index에, 추가하고 싶은 데이터를 배열 값으로 합니다.index.php에서는 배열 $record로 id, date, memo가 설정되어 사용되고 있습니다.이어서 메모를 수정해 보겠습니다.수정할 메모의 ID를 메모 일람에서 선택하여 ID란에 입력하고 memo란에 새 메모를 쓰고 ′새로고침′을 누르면 메모 일람에서 메모가 수정된 것을 확인할 수 있습니다.수정 시 index.php에서는 $record의 내용에 따라 DB로 업데이트를 합니다.DB 갱신에는 Nagadodb의 update 메서드가 사용됩니다. update 메서드에서는 갱신할 데이터의 배열 표현을 바탕으로 Where 조건에 일치하는 행의 데이터를 갱신합니다.배열표현은아까추가할때와마찬가지입니다.「index.php」에서는 ID란에 입력된 것과 같은 id를 가지는 행에 대해서 갱신을 하고 있습니다.메소드가 돌아오는 값으로 영향을 준 줄 수를 알 수 있기 때문에 그에 따른 메시지를 출력할 수 있게 되어 있습니다.DB사용 시에는 해당 행이 없으면 신규등록, 있으면 수정하는 작업을 하고 싶을 수가 있습니다.예를 들어 사용자가 관리하는 DB에서 사용자의 최신 상태를 유지하고 있는 경우, 이미 사용자 정보가 존재한다면 업데이트, 없다면 신규 사용자로 등록과 같은 처리를 하게 될 것입니다.Nagadodb에서는, updateBe4 Insert 메서드에 의해서, 그러한 처리를 실현할 수 있습니다.마지막으로 메모 삭제를 해보겠습니다.삭제할 메모의 ID를 메모 목록에서 선택하여 ID 란에 입력한 후 ′새로고침′을 누르면 메모 목록에서 메모가 삭제된 것을 확인할 수 있습니다.삭제할 때의 index.php에서는 Nagadodb의 delete 메서드에 의해 Where 조건에 일치하는 행의 데이터를 딜리트합니다.샘플을 작업을 하시고, DB조작을 할 수 있는 것이 확인되면 DB조작결과를 살펴보도록 하겠습니다.ADOdb에서는 성능 모니터라고 하는 기능을 제공하는데, DB의 운영 상태를 확인하여 튜닝에 대한 기초 정보를 얻거나, ′adodb_logsql′ 테이블에 남겨진 로그를 확인하거나, SQL 문을 발행할 수 있습니다.′pm.php′에 웹 서버를 경유해서 브라우저를 이용해서 접속해 주세요.퍼포먼스 모니터의 조작 화면이 나타납니다.′View SQL′ 에서는 지금까지 실행된 SQL 문을 볼 수 있습니다.Nagadodb에 의한 확장을 통해 각각의 SQL을 클릭하여 실행에 사용된 브라우저의 정보를 확인할 수 있습니다.만약 DB를 잘못 조작한 범인을 찾고 싶다면 잘못된 조작을 실행한 SQL문 목록에서 찾아내 그 작업이 어느 단말기에서 이루어졌는지 밝혀낼 수 있습니다.′Run SQL′ 에서는 SQL 문을 실행할 수 있습니다.유지보수등의 약간의 DB조작을 하고 싶을때 Web베이스로 실시할 수 있기 때문에 편리합니다.개발 중에도 유용하게 사용할 수 있을 것입니다.ADOdb의 기타 기능 Nagadodb는 많은 분들이 DB를 조작하기에 충분한 기능을 제공하고 있고, 부족한 기능은 Nagadodb의 내용물을 살펴보면 구현하는 방법을 알 수 있을 것입니다.그러나, ADOdb가 가지는 기능은, 그것 뿐만이 아닙니다.PHP는 interpreter형 언어이며 변수형의 개념이 느슨하기 때문에 실행속도가 그다지 나오지 않습니다.따라서 PHP에서는 늦어지기 쉬운 처리를 C언어로 기술하고 컴파일한 공유 라이브러리에 실행시켜 속도를 버는 것을 생각할 수 있습니다.ADOdb Extension은 바로 이러한 구조로 만들어진 ADOdb 추가 모듈입니다.다운로드 받은 소스를 make를 해야 되기 때문에, rpm에서의 바이너리 설치밖에 경험이 없으신 분들은 좀 거부감이 있을 수 있지만, make 하셔야 되는 것 중에는 간단한 부류에 속할 수 있습니다.저도 사용하고 있지만 안정적으로 작동하고 있습니다.이용자가 어느 정도 예상되는 실제 서비스에서는 로드 밸런서 등을 사용한 부하 분산이 이루어집니다.이러한 환경 하에서는 부하분산 방법에 따라서는 동일한 단말기의 리퀘스트를 같은 Web 서버로 처리시키는 것을 보증할 수 없는 경우가 발생합니다.그렇게 되어 버리면, 세션 변수등의 영속적인 자원을 이용할 수 없게 되어 버립니다.그래서 모든 웹 서버에서 이용되는 DB 내에 영속적인 자원을 유지시켜서 세션 보증을 하는 것을 생각하고 있습니다.매 페이지 뷰마다 DB접속이 발생하므로 DB에 대한 부하가 높아집니다.그러나 ADOdb는 고속성이 특징이기도 하기 때문에 견딜 수 있는 한도를 적당히 기대할 수 있습니다.유감스럽게도 저는 아직 시험해 보지 않았습니다.컬럼의 형태라던가 제약 같은 것들은 세부적으로 말하면 DB의 종류에 따라서 달라집니다.그렇게 깊이 사용을 하지 않으신다면 주요 DB마다 움직이는 SQL 문장을 쓸 수 있는데, 깊이 사용을 요구하시는 경우도 있을 겁니다.따라서 DB의 종류에 따른 차이를 흡수하여 DB를 논리적으로 표현할 수 있는 방법이 필요합니다.각 DB의 다소 차이는 대부분 표현 방식에 차이가 있어 논리적으로는 차이가 없다고 볼 수 있는 경우가 많습니다.ADOdb에서는 이러한 표현을 실시하기 위해 ′데이터 딕셔너리′라는 구조를 가지고 있습니다.테이블 만들기나 컬럼 추가, 제약조건 설정 등을 SQL문이 아닌 PHP 메서드로 할 수 있습니다.또 「ADOdb XML Schema (AXMLS)」라고 하는, XML 로 데이터베이스의 스키마 정의를 실시할 수 있는 구조도 준비되어 있습니다.나는 AXMLS를 시험해 보았습니다만, 「AUTO INCREMENT」는 올바르게 설정되지만, 「AUTO」에서는 올바르게 설정되지 않는 등의 문제점이 있었습니다.DB의 스키마 정의를 XML로 하자는 접근방식은 차후에 표준사양이 나올 가능성이 높고 특별히 필요가 없으면 AXMLS를 사용할 필요가 없다고 느꼈습니다.데이터 딕셔너리는 SQL에서 할 수 있는 것을 SQL을 사용하지 않고 실현하는 것을 지향하고 있습니다.물론 SQL 사투리 때문에 고민이 되는 건 아니지만, SQL과 논리적인 개념이 같음에도 불구하고 DB 작업을 하는 기술자가 익숙한 SQL과는 다른 표현을 사용해야 된다는 건 단점입니다.예를 들어서 int를 I 라고 표현하게 되어있는 점 등이 그렇습니다. 마무리 본 글에서는 ADOdb의 래퍼인 Nagadodb를 통해서 ADOdb를 사용하는 방법에 대해서 이야기를 했습니다.여러분의 스킬에 따라 Nagadodb를 이용하는 것만으로도 좋으며, Nagadodb를 개조해서 사용하셔도 되고, 이를 계기로 ADOdb의 매뉴얼을 읽어보셔도 되겠습니다.PHP(및 Python)용 ADODb 데이터베이스 추상화 라이브러리.
/** adodb.inc.php 위치 지정(외부에서 지정도 가능) */
define ( ′ NAGA _ ADODB _ PATH ′ , ′ .. / adodb ′ ) ;
}} 라고 하는 기술에 의해서, ADOdb 의 위치를 설정하고 있습니다.ADOdb의 위치에 따라서 변경이 필요하시면 이 모듈을 읽기 전에 define()을 통해서 대응할 수 있습니다.nagadodb.zip의 경우 nagadodb.zip에 포함되는 또 하나의 디렉토리 htdocs의 test.conf에 수정해야 할 부분이 있습니다.′nagadodb.zip′에 포함되는 또 하나의 디렉토리, ′htdocs′ 디렉토리는 DocumentRoot 이하에 배치해야 합니다.이 디렉토리에 있는 파일에 웹 서버를 통해서 접근하는 것으로 Nagadodb 동작 샘플을 시험할 수 있게 되어 있습니다.또, ADOdb에 포함되는 로그 기능을 확장해서 이용하기 위해서, 「adodb」디렉토리의 「adodb-perf.inc.php」내에서 정의되고 있는 function & adodb_log_sql(&$conn, $sql, $inputarr)에 추가합니다.이 처리 흐름을 읽어보면 $tracer에 문자열을 조립하고 있는 처리를 찾을 수 있습니다.ここ に 、 global $ _ NAGA _ ADODB _ TRACER ;
if ( isset ( $ _ NAGA _ ADODB _ TRACER )) $ tracer . =
′.$_NAGA_ADODB_TRACER; 와 같은 처리를 $tracer = (string) substr ($tracer, 0,500); 의 직전, 즉, $tracer 확정 직전에 넣는 수정을 해 주세요.일명 ′학′이란 놈이죠.이 동작샘플에서는 MySQL을 상정한 것이고 시험용 DB라던가 사용자를 작성하는 것도 PHP상에서 하게 되어 있습니다.따라서 최초 DB를 작성하는 ′setup.php′만 root권한으로 DB에 접속시켜야 합니다.구체적으로는 ′test.conf′의 // DSN 문자열 (DB 작성용)
define(′ROOT_DSN′, ′mysql://root:@localhost′);에 정의되어 있는 DSN(DataSourceName) 문자열을 적절하게 수정해야 합니다.MySQL은 본인이 설정할 때까지 root패스워드가 미설정 상태일 경우가 많기 때문에 만약 root패스워드가 미설정일 경우에는 수정할 필요가 없습니다.제대로 root비밀번호를 설정하셨다면//DSN문자열(DB작성용)
define(′ROOT_DSN′, ′mysql://root:pass@localhost′);으로서 DSN 문자열에 패스워드를 넣어 주세요.DSN 표현은 PEAR에서도 사용되고 있기 때문에 여러분들에게 친숙하게 다가올 것입니다.MySQL을 사용하려면 일반적으로 $db = new Nagadodb ( ′ mysql : // user : pass @ localhost / db _ name ? persist ′ ) ; の よう に 書けます 。마지막 파라미터 persist는 DB로의 지속적 접속을 지정합니다.상당히 번거로운 준비를 부탁했지만, 준비가 되면 조속히 샘플을 움직여 보도록 합시다.setup.php에 웹 서버를 경유해서 브라우저를 이용해서 한번만 접속해 주세요.그러면 ′test.sql′을 실행해서 ′DB를 생성했습니다.′라는 답변을 얻을 수 있습니다.DB클라이언트(mysql 명령어 등)를 사용해서 DB를 확인하시면 테이블 등이 생성되어 있음을 확인하실 수 있습니다.setup.php′에서는 Nagadodb형 객체의 생성과 execute File 메서드 실행을 하고 있습니다.executeFile 메서드는 SQL 문의 기술된 파일을 실행하는 메서드입니다.지정된 파일의 내용을 SQL 문으로 해석하여 적힌 순서대로 순서대로 실행을 합니다.또한, 제2인수를 받을 수도 있고, 제2인수를 배열로 $argArr [′name′]] = ′value′; 형식으로 이름과 그에 맞는 값의 조를 여러 개 주면 파일 내에 기술된 ′$name′ 을 모두 맞는 값으로 바꾼 후 SQL 문을 실행합니다.SQL 문장을 여러 개 조합해서 정형적인 처리를 하고 싶을 때 이용할 수 있겠죠.Nagadodb의 execute File 메서드의 기능은 ADOdb와 직접 관련된 것은 아니지만 이러한 기능들은 유익합니다.PHP로 구축된 많은 어플리케이션에서 변수의 내용을 바탕으로 SQL 문을 조립하기 위해서 코드 내에 SQL 문이 채워져 버리는 경향이 있습니다.execute File 메서드와 같이 PHP와 SQL 문을 분리할 수 있는 구조가 있으면 본래 서로 다른 두 기술을 분리하여 유지보수 할 수 있습니다.SQL문에는 잘 알지만 PHP는 사용해 본 적이 없는 직원들에게는 분리된 SQL문 구축과 최적화를 업무에 부여할 수 있습니다.접속하고 싶은 DB가 MySQL이 아닌 경우에는 ′test.sql′의 내용을 참고,′nagadodb_db′이라는 DB를 생성하고′test′테이블과 ′adodb_logsql′테이블을 그 안에 만들어 사용자 이름′nagauser′패스워드′nagapass′에서 풀 접할 수 있도록 하세요.그래야 ′setup.php′를 실행한 것과 같은 상태를 만들 수 있습니다.이 경우, ′test.conf′의 // DSN 문자열
define ( ′ NAGA _ DSN ′ ,
mysql://nagauser: nagapass@localhost/nagadodb_db?persist′);를 수정해야 합니다.예를 들어 PostgreSQL7.x를 사용하고 있다면//DSN문자열
define ( ′ NAGA _ DSN ′ ,
postgres7://nagauser:nagapass@localhost/nagadodb_db?persist′); 등으로 할 필요가 있습니다.초기화가 끝나면 index.php에 웹 서버를 경유해서 브라우저를 이용해서 접근을 해 주세요.이 샘플에서는 메모를 남길 수 있습니다.일단 새로운 메모를 남겨보도록 하죠.ID 란에 아무것도 넣지 않고 memo 란에 메모를 쓰고 ′새로고침′을 누르면 메모일람에 새로운 메모가 추가되는 것을 확인할 수 있습니다.신규등록 시 index.php에서는 Nagadodb 오브젝트를 생성하고 작업로그를 모두 남기도록 설정한 후 $record의 내용에 따라 DB에 추가를 합니다.DB 조작 로그를 다룰 방법을 결정하는 Nagadodb의 set Logging Level 메서드는 인수에 따라 DB가 조작된 것을 로그로 남깁니다.ADOdb의 LogSQL 메서드를 사용하여 수행한 SQL 문을 로그로 남길 수 있습니다.이 기능을 사용하기 위한 시스템이 setLoggingLevel 메소드로 구현되어 있습니다.인수에 full을 주면 모든 DB 작업을 로그로 남깁니다.로그는 ′adodb_logsql′ 테이블에 남겨집니다.ADOdb가 구현하고 있는 로그 기능에서는 실행된 SQL 문장과 함께 SQL 문을 실행한 컴퓨터의 IP 주소, SQL 문을 실행한 PHP 파일을 기록하게 되어 있습니다.그러나, 실제의 로그로서 활용하는 것을 생각하면, 누가 그 PHP 파일을 실행했는지 특정할 수 있는 정보가 필요합니다.Nagadodb에서는 ADOdb가 구현하고 있는 로그 기능을 확장하여 SQL 문을 실행하는 PHP 파일을 브라우징한 단말기의 IP 주소와 사용자 에이전트 문자열도 함께 기록하도록 하고 있습니다.준비를 하는 부분에서 adodb-perf.inc.php에 대해서 수행한 핵은 이 기능을 위해서 입니다.만약 기록해야 될 내용을 변경하고 싶다면 setTracer 메서드를 사용할 수 있습니다.DB에 추가를 하려면 Nagadodb의 insert 메소드가 있습니다.insert 메서드에서는 추가할 데이터 배열 표현을 바탕으로 한 줄의 데이터를 테이블에 추가합니다.배열 표현은 컬럼 이름을 배열의 index에, 추가하고 싶은 데이터를 배열 값으로 합니다.index.php에서는 배열 $record로 id, date, memo가 설정되어 사용되고 있습니다.이어서 메모를 수정해 보겠습니다.수정할 메모의 ID를 메모 일람에서 선택하여 ID란에 입력하고 memo란에 새 메모를 쓰고 ′새로고침′을 누르면 메모 일람에서 메모가 수정된 것을 확인할 수 있습니다.수정 시 index.php에서는 $record의 내용에 따라 DB로 업데이트를 합니다.DB 갱신에는 Nagadodb의 update 메서드가 사용됩니다. update 메서드에서는 갱신할 데이터의 배열 표현을 바탕으로 Where 조건에 일치하는 행의 데이터를 갱신합니다.배열표현은아까추가할때와마찬가지입니다.「index.php」에서는 ID란에 입력된 것과 같은 id를 가지는 행에 대해서 갱신을 하고 있습니다.메소드가 돌아오는 값으로 영향을 준 줄 수를 알 수 있기 때문에 그에 따른 메시지를 출력할 수 있게 되어 있습니다.DB사용 시에는 해당 행이 없으면 신규등록, 있으면 수정하는 작업을 하고 싶을 수가 있습니다.예를 들어 사용자가 관리하는 DB에서 사용자의 최신 상태를 유지하고 있는 경우, 이미 사용자 정보가 존재한다면 업데이트, 없다면 신규 사용자로 등록과 같은 처리를 하게 될 것입니다.Nagadodb에서는, updateBe4 Insert 메서드에 의해서, 그러한 처리를 실현할 수 있습니다.마지막으로 메모 삭제를 해보겠습니다.삭제할 메모의 ID를 메모 목록에서 선택하여 ID 란에 입력한 후 ′새로고침′을 누르면 메모 목록에서 메모가 삭제된 것을 확인할 수 있습니다.삭제할 때의 index.php에서는 Nagadodb의 delete 메서드에 의해 Where 조건에 일치하는 행의 데이터를 딜리트합니다.샘플을 작업을 하시고, DB조작을 할 수 있는 것이 확인되면 DB조작결과를 살펴보도록 하겠습니다.ADOdb에서는 성능 모니터라고 하는 기능을 제공하는데, DB의 운영 상태를 확인하여 튜닝에 대한 기초 정보를 얻거나, ′adodb_logsql′ 테이블에 남겨진 로그를 확인하거나, SQL 문을 발행할 수 있습니다.′pm.php′에 웹 서버를 경유해서 브라우저를 이용해서 접속해 주세요.퍼포먼스 모니터의 조작 화면이 나타납니다.′View SQL′ 에서는 지금까지 실행된 SQL 문을 볼 수 있습니다.Nagadodb에 의한 확장을 통해 각각의 SQL을 클릭하여 실행에 사용된 브라우저의 정보를 확인할 수 있습니다.만약 DB를 잘못 조작한 범인을 찾고 싶다면 잘못된 조작을 실행한 SQL문 목록에서 찾아내 그 작업이 어느 단말기에서 이루어졌는지 밝혀낼 수 있습니다.′Run SQL′ 에서는 SQL 문을 실행할 수 있습니다.유지보수등의 약간의 DB조작을 하고 싶을때 Web베이스로 실시할 수 있기 때문에 편리합니다.개발 중에도 유용하게 사용할 수 있을 것입니다.ADOdb의 기타 기능 Nagadodb는 많은 분들이 DB를 조작하기에 충분한 기능을 제공하고 있고, 부족한 기능은 Nagadodb의 내용물을 살펴보면 구현하는 방법을 알 수 있을 것입니다.그러나, ADOdb가 가지는 기능은, 그것 뿐만이 아닙니다.PHP는 interpreter형 언어이며 변수형의 개념이 느슨하기 때문에 실행속도가 그다지 나오지 않습니다.따라서 PHP에서는 늦어지기 쉬운 처리를 C언어로 기술하고 컴파일한 공유 라이브러리에 실행시켜 속도를 버는 것을 생각할 수 있습니다.ADOdb Extension은 바로 이러한 구조로 만들어진 ADOdb 추가 모듈입니다.다운로드 받은 소스를 make를 해야 되기 때문에, rpm에서의 바이너리 설치밖에 경험이 없으신 분들은 좀 거부감이 있을 수 있지만, make 하셔야 되는 것 중에는 간단한 부류에 속할 수 있습니다.저도 사용하고 있지만 안정적으로 작동하고 있습니다.이용자가 어느 정도 예상되는 실제 서비스에서는 로드 밸런서 등을 사용한 부하 분산이 이루어집니다.이러한 환경 하에서는 부하분산 방법에 따라서는 동일한 단말기의 리퀘스트를 같은 Web 서버로 처리시키는 것을 보증할 수 없는 경우가 발생합니다.그렇게 되어 버리면, 세션 변수등의 영속적인 자원을 이용할 수 없게 되어 버립니다.그래서 모든 웹 서버에서 이용되는 DB 내에 영속적인 자원을 유지시켜서 세션 보증을 하는 것을 생각하고 있습니다.매 페이지 뷰마다 DB접속이 발생하므로 DB에 대한 부하가 높아집니다.그러나 ADOdb는 고속성이 특징이기도 하기 때문에 견딜 수 있는 한도를 적당히 기대할 수 있습니다.유감스럽게도 저는 아직 시험해 보지 않았습니다.컬럼의 형태라던가 제약 같은 것들은 세부적으로 말하면 DB의 종류에 따라서 달라집니다.그렇게 깊이 사용을 하지 않으신다면 주요 DB마다 움직이는 SQL 문장을 쓸 수 있는데, 깊이 사용을 요구하시는 경우도 있을 겁니다.따라서 DB의 종류에 따른 차이를 흡수하여 DB를 논리적으로 표현할 수 있는 방법이 필요합니다.각 DB의 다소 차이는 대부분 표현 방식에 차이가 있어 논리적으로는 차이가 없다고 볼 수 있는 경우가 많습니다.ADOdb에서는 이러한 표현을 실시하기 위해 ′데이터 딕셔너리′라는 구조를 가지고 있습니다.테이블 만들기나 컬럼 추가, 제약조건 설정 등을 SQL문이 아닌 PHP 메서드로 할 수 있습니다.또 「ADOdb XML Schema (AXMLS)」라고 하는, XML 로 데이터베이스의 스키마 정의를 실시할 수 있는 구조도 준비되어 있습니다.나는 AXMLS를 시험해 보았습니다만, 「AUTO INCREMENT」는 올바르게 설정되지만, 「AUTO」에서는 올바르게 설정되지 않는 등의 문제점이 있었습니다.DB의 스키마 정의를 XML로 하자는 접근방식은 차후에 표준사양이 나올 가능성이 높고 특별히 필요가 없으면 AXMLS를 사용할 필요가 없다고 느꼈습니다.데이터 딕셔너리는 SQL에서 할 수 있는 것을 SQL을 사용하지 않고 실현하는 것을 지향하고 있습니다.물론 SQL 사투리 때문에 고민이 되는 건 아니지만, SQL과 논리적인 개념이 같음에도 불구하고 DB 작업을 하는 기술자가 익숙한 SQL과는 다른 표현을 사용해야 된다는 건 단점입니다.예를 들어서 int를 I 라고 표현하게 되어있는 점 등이 그렇습니다. 마무리 본 글에서는 ADOdb의 래퍼인 Nagadodb를 통해서 ADOdb를 사용하는 방법에 대해서 이야기를 했습니다.여러분의 스킬에 따라 Nagadodb를 이용하는 것만으로도 좋으며, Nagadodb를 개조해서 사용하셔도 되고, 이를 계기로 ADOdb의 매뉴얼을 읽어보셔도 되겠습니다.PHP(및 Python)용 ADODb 데이터베이스 추상화 라이브러리.
반응형