

# Amazon RDS for Db2를 위한 외부 저장 프로시저
<a name="db2-external-stored-procedures"></a>

외부 루틴을 만들고 이를 Amazon RDS for Db2 데이터베이스에 외부 저장 프로시저로 등록할 수 있습니다. 현재 RDS for Db2는 외부 저장 프로시저에 대해 Java 기반 루틴만 지원합니다.

## Java 기반 외부 저장 프로시저
<a name="db2-external-stored-procedures-java"></a>

Java 기반 외부 저장 프로시저는 RDS for Db2 데이터베이스에 외부 저장 프로시저로 등록하는 외부 Java 루틴입니다.

**Topics**
+ [Java 기반 외부 저장 프로시저의 제한 사항](#db2-external-stored-procedures-java-limitations)
+ [Java 기반 외부 저장 프로시저 구성](#db2-external-stored-procedures-java-configuring)

### Java 기반 외부 저장 프로시저의 제한 사항
<a name="db2-external-stored-procedures-java-limitations"></a>

외부 루틴을 개발하기 전에 다음 제한 사항 및 제약 조건에 유의하세요.

외부 루틴을 만들려면 Db2에서 제공하는 Java 개발 키트(JDK)를 사용해야 합니다. 자세한 내용은 [Java software support for Db2 database products](https://www.ibm.com/docs/en/db2/11.5?topic=servers-java-software-support-db2-database-products)를 참조하세요.

Java 프로그램은 `/tmp` 디렉터리에서만 파일을 생성할 수 있으며, Amazon RDS는 이러한 파일에 대한 실행 파일 또는 Set User ID(SUID) 권한 활성화를 지원하지 않습니다. 또한 Java 프로그램은 소켓 시스템 직접 호출이나 다음 시스템 직접 호출을 사용할 수 없습니다.
+ \_sysctl
+ acct
+ afs\_syscall
+ bpf
+ capset
+ chown
+ chroot
+ create\_module
+ delete\_module
+ fanotify\_init
+ fanotify\_mark
+ finit\_module
+ fsconfig
+ fsopen
+ fspick
+ get\_kernel\_syms
+ getpmsg
+ init\_module
+ mount
+ move\_mount
+ nfsservctl
+ open\_by\_handle\_at
+ open\_tree
+ pivot\_root
+ putpmsg
+ query\_module
+ quotactl
+ reboot
+ security
+ setdomainname
+ setfsuid
+ sethostname
+ sysfs
+ tuxcall
+ umount2
+ uselib
+ ustat
+ vhangup
+ vserver

Db2의 외부 루틴에 대한 추가 제약 조건은 IBM Db2 설명서의 [Restrictions on external routines](https://www.ibm.com/docs/en/db2/11.5?topic=routines-restrictions-external)를 참조하세요.

### Java 기반 외부 저장 프로시저 구성
<a name="db2-external-stored-procedures-java-configuring"></a>

외부 저장 프로시저를 구성하려면 외부 루틴으로 .jar 파일을 만들고 RDS for Db2 데이터베이스에 설치한 다음 외부 저장 프로시저로 등록하세요.

**Topics**
+ [1단계: 외부 저장 프로시저 활성화](#db2-external-stored-procedures-java-enable)
+ [2단계: 외부 루틴을 사용하여 .jar 파일 설치](#db2-external-stored-procedures-java-install-jar)
+ [3단계: 외부 저장 프로시저 등록](#db2-external-stored-procedures-java-register)
+ [4단계: 외부 저장 프로시저 검증](#db2-external-stored-procedures-java-validate)

#### 1단계: 외부 저장 프로시저 활성화
<a name="db2-external-stored-procedures-java-enable"></a>

외부 저장 프로시저를 활성화하려면 DB 인스턴스와 연결된 사용자 정의 파라미터 그룹에서 `db2_alternate_authz_behaviour` 파라미터를 다음 값 중 하나로 설정합니다.
+ `EXTERNAL_ROUTINE_DBADM` - `DBADM` 권한이 있는 모든 사용자, 그룹 또는 역할에 암시적으로 `CREATE_EXTERNAL_ROUTINE` 권한을 부여합니다.
+ `EXTERNAL_ROUTINE_DBAUTH` - `DBADM` 권한이 있는 사용자가 모든 사용자, 그룹 또는 역할에 `CREATE_EXTERNAL_ROUTINE` 권한을 부여하도록 허용합니다. 이 경우 `DBADM` 권한이 있는 사용자를 포함하여 모든 사용자, 그룹 또는 역할에 이 권한이 암시적으로 부여되지 않습니다.

이 설정에 대한 자세한 내용은 IBM Db2 설명서의 [GRANT (database authorities) statement](https://www.ibm.com/docs/en/db2/11.5?topic=statements-grant-database-authorities)를 참조하세요.

AWS Management Console, AWS CLI 또는 Amazon RDS API를 통해 사용자 지정 파라미터 그룹을 생성하고 수정할 수 있습니다.

##### 콘솔
<a name="db2-external-stored-procedures-java-enable-console"></a>

**사용자 지정 파라미터 그룹에서 db2\_alternate\_authz\_behaviour 파라미터를 구성하는 방법**

1. DB 인스턴스에서 사용하는 것과 다른 사용자 정의 DB 파라미터 그룹을 사용하려면 새로운 DB 파라미터 그룹을 생성합니다. Bring Your Own License(BYOL) 모델을 사용하는 경우 새 사용자 지정 파라미터 그룹에 IBM ID가 포함되어 있어야 합니다. 이 ID에 대한 자세한 내용은 [Db2용 Bring Your Own License(BYOL)를 위한 IBM ID](db2-licensing.md#db2-prereqs-ibm-info) 섹션을 참조하세요. DB 파라미터 그룹을 생성하는 것에 대한 자세한 내용은 [Amazon RDS에서 DB 파라미터 그룹 생성](USER_WorkingWithParamGroups.Creating.md) 단원을 참조하십시오.

1. 사용자 지정 파라미터 그룹에서 `db2_alternate_authz_behaviour` 파라미터 값을 설정합니다. 파라미터 그룹 수정에 대한 자세한 내용은 [Amazon RDS에서 DB 파라미터 그룹의 파라미터 수정](USER_WorkingWithParamGroups.Modifying.md) 섹션을 참조하세요.

##### AWS CLI
<a name="db2-external-stored-procedures-java-enable-cli"></a>

**사용자 지정 파라미터 그룹에서 db2\_alternate\_authz\_behaviour 파라미터를 구성하는 방법**

1. DB 인스턴스가 사용하는 것과 다른 사용자 지정 DB 파라미터 그룹을 사용하려면 [https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-parameter-group.html](https://docs.aws.amazon.com/cli/latest/reference/rds/create-db-parameter-group.html) 명령을 실행하여 사용자 지정 파라미터 그룹을 생성합니다. Bring Your Own License(BYOL) 모델을 사용하는 경우 새 사용자 지정 파라미터 그룹에 IBM ID가 포함되어 있어야 합니다. 이 ID에 대한 자세한 내용은 [Db2용 Bring Your Own License(BYOL)를 위한 IBM ID](db2-licensing.md#db2-prereqs-ibm-info) 섹션을 참조하세요.

   다음 필수 옵션을 포함합니다.
   + `--db-parameter-group-name` – 생성하려는 파라미터 그룹의 이름입니다.
   + `--db-parameter-group-family` – Db2 엔진 에디션 및 메이저 버전입니다. 유효 값은 `db2-se-11.5` 및 `db2-ae-11.5`입니다.
   + `--description` – 이 파라미터 그룹에 대한 설명입니다.

   DB 파라미터 그룹을 생성하는 것에 대한 자세한 내용은 [Amazon RDS에서 DB 파라미터 그룹 생성](USER_WorkingWithParamGroups.Creating.md) 단원을 참조하십시오.

   다음 예시는 파라미터 그룹 패밀리 `db2-se-11.5`에 사용자 정의 파라미터 그룹 `MY_EXT_SP_PARAM_GROUP`을 생성하는 방법을 보여줍니다.

   대상 LinuxmacOS, 또는Unix:

   ```
   aws rds create-db-parameter-group \
   --region us-east-1 \
   --db-parameter-group-name MY_EXT_SP_PARAM_GROUP \
   --db-parameter-group-family db2-se-11.5 \ 
   --description "test db2 external routines"
   ```

   Windows의 경우:

   ```
   aws rds create-db-parameter-group ^
   --region us-east-1 ^
   --db-parameter-group-name MY_EXT_SP_PARAM_GROUP ^
   --db-parameter-group-family db2-se-11.5 ^ 
   --description "test db2 external routines"
   ```

1. [https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-parameter-group.html](https://docs.aws.amazon.com/cli/latest/reference/rds/modify-db-parameter-group.html) 명령을 실행하여 사용자 지정 파라미터 그룹의 `db2_alternate_authz_behaviour` 파라미터를 수정합니다.

   다음 필수 옵션을 포함합니다.
   + `--db-parameter-group-name` – 생성한 파라미터 그룹의 이름입니다.
   + `--parameters` – 파라미터 업데이트를 위한 파라미터 이름, 값, 응용 방법으로 구성된 배열입니다.

   파라미터 그룹 수정에 대한 자세한 내용은 [Amazon RDS에서 DB 파라미터 그룹의 파라미터 수정](USER_WorkingWithParamGroups.Modifying.md) 섹션을 참조하세요.

   다음 예시는 `db2_alternate_authz_behaviour`의 값을 `EXTERNAL_ROUTINE_DBADM`으로 설정하여 파라미터 그룹 `MY_EXT_SP_PARAM_GROUP`을 수정하는 방법을 보여줍니다.

   대상 LinuxmacOS, 또는Unix:

   ```
   aws rds modify-db-parameter-group \
       --db-parameter-group-name MY_EXT_SP_PARAM_GROUP \
       --parameters "ParameterName='db2_alternate_authz_behaviour',ParameterValue='EXTERNAL_ROUTINE_DBADM',ApplyMethod=immediate"
   ```

   Windows의 경우:

   ```
   aws rds modify-db-parameter-group ^
       --db-parameter-group-name MY_EXT_SP_PARAM_GROUP ^
       --parameters "ParameterName='db2_alternate_authz_behaviour',ParameterValue='EXTERNAL_ROUTINE_DBADM',ApplyMethod=immediate"
   ```

##### RDS API
<a name="db2-external-stored-procedures-java-enable-api"></a>

**사용자 지정 파라미터 그룹에서 db2\_alternate\_authz\_behaviour 파라미터를 구성하는 방법**

1. DB 인스턴스에서 사용하는 것과 다른 사용자 정의 DB 파라미터 그룹을 사용하려면 Amazon RDS API [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBParameterGroup.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_CreateDBParameterGroup.html) 작업을 사용하여 새로운 DB 파라미터 그룹을 생성합니다. Bring Your Own License(BYOL) 모델을 사용하는 경우 새 사용자 지정 파라미터 그룹에 IBM Db2 ID가 포함되어 있어야 합니다. 이 ID에 대한 자세한 내용은 [Db2용 Bring Your Own License(BYOL)를 위한 IBM ID](db2-licensing.md#db2-prereqs-ibm-info) 섹션을 참조하세요.

   다음 필수 파라미터를 포함합니다.
   + `DBParameterGroupName`
   + `DBParameterGroupFamily`
   + `Description`

   DB 파라미터 그룹을 생성하는 것에 대한 자세한 내용은 [Amazon RDS에서 DB 파라미터 그룹 생성](USER_WorkingWithParamGroups.Creating.md) 단원을 참조하십시오.

1. RDS API [https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBParameterGroup.html](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_ModifyDBParameterGroup.html) 작업을 사용하여 생성한 사용자 지정 파라미터 그룹의 `db2_alternate_authz_behaviour` 파라미터를 수정합니다.

   다음 필수 파라미터를 포함합니다.
   + `DBParameterGroupName`
   + `Parameters`

   파라미터 그룹 수정에 대한 자세한 내용은 [Amazon RDS에서 DB 파라미터 그룹의 파라미터 수정](USER_WorkingWithParamGroups.Modifying.md) 섹션을 참조하세요.

#### 2단계: 외부 루틴을 사용하여 .jar 파일 설치
<a name="db2-external-stored-procedures-java-install-jar"></a>

Java 루틴을 만든 후에는 .jar 파일을 만든 다음 `db2 "call sqlj.install_jar('file:{{file_path}}',{{jar_ID}})"`를 실행하여 RDS for Db2 데이터베이스에 설치합니다.

다음 예시는 Java 루틴을 만들어 RDS for Db2 데이터베이스에 설치하는 방법을 보여줍니다. 예시에는 프로세스를 테스트하는 데 사용할 수 있는 간단한 루틴에 대한 샘플 코드가 포함되어 있습니다. 이 예에서는 다음을 가정합니다.
+ Java 코드는 Db2가 설치된 서버에서 컴파일됩니다. IBM에서 제공하는 JDK로 컴파일하지 않으면 설명할 수 없는 오류가 발생할 수 있으므로 이 방법이 가장 좋습니다.
+ 서버에는 RDS for Db2 데이터베이스가 로컬로 카탈로그되어 있습니다.

다음 샘플 코드를 사용하여 프로세스를 시험해 보려면 코드를 복사한 다음 `MYJAVASP.java`라는 파일에 저장하세요.

```
import java.sql.*;
public class MYJAVASP
{
public static void my_JAVASP (String inparam) throws SQLException, Exception
{
try
{
// Obtain the calling context's connection details.
Connection myConn = DriverManager.getConnection("jdbc:default:connection");
String myQuery = "INSERT INTO TEST.TEST_TABLE VALUES (?, CURRENT DATE)";
PreparedStatement myStmt = myConn.prepareStatement(myQuery);
myStmt.setString(1, inparam);
myStmt.executeUpdate();
}
catch (SQLException sql_ex)
{
throw sql_ex;
}
catch (Exception ex)
{
throw ex;
}
}
```

다음 명령은 Java 루틴을 컴파일합니다.

```
~/sqllib/java/jdk64/bin/javac MYJAVASP.java
```

다음 명령은 .jar 파일을 생성합니다.

```
~/sqllib/java/jdk64/bin/jar cvf MYJAVASP.jar MYJAVASP.class
```

다음 명령은 이름이 `MY_DB2_DATABASE`인 데이터베이스에 연결하고 .jar 파일을 설치합니다.

```
db2 "connect to MY_DB2_DATABASE user {{master_username}} using {{master_password}}" 

db2 "call sqlj.install_jar('file:/tmp/MYJAVASP.jar','MYJAVASP')"
db2 "call sqlj.refresh_classes()"
```

#### 3단계: 외부 저장 프로시저 등록
<a name="db2-external-stored-procedures-java-register"></a>

RDS for Db2 데이터베이스에 .jar 파일을 설치한 후 `db2 CREATE PROCEDURE` 또는 `db2 REPLACE PROCEDURE` 명령을 실행하여 저장 프로시저로 등록합니다.

다음 예시는 데이터베이스에 연결하고 이전 단계에서 만든 Java 루틴을 저장 프로시저로 등록하는 방법을 보여줍니다.

```
db2 "connect to MY_DB2_DATABASE user {{master_username}} using {{master_password}}"

create procedure TESTSP.MYJAVASP (in input char(6))
specific myjavasp
dynamic result sets 0
deterministic
language java
parameter style java
no dbinfo
fenced
threadsafe
modifies sql data
program type sub
external name 'MYJAVASP!my_JAVASP';
```

#### 4단계: 외부 저장 프로시저 검증
<a name="db2-external-stored-procedures-java-validate"></a>

다음 단계를 사용하여 이전 단계에서 등록된 샘플 외부 저장 프로시저를 테스트합니다.

**외부 저장 프로시저를 검증하는 방법**

1. 다음 예시에서처럼 `TEST.TEST_TABLE`과 같은 테이블을 생성합니다.

   ```
   db2 "create table TEST.TEST_TABLE(C1 char(6), C2 date)"
   ```

1. 새로운 외부 저장 프로시저를 직접 호출합니다. 호출 시 `0`의 상태가 반환됩니다.

   ```
   db2 "call TESTSP.MYJAVASP('test')"
   Return Status = 0
   ```

1. 1단계에서 만든 테이블을 쿼리하여 저장 프로시저 호출의 결과를 확인합니다.

   ```
   db2 "SELECT * from TEST.TEST_TABLE"
   ```

   이 쿼리는 다음 예시와 유사한 출력을 반환합니다.

   ```
   C1     C2
   ------ ----------
   test   02/05/2024
   ```