티스토리 뷰

C++

OCI와 OCCI 그리고 버그,,

루우지 2018. 8. 18. 12:55

1. OCI (Oracle Call Interface)

 - Application과 Oracle Database와 상호작용할 수 있도록 오라클에서 지원하는 Low-Level api이다. 일반적으로 C/C++에서 많이 사용된다. 그런데 OCI 프로그래밍은 Low-Level  API를 사용하는것이라 매우 어렵다. 다만 ODBC처럼 Oracle Client를 설치하지 않고 oci 관련된 dll을 같이 배포할때 포함해주면 되기 때문에 사용자가 oracle 을 설치하지 않아도 된다는 이점이 있다. 물론 단점은 위에서 언급했듯이 개발자가 사용하기 쉬운 API는 아니라른점.




2. OCCI (Oracle C++ Call Interface)

 - 약자와 같이 OCCI는 C++에서 오라클DB를 조작할 수 있게금 도와주는 API다. Low-Level로 작성된 OCI를 C++로 랩핑하여 API를 제공해주는데 공식 도큐먼트에서의 OCCI의 장점을 아래와 같이 설명하고 있다.




1) C++과 같은 객체지향 프로그래밍 활용

2) 사용하기 쉽다.

3) JDBC에 익숙한 사람들에게 배우기가 쉽다.









실제로 OCI와 OCCI의 사용 문법은 판이하게 다른다. JDBC에 익숙한 나에게는 OCCI에서 제공해주는 API가 더 친숙하고, 친절하다. 


하지만 OCCI는 단점이 있다..


VS2015에서 사용하면 버그가 생긴다. 

- 정확히는 OCCI가 VS2010 (V100) 까지의 라이브러리 파일을 제공해준다. (dll도 같이)하지만 나는 vs2015를 사용하는데 OCCI(oraocci11d.lib)를 사용할때 getString() 함수를 사용하는데 힙커런트 에러가 뜬다. 이는 내부적으로 2번 메모리를 delete해주는 현상이라고 한다. (정확히는 모름) 무려 저 에러때문에 하루를 다 날려먹었지만 결국 vs2010 으로 갈아타고 작업하는데 성공했다.


해당 에러를 잡으면서 많은 생각을 했다. OCCI를 버리고 OCI로 갈것이냐, ODBC방식으로 갈것이냐, 혹은 JVM을 위에올려서 JDBC로 갈것이냐 등,, 결국 VS2010으로 다운그레이드하여 OCCI를 끝까지 가져가보자라는 방식으로 마음 먹었다.