DATOR

OCI/OO4O - Application에서의 DB connection(Oracle DB 전용)

Document URL : http://www.dator.co.kr/msjung/277441
DB Connection 프로그래밍 | Posted on April 02nd, 2012 at 23:53 by 밀오 | 조회수 : 17470

1.  오라클 접속 개념도

 

124667.gif

 

<이미지 출처: http://www.oracle.com/technetwork/database/windows/oo4o-10g-fo-097361.html>  

 

위의 그림과 같이

오라클에서도, 자사 DB에 접속하기 위한 라이브러리를 따로 제공하고 있습니다.

 

오른쪽 편에는 전에 본적이 있는 OLE DB (Microsoft 사에서 표준화한 COM Interface) 방식이 있고요,

왼쪽을 보면 OO4O라는 Oracle 고유의 COM interface가 있습니다.

 

그리고 그 아랫단에 OCI라는 Library가 있습니다.

 

결국,

OLE DB 방식을 사용하던, OO4O방식을 사용하던,

내부적으로는 OCI 를 사용하게 됩니다.

 

 

2. OCI 방식

 

원문 출처1: http://docs.oracle.com/cd/B19306_01/appdev.102/b14294/toc.htm

원문 출처2: http://docs.oracle.com/cd/B19306_01/appdev.102/b14250/toc.htm

 

OCI 의 full name은 Oracle Call Interface 입니다.

 

Oracle database에 접속하게 해주거나, SQL등을 실행하게 해주는 함수들을 모아놓은 라이브러리(API) 로,

이름에서 알 수 있듯이,  개발자는 이 라이브러리에 들어있는 함수를 '호출' 하는 방식으로 사용합니다.

 

장점으로는

1. Oracle DB 에 특화된 기능을 사용할 수 있다.

2. Oracle DB 에 최적화되어 있다.

3. Oracle DB 를 세밀하게 조작할 수 있다.

 

즉, Oracle DB만 사용하는 경우라면,

다른 방식에 비해, 여러가지 제약에서 자유로울 수 있게 됩니다.

 

반대로 말하면,

이 방식으로 만든 프로그램은, 다른 DB에는 사용할 수 없게 됩니다.

  

OCI 자체만으로도 큰 주제이지만,

여기서는 본래의 취지에 맞게 접속에 대한 기본적인 내용만 알아보고,

 

고급 기술들은, 아쉽지만 나중에 기회가 될 때 다시 정리해 보겠습니다.

 

2.1 OCI의 DB 접속 방법

 

   -   OCI 프로그램의 기본 흐름 -

          lnoci017.gif

 

  위 내용을 글로 풀어보면

 

  1. Environment 생성

    OCIEnvCreate(...)

  함수 인자를 어떻게 설정하느냐에 따라,

  Thread와 Memory등 Processing 환경이 결정됩니다.

 

  2. Handle과 Data structure를 메모리에 할당 및 초기화.

   OCIHandleAlloc()

 나중에 호출할 함수에서 필요로 하는 Handle들을 등록합니다.

 어떤 Handle을 할당할 것인가의 문제는, 결국 어떤 함수를 호출할 것인가에 달려있습니다.

 

 OCIEnvNlsCreate()

  OCIEnvCreate에서 할당한 EnvHandle을 가지고 초기화를 수행합니다.

 (OCIInitialize() 과 OCIEnvInit()는 구 버전 OCI에서 사용했던 초기화 함수입니다.)

 

 OCIAttrSet()

  유저와 패스워드 등의 설정값을 지정할 수 있습니다.

 

  3. Server에 접속 및 Session 시작

    단일 유저/단일 접속 방식

    OCILogon2( )
  (OCILogon()는 구 버전 방식)
   session이나 유저의 변경이 불가능한 방식입니다.


     예) OCILogon2(envhp, errhp, &svchp, (text *)"hr", (ub4)strlen("hr"), (text *)"hr",
          (ub4)strlen("hr"), (text *)"oracledb", (ub4)strlen("oracledb"),
          OCI_DEFAULT);

 

