본문 바로가기

Database/Oracle Database

Oracle REST Data Services - 2. 테이블 엑세스 샘플 테스트

참조문서: Oracle REST Data Services 21.4
이전글: 2022.02.28 - [Database/Oracle Database] - Oracle REST Data Services - 1. 개요 및 ORDS 설치

샘플 테스트를 위한 사전 체크

  • ORDS 가 설치되어 있어야 하고, 오라클 데이터베이스와 연결 설정이 되어 있어야 합니다. (앞선 글 [Oracle REST Data Services - Sample Usage]을 참조)
  • RESTful 서비스 편집을 위해 Oracle SQL Developer 4.1 이상이 필요합니다.
  • 테스트 데이터 확인을 위해 웹 브라우저에 JSON formatter 설치되어 있으면 좋습니다.

그리고 ORDS Standalone 모드로 오라클 데이터베이스에 연결해서 샘플 테스트를 진행할 것이므로 Standalone 모드에서 사용하는 TCP 8080 포트와 오라클 데이터베이스에서 사용하는 1521 포트가 개방되어 있어야 합니다.

테스트 환경이 로컬 PC에서 Oracle Cloud Infrastructure 가상 머신으로 접속하여 테스트할 것이기 때문에 아래와 같이 호스트에서 8080, 1521 포트를 개방했고, 또한 호스트가 소속된 서브넷이 사용하는 OCI Security List에서도 인터넷을 통해 들어오는 트래픽에 대해 Ingress Rule로 해당 포트 개방을 추가했습니다.

[root@inst-db opc]# firewall-cmd --permanent --zone=public --add-port=8080/tcp
success
[root@inst-db opc]# firewall-cmd --permanent --zone=public --add-port=1521/tcp
success
[root@inst-db opc]# firewall-cmd --reload
success
[root@inst-db opc]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens3
  sources:
  services: dhcpv6-client ssh
  ports: 8080/tcp 1521/tcp
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

테스트를 위해 먼저 오라클 데이터베이스를 기동합니다. PDB도 open 했습니다. 이번 테스트에서는 PDB에 테이블을 생성하고, 여기에 ORDS가 연결되는 테스트를 진행할 것입니다. 따라서 ORDS Standalone가 모드로 기동할 때 해당 PDB 정보를 연결해서 기동되어야 합니다. 이에 대한 설정은 ORDS 설치 디렉토리의 config/ords 아래 defaults.xml 파일에서 수정합니다. 파일을 열어서 <entry key="db.servicename">orclpdb1</entry> 의 값을 PDB 서비스명으로 변경해줍니다. 최초에는 CDB의 서비스명으로 되어있습니다.

[oracle@inst-db ~]$ cd $ORACLE_BASE/ords/config/ords
[oracle@inst-db ords]$ ls
conf  defaults.xml  defaults.xml.org  standalone
[oracle@inst-db ords]$ vi defaults.xml
...

http://java.sun.com/dtd/properties.dtd>">

Saved on Wed Feb 23 08:46:42 GMT 2022
true
basic
localhost
1521
orclpdb1
true
true
true

이제 ords.war 파일이 있는 디렉토리로 이동해서 아래와 같이 ORDS를 Standalone 모드로 기동합니다. HTTP 프로토콜로 기동했습니다.

[oracle@inst-db ~]$ cd $ORACLE_BASE/ords
[oracle@inst-db ords]$ java -jar ords.war standalone
Enter 1 if using HTTP or 2 if using HTTPS [1]:1
Enter the HTTP port [8080]:
2022-02-24T03:51:49.289Z INFO        HTTP and HTTP/2 cleartext listening on host: localhost port: 8080
2022-02-24T03:51:49.305Z INFO        Disabling document root because the specified folder does not exist: /opt/oracle/ords/config/ords/standalone/doc_root
2022-02-24T03:51:50.650Z INFO        Configuration properties for: |apex|pu|
db.servicename=orclpdb1
db.hostname=localhost
restEnabledSql.active=true
db.password=******
resource.templates.enabled=true
db.port=1521
feature.sdw=true
db.connectionType=basic
database.api.enabled=true
db.username=ORDS_PUBLIC_USER

2022-02-24T03:51:50.652Z WARNING     *** jdbc.MaxLimit in configuration |apex|pu| is using a value of 10, this setting may not be sized adequately for a production environment ***
2022-02-24T03:51:50.652Z WARNING     *** jdbc.InitialLimit in configuration |apex|pu| is using a value of 3, this setting may not be sized adequately for a production environment ***
2022-02-24T03:51:52.934Z INFO        Oracle REST Data Services initialized
Oracle REST Data Services version : 21.4.1.r0250904
Oracle REST Data Services server info: jetty/9.4.44.v20210927

REST 접속을 위한 데이터베이스 테이블 설정 및 엑세스 확인

ORDS를 통해 엑세스할 테이블스페이스, 유저, 권한부여, 테스트 테이블 및 데이터를 PDB에 생성합니다.

SQL> alter session set container=orclpdb1;
Session altered.

SQL> show con_name
CON_NAME
------------------------------
ORCLPDB1

