주식회사 누리아이티

정보자산의 보안강화를 위한 2차인증 보안SW 및 지문인식 OTP/출입/보안카드 전문기업

▶ BaroSolution/가이드

Oracle External Procedure 사용법(Java 모듈)

누리아이티 2018. 1. 3. 07:48

 

1. External Procedure ?

 

복잡한 수식계산을 Oracle에서 제공하는 기능으로만 충분하지 않을 경우가 있는데, 이럴 경우 C JAVA 같은 언어로 복잡한 기능을 작성한 후 Oracle 에서는 파라미터를 넘겨서 해당 결과를 받으면 수행속도의 개선을 가져올 수 있는데, 간단히 말하자면 C언어나 VB, JAVA 등의 언어를 사용하여 SQL에서 구현하기 어렵거나 복잡한 것을 구현한 뒤 SQL에서 호출해서 사용하는 것을 말한다.

 

2. 장점 및 단점

 

External Procedure을 사용하여 얻는 장점으로는 Java C의 재 활용성이 우수하다. 반면 External Procedure을 사용으로 발생하는 단점은 Session이 종료되지 않으면 extProc Oracle에서 메모리를 관리하는 영역이 아니라 O/S영역이기 때문에 한번 호출 될 때마다 해당 Session이 종료되지 않으면 끝까지 살아남게 되어 지속적인 메모리에 남아 있게 되어 O/S의 메모리 부하가 생길 수 밖에 없다.

 

그래서, O/S의 메모리를 최대한 줄일 수 있는 방법은 다음과 같다.

 

Session의 수를 제한하여 O/S의 메모리 한계치를 벗어나지 않도록 조정한다.

 

O/S에서 extProc로 생성된 것 중 오래된 Process Kill한다. Process Kill하더라도 없으면 재생성 되므로 큰 문제는 발생되지 않는다.

 

③ 어플리케이션에서 불필요하게 External Procedure를 호출하는 Function의 사용을 제거하고, 사용 완료 후 Session를 종료하여 메모리의 부하를 최소화 하게 한다.

 

3. Java 모듈(barocrypts.java)

 

Java 모듈은 C 모듈과 달리 External Procedure를 사용하지 않으며, Oracle 내에 Java 공간을 Load해서 사용하는 특징이 있다.

 

3.1 Java 모듈 소스(barocrypts.java)

 

barocrypts.java 소스 참조

 

3.2 Java 모듈 컴파일

 

Java 모듈을 컴파일하기 전에 먼저 Java를 컴파일 하기 위한 JDK가 설치 되어 있어야 하며, Java 모듈을 컴파일 하기 위한 환경설정 및 컴파일 방법은 다음과 같다.

 

Java 환경설정(.profile)

 

export JAVA_HOME=/usr/lib/jvm/java-1.7.0-openjdk-1.7.0.131.x86_64
export CLASSPATH=$CLASSPATH:$JAVA_HOME/lib/tools.jar

 

Java version 확인

 

> java -version
java version "1.7.0_131"
OpenJDK Runtime Environment (rhel-2.6.9.0.el5_11-x86_64 u131-b00)
OpenJDK 64-Bit Server VM (build 24.131-b00, mixed mode)

 

barocrypts.java 컴파일

 

> javac barocrypts.java

 

3.3 Java 모듈 Load

 

Java 모듈을 Oracle 내에 Java 공간으로 Load하는 방법은 다음과 같이 두 가지 방법이 존재한다.

 

① 컴파일된 SourceLoad

 

> loadjava -user baropam/baropam barocrypts.class

 

② 소스 및 컴파일 소스까지 Load

 

> loadjava -user baropam/baropam -resolve -v barocrypts.java
arguments: '-user' 'baropam/***' '-resolve' '-v' 'barocrypts.java'
creating : source barocrypts
loading  : source barocrypts
created  : CREATE$JAVA$LOB$TABLE
resolving: source barocrypts
Classes Loaded: 0
Resources Loaded: 0
Sources Loaded: 1
Published Interfaces: 0
Classes generated: 0
Classes skipped: 0
Synonyms Created: 0
Errors: 0
 

 

3.4 암복화/메시지 전송 Stored Function 생성 및 확인

 

Oracle sqlplus로 접속한 뒤 TO_ENCRYPTS(암호화 함수), TO_DECRYPTS(복호화 함수)를 다음과 같이 생성 및 확인한다.

 

[root] /home/baropam/crypt> sqlplus baropam/baropam
 
SQL*Plus: Release 11.2.0.1.0 Production on 9 26 10:56:01 2017
 
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
 
 
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
 
SQL> CREATE OR REPLACE FUNCTION TO_ENCRYPT (input VARCHAR2) RETURN VARCHAR2 IS
            LANGUAGE JAVA
            NAME 'barocrypts.baro_encrypts(java.lang.String) return java.lang.String';
      /
 
Function created.
 
SQL> CREATE OR REPLACE FUNCTION TO_DECRYPT (input VARCHAR2) RETURN VARCHAR2 IS
            LANGUAGE JAVA
            NAME 'barocrypts.baro_decrypts(java.lang.String) return java.lang.String';
      /
Function created.
 
SQL> commit;
 
Commit complete.
 

 

3.5 암복화 함수(TO_ENCRYPTS, TO_DECRYPTS),  테스트

 

> sqlplus baropam/baropam
 
SQL*Plus: Release 11.2.0.1.0 Production on 9 12 11:34:24 2017
 
Copyright (c) 1982, 2009, Oracle.  All rights reserved.
 
 
다음에 접속됨:
Oracle Database 11g Release 11.2.0.1.0 - 64bit Production
 
SQL> SELECT TO_ENCRYPTS('qwerqwerqwer이종일qwerqwer') FROM DUAL;
 
TO_ENCRYPTS('QWERQWERQWER이종일QWERQWER')
--------------------------------------------------------------------------------
LkrLD7uCXBnPZreic9NgsHgsDjWQG1QQL0w9UHndzy8=
 
SQL> SELECT TO_DECRYPTS('LkrLD7uCXBnPZreic9NgsHgsDjWQG1QQL0w9UHndzy8=') FROM DUAL;
 
TO_DECRYPTS('LKRLD7UCXBNPZREIC9NGSHGSDJWQG1QQL0W9UHNDZY8=')
--------------------------------------------------------------------------------
qwerqwerqwer이종일qwerqwer