참고) Oracle 10.2 버전부터 방화벽으로 네트워크가 막힌 경우, 프록시 서버로 접속하는 방법도 제공하고 있습니다.

(http://docs.oracle.com/cd/B19306_01/appdev.102/b14250/oci02bas.htm#i462054 )

 

    멀티 세션/멀티  connection  방식

    OCIServerAttach()- 서버에 접속

    OCISessionBegin()- 세션 시작

 

 

  4. SQL등 필요한 작업 수행

 

  5. 작업이 끝났다면, 접속 해제

  OCILogoff() - OCILogon2()로 로그인 한 경우

  OCISessionEnd() - OCISessionBegin()으로 시작한 경우

 

  6. 메모리에 올려두었던 Handle과 Data structure등을 해제.

     The OCIHandleFree()

  

 

이와 같은 방식으로 DB 연결 및 작업이 이루어지게 됩니다.

이것만 보면, 다른 방식들과 큰 차이는 없습니다.

 

 

그 외에

 

다만, 이외에 제공하는 고급 함수들을 살펴 보면, 상당히 매력적인 기능들이 많이 보입니다.

 

그 중 하나를 아래에 붙여보았습니다.

 

Direct Path Loading

lnoci040.gif

이 글에서는 더 조사해 보지 못했지만,

이처럼 OCI에는 여러가지로 연구해 볼 만한 기능들이 많이 내장되어 있습니다.

 

 

3. OO4O 방식

원문 출처1: http://docs.oracle.com/cd/B19306_01/win.102/b14308/toc.htm

원문 출처2: http://docs.oracle.com/cd/B19306_01/win.102/b14309/toc.htm

 

OO4O의 full name은 Oracle Object for OLE 입니다.

OCI를 한번 감싸서 class로 만들어놓은 것으로 보면 됩니다.

 

즉, OCI에서 주로 사용하는 것들을 모아서 class의 형태로 묶어 놓았고,

OLE를 지원하면서 다른 Object들 과의 호환도 가능해졌습니다.


OO4O 접속 개념도

 

 Description of o4o00000.gif follows


OO4O의 Class 구성도

 

 cpp00001.gif

 

 

 

하나의 OClient가 여러개의 OSession을 가질 수 있고,

OSession 하나에는 여러개의 OConnection이 있을 수 있으며,

하나의 OConnection은 같은 OSession에 연결된 ODatabase 간에 공유됩니다.

 

OO4O의 DB 접속 방법

 

OO4O의 객체를 생성하기 이전에 OStartup을 호출하고,

프로그램이 끝날 때  OShutdown를 호출하는 방식으로 구성하도록 되어있습니다.

 

(개인적인 생각이지만) OOP 치고는 약간 특이하게도, 객체 생성 이전에 함수 호출이 되는 구성입니다.

 

그리고 DB 접속은 아래처럼 할 수 있습니다.

ODatabase  odb("ExampleDB", "scott", "tiger");

 

물론, 세션을 구성하고, connection을 구성한 뒤에, Database에 접속할 수도 있고,

각 객체간 서로 연결된 객체를 알아내는 등, OOP 방식의 이점을 살릴 수 있습니다.

 

위 문장 하나만으로 접속이 되니,

다른 접속 방법에 비해, 상당히 간편해 보입니다.

 

하지만, Oracle에만 접속이 된다는 걸 감안해보면, 당연한 결과라고 생각됩니다.

접속할 DB의 종류가 이미 결정되어 있으니, 그 만큼 간편해 질 수 밖에요.

 

간편하다는 점 외에도,

Oracle DB에 특화된 기능들을 제공한다는 장점이 있습니다.

 

실제로 이 방식을 많이 써보진 못했기 때문에,

다른 접속방식 (OLE DB등)의 비교는 아직 뭐라 말할 단계는 아닌 것 같습니다.

 

다만, 꼭 필요한 기능이 있을 때

OO4O 에는 그 기능이 있고, OLE DB에는 그 기능이 없다면,

그 한가지 사실만으로도, OO4O를 선택할 이유가 될 수 있을 것입니다.

 

Tagged :
   

Comments : 0