SQL> create tablespace ordstest datafile 'ordstest.dbf' size 100m autoextend on;
Tablespace created.

SQL> create user ordstest identified by xxxxxxxxxx;
User created.

SQL> grant connect to ordstest;
Grant succeeded.

SQL> grant resource to ordstest;
Grant succeeded.

SQL> grant unlimited tablespace to ordstest;
Grant succeeded.

SQL> CREATE TABLE ordstest.EMP (
  EMPNO NUMBER(4,0),
  ENAME VARCHAR2(10 BYTE),
  JOB VARCHAR2(9 BYTE),
  MGR NUMBER(4,0),
  HIREDATE DATE,
  SAL NUMBER(7,2),
  COMM NUMBER(7,2),
  DEPTNO NUMBER(2,0),
  CONSTRAINT PK_EMP PRIMARY KEY (EMPNO)
  );
Table created.

SQL> Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7369,'SMITH','CLERK',7902,to_date('17-DEC-80','DD-MON-RR'),800,null,20);
Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7499,'ALLEN','SALESMAN',7698,to_date('20-FEB-81','DD-MON-RR'),1600,300,30);
Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7521,'WARD','SALESMAN',7698,to_date('22-FEB-81','DD-MON-RR'),1250,500,30);
Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7566,'JONES','MANAGER',7839,to_date('02-APR-81','DD-MON-RR'),2975,null,20);
Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7654,'MARTIN','SALESMAN',7698,to_date('28-SEP-81','DD-MON-RR'),1250,1400,30);
Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7698,'BLAKE','MANAGER',7839,to_date('01-MAY-81','DD-MON-RR'),2850,null,30);
Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7782,'CLARK','MANAGER',7839,to_date('09-JUN-81','DD-MON-RR'),2450,null,10);
Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7788,'SCOTT','ANALYST',7566,to_date('19-APR-87','DD-MON-RR'),3000,null,20);
Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7839,'KING','PRESIDENT',null,to_date('17-NOV-81','DD-MON-RR'),5000,null,10);
Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7844,'TURNER','SALESMAN',7698,to_date('08-SEP-81','DD-MON-RR'),1500,0,30);
Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7876,'ADAMS','CLERK',7788,to_date('23-MAY-87','DD-MON-RR'),1100,null,20);
Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7900,'JAMES','CLERK',7698,to_date('03-DEC-81','DD-MON-RR'),950,null,30);
Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7902,'FORD','ANALYST',7566,to_date('03-DEC-81','DD-MON-RR'),3000,null,20);
Insert into ordstest.EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7934,'MILLER','CLERK',7782,to_date('23-JAN-82','DD-MON-RR'),1300,null,10);
commit;
1 row created.
...
SQL>

ORDS로 데이터베이스 데이터를 핸들링하기 위해서는 스키마 레벨, 오브젝트 레벨에서 ORDS를 enable 해 주여야합니다. 각각 ORDS.ENABLE_SCHEMA, ORDS.ENABLE_OBJECT 프로시저로도 할 수도 있으나 여기에서는 PL/SQL Developer를 사용했습니다.

생성한 ordstest 유저로 SQL Developer에 접속한 다음, 해당 커넥션을 선택한 후, 오른쪽 클릭을 해서 REST 서비스 > REST 서비스 사용을 선택합니다.

스키마 사용을 체크하고, 스키마 별칭에 테스트 테이블의 스키마 이름을 “ordstest”를 입력하고 “다음”를 클릭합니다. 특정 role을 가진 유저에게만 데이터에 대한 엑세스를 허용하는 권한 부여 옵션은 여기에서는 체크하지 않았습니다.

설정된 내용을 확인하고 “종료”를 클릭합니다.

스키마 레벨의 ORDS 설정이 완료되었습니다.

이번에는 오브젝트(EMP 테이블)에 대한 ORDS 설정을 합니다. 해당 테이블을 선택하고 오른쪽 클릭을 해서 REST 서비스 사용을 클릭합니다.

객체 사용을 체크하고, 객체 별칭에는 테이블 이름 “emp”를 입력하고, “다음”을 클릭합니다.

설정된 내용을 확인하고 “종료”를 클릭합니다.

오브젝트 레벨의 ORDS 설정이 완료되었습니다.

이제 REST 엔드포인트를 테스트할 차례입니다. 크롬이나 파이어폭스를 열어서 주소창에 아래 주소를 입력하고 엔터를 칩니다. 아래 IP 주소는 테스트 호스트의 퍼블릭IP입니다.

http://129.213.151.172:8080/ords/ordstest/emp/

ORDSTEST 스키마는 /ordstest/ 경로에, EMP 테이블은 /emp/ 경로에 노출되었습니다.

참고로, 에러 발생 등의 이유로 디버그가 필요할 경우, defaults.xml 파일에서 아래 엔트리 키를 추가합니다. 단, 운영환경에서는 많은 양의 출력 데이터가 기록되는 상황에서 성능 이슈가 발생할 수 있다는 점과 민감한 정보가 해커에게 노출될 수 있는 위험으로 인해 설정하지 않아야합니다.

<entry key="debug.printDebugToScreen">true</entry>

 

<END>