본문 바로가기
Tip & Tech/Tech

CUBRID 설치 / Tomcat CUBRID JDBC 연동 / ORACLE -> CUBRID 마이그레이션

by 나비와꽃기린 2019. 1. 25.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.


기존에 ORACLE DataBase를 사용했는데 Oracle에 국한된 서비스가 아닌

CUBRID에도 서비스되고자 마이그레이션작업을 진행하기로 했다.

일단 Oracle DB에서 테이블과 데이터를 덤프를 뜬 것을 CUBRID에 옮기고

어플리케이션에서 CUBRID로 JDBC연동을 했는데 그 과정을 정리해본다.


CUBRID 사용이유


국산 오픈소스 DBMS 면서 핵심 엔진을 개발하는 개발 조직이 NHN(네이버) 근무하고 있고 있으며

오라클이나 SQL Server 사용하다가 시스템이 죽으면 무슨 원인인지도 모른체 시스템을 재부팅하고 마는 답답한 시스템 운영 경험을 국내 엔진개발자에게 문의를 할수도 있어서이다.




CUBRID 설치


CUBRID 윈도우 설치

버전 10.1 (최신) – 2019 1 18 기준


큐브리드 공식 다운로드 사이트에서 무료로 다운로드가 가능하다.

http://www.cubrid.com/downloads


이 외에, ORACLE DB로 전환하는 마이그레이션 가이드 같은것도 있고

사용방법도 잘 정리되어 있기 때문에 공식사이트를 적극 참고하도록 한다(!)




1.     자신의 OS에 맞는 환경을 설치한다.

윈도우10환경의 로컬에서 설치하는 것이므로 윈도우 64비트를 다운로드 하였음






2.     다운로드 받은 파일 더블클릭 실행





3.     큐브리드 공식문서에도 나와있지만

큐브리드 설치를 위해서는 JRE 버전 1.5 이상 필요

이미 1.5이상 버전이 설치되어 있으므로 확인누르고 설치시작.





      4. CUBRID 설치 시작 Next클릭




     5. 라이센스 동의에 체크하고 Next 클릭





6.   큐브리드 설치 경로 설정.

이때 데모DB를 설치할지 말지를 선택할 수 있는데

테스트를 위한 분들은 체크하시고 아니면 체크해제~하고 진행





7. Install 시작






8. 설치 중






9. 설치완료

큐브리드서비스 시작할지 체크박스 확인

당연히 사용을 하려면 서비스실행을 해야하니 체크하고 확인클릭, 설치마무리




CUBRID Manager 설치

CUBRID 서버쪽은 설치를 완료했으니

실제 DB에 붙어서 쿼리를 날려볼 TOOL 필요.

Sqldeveloper와 비슷한 TOOL인데 CUBRID에서는 CUBRID TOOL로서

CUBRID Manager라는 TOOL을 제공함. 추가설치를 진행한다.





1. 아까 CUBRID 설치한 페이지 아래에 보면 CUBRID Tools라고 Manager를

설치할 수 있는 항목이 있음

똑같이 윈도우64비트다운~





 

2. 다운로드 파일 더블클릭하여 설치시작 




3. 한국어로 설치 OK 클릭 진행





4. CUBRID Manager 설치 시작 




5. 라이센스 동의함 클릭




6. 구성요소 선택하고 다음 클릭





7. 설치위치 확인



8. 설치중




9. 설치완료. 정말 Next만 눌르면 설치가 된다. 편하다.

딱히 설명할 것도 없다..





10. 이클립스와 비교해 봤을때 정말 비슷하게 생겼다.

더블클릭해서 매니저 실행



CUBRID DB접속




1. C\CUBRID\cubridmanager 하위 workspace경로가 default로 셋팅된다.

workspace변경할 분은 여기서 변경하면 된다.





2. 관리자모드, 사용사모드 선택

접속 후 변경가능하니 편하신대로 진행

DBA 권한으로 접속할게 아니니 질의모드 선택했다.




3. 좌측 상단의 연결정보 클릭




4. CUBRID설치시 testdb를 설치하신 분들이라면

testdb에 붙어서 테스트해보아도 된다.(이때 비밀번호는 없다)


필자는 ORACLE DB dump를 CUBRID로 마이그레이션했다.

~과정 생략~




5. 다음과 같이 DB에 접속하면 Sqldeveloper처럼 사용할 수 있다.



Tomcat - CUBRID - SPRING  JDBC설정방법


솔직히 설치는 가이드 안봐도 누구나 할 수 있다.

Tomcat CUBRID JDBC 설정방법이 궁금하신 분들이 더 많을 터

Oracle과 연결하는데 별로 차이점이 없어서 누구나 쉽게할 수 있다.





1. CUBRID JDBC Driver($CUBRID/jdbc/cubrid_jdbc.jar) $CATALINA_HOME/lib 에 복사






<Resource name="jdbc/CUBRIDDS" auth="Container" type="javax.sql.DataSource"

      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"

      driverClassName="cubrid.jdbc.driver.CUBRIDDriver"

      url="jdbc:cubrid:host:port:db명:::?charset=UTF-8" username="접속user명" password="비밀번호"

      maxActive="10" maxIdle="10" maxWait="-1"

      validationQuery="select 1" testOnBorrow="false"

      jdbcInterceptors="StatementCache(prepared=true)"

/>


2. Tomcat 설정의 context.xml 파일에 <context></context> 위치에 다음과 같이 작성



<resource-ref>

        <description>CUBRID</description>

        <res-ref-name>jdbc/CUBRIDDS</res-ref-name>

        <res-type>javax.sql.DataSource</res-type>

        <res-auth>Container</res-auth>

</resource-ref>

3. Tomcat 설정의 web.xml에 다음과 같이 작성



<bean id="dataSource"
	class="org.springframework.jndi.JndiObjectFactoryBean">
	<property name="jndiName" value="java:/comp/env/jdbc/CUBRIDDS" />
</bean> 

4. 배치어플리케이션의 설정파일에 dataSource 정의



5. Tomcat 기동


CUBRID JDBC 연동설정이 제대로 되지 않을 경우는 다음과 같은 에러가 난다.

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dataSource' defined in class path resource [config/jdbc-context.xml]: Invocation of init method failed; nested exception is javax.naming.NameNotFoundException: Name [jdbc/CUBRIDDS] is not bound in this Context. Unable to find [jdbc].

Caused by: javax.naming.NameNotFoundException: Name [jdbc/CUBRIDDS] is not bound in this Context. Unable to find [jdbc].

이런경우는 톰캣설정이 제대로 되었는지, JAR를 잘 넣어줬는지

DB접속정보가 맞는지 등을 확인한다.




ORACLE CUBRID 마이그레이션 결과 확인

 

배치한 어플리케이션이 잘 돌아가는지 확인해본다.




그런데 역시나 ORACLE에서 CUBRID로 마이그레이션 하니

시작점 쿼리에서부터 오류난다.ㅎㅎㅎㅎㅎㅎ

ORACLE에서 지원하는 함수를 CUBRID에서 지원안하거나 타입이 틀리거나 하는 등의 이유로 나는 것인데 궁금해져서 직접 쿼리를 날려보았다.






다음과 같이 똑같은 쿼리가 좌측의 ORACLE DB에서는 정상적으로 실행되고

우측의 CUBRID에서는 쿼리가 정상적으로 실행되지 않는 것이 확인되었다.






필자의 경우는 ORACLE에 한정된 XML function인 XMLELEMENT, XMLAGG등의

함수를 사용하고 있었는데 그 함수들이 CUBRID에서 지원해주지 않는

함수였기 때문에 CUBRID에서는 정상적으로 실행이 되지 않았던 것이다.





이 와중에 쿼리의 어디열에서 에러가 났는지 정확하게 집어주는 CUBRID ..





기존에 ORACLE에서는 XMLAGG와 XMLELEMENT로 원하는 결과값을 ,로 concat한 것처럼 갖고오던 거여서 CUBRID에는 Xmlfuntion을 대체할 다른 함수가 없는지

CUBRID 가이드를 천천히 읽어보았다


CUBRID에서 group_concat() 이름으로 지원하는 함수가

비슷한 역할을 하는 것 같아 쿼리를 다음과 같이 수정했다.



기존 oracle 서브쿼리
( SELECT SUBSTR(XMLAGG( XMLELEMENT(A,',',GROUP_ID) ORDER BY GROUP_ID).EXTRACT('//text()'),2) 
			    FROM T_BOARD_GROUP
			     WHERE BOARD_CODE = X.BOARD_CODE
			     AND AUTH_FLAG = 'W'
			     GROUP BY BOARD_CODE)  AS WRITE_GROUP_LIST,

cubrid 변경쿼리
(SELECT GROUP_CONCAT(GROUP_ID)
			     FROM T_BOARD_GROUP
			     WHERE BOARD_CODE = X.BOARD_CODE
			     AND AUTH_FLAG = 'W'
			     GROUP BY BOARD_CODE) AS WRITE_GROUP_LIST,



이런식으로 CUBRID 버전으로 쿼리를 수정해나가면 된다.

ORACLE와 CUBRID가 크게 차이점은 없어서

마이그레이션이 그렇게 어려울 것 같아 보이진 않다고 생각한다~




CUBRID DATA 깨짐 현상


사실 처음에 JDBC 연동 후, 화면에서 CUBRID 데이터가 아래와 같이 전부 깨졌었다.

Cubrid 사이트에서 jdbc 연결 샘플에

url="jdbc:cubrid:192.168.100.37:33000:testdb:::" 로 봤었는데

url="jdbc:cubrid:192.168.100.37:33000:testdb:::?charset=UTF-8" 을 넣어줘야

데이터가 깨지지 않는다.





ORACLE -> CUBRID 쿼리 변경중...

(1) XML관련 FUNCTION 변경

 ORACLE : (SELECT SUBSTR(XMLAGG( XMLELEMENT(A,',',GROUP_ID) ORDER BY GROUP_ID).EXTRACT('//text()'),2) AS GROUP_ID

 CUBRID : (SELECT GROUP_CONCAT(GROUP_ID) AS GROUP_ID

 

 (2) 날짜관련 형식 변경

 ORACLE :  and TO_CHAR(sysdate,'YYYYMMDDHH24MISS') - TO_CHAR(A.DOC_START_DATE) <![CDATA[ > ]]> 0  

 CUBRID :  and TO_CHAR(SYSDATETIME,'YYYYMMDDHH24MISS') - TO_CHAR(DOC_START_DATE) <![CDATA[ > ]]>  0


 (3) 시퀀스 사용방법 변경

 ORACLE : select PT_DOCUMENT_SEQ.currval from dual

 CUBRID : select PT_DOCUMENT_SEQ.currval from db_root

 

 (4) like N'%'

 일단 N' 다 없앴음

 CUBRID 홈디렉토리 아래 cubrid.conf 에  single_byte_compare=yes 라고 추가하신 후, 서버를 재구동하시고 질의를 사용하시면 제대로 검색이 됩니다.(라는데;?)

 ORACLE : and A.REPLY_CONTENTS LIKE N'%' || #{searchKeyword} || '%'

 CUBRID : and A.REPLY_CONTENTS LIKE '%' || #{searchKeyword} || '%'