Oracle APEX23.2の新機能 チーム開発向け "ワーキングコピー"を試してみた

# 今回の主な内容
- 本年を振り返ってみると、複数メンバーでのAPEX開発で、よもや開発資材消失！？という肝を冷やした体験がありました。その反省を踏まえて、今後の安全なチーム開発のために新機能「Application Working Copies（アプリケーションの作業用コピー）」がどのように使えるかクイックにトライしてみます。

# Oracle APEX 23.2新機能 アプリケーションの作業用コピーについて

>アプリケーションの作業用コピーを作成してバグを修正したり機能を追加した後、変更を選択的にメイン・アプリケーションにマージして戻すことで、自信を持って開発できます。作業用コピーは必要に応じていくつでも作成できるため、複数の開発者が1つのアプリケーションに変更をコントリビュートしてマージできます。

当機能を含む23.2の新機能紹介はこちら。
[Oracle APEX 23.2 新機能の紹介](https://apex.oracle.com/ja/platform/features/whats-new-232/)

ドキュメントはこちら。
[5.7 Creating a Working Copy to Merge, Refresh, or Compare](https://docs.oracle.com/en/database/oracle/apex/23.2/htmdb/creating-a-working-copy-to-merge-refresh-or-compare.html#GUID-A0BE13E9-7BC9-4B45-8A82-D44CA762C166)



# 前提
- 検証する限りは、対象ページにおける部分的なマージは機能対応してないように思われます。（ここでは複数メンバーで別ページを分担しての改修を想定しました。）
- 下記のシナリオではエラーは発生しませんでしたが、現時点でマージに対応してないコンポーネントの場合、当機能で実行しようとするとエラーが発生します。その場合は手動マージが必要です（当ページ「制限事項など」参照）
- 本格運用の前に各チームの運用に応じた検証を行うことを推奨します。

# 想定シナリオ

マスターアプリは主に以下のページで構成されています。
- ホームページ
- EMPページ

|項番|マスターアプリ  |コピーアプリ  |
|---|---|---|
|1  |作成  |-  |
|2  |-  |アプリをコピーする  |
|3  |EMPページを更新（列名を日本語化）  |-  |
|4  |-  |DEPTページを作成  |
|5  |コピーアプリをマージする  |-  |

# 検証内容

+ EMPページの更新が維持されていること
+ DEPTページが追加されていること

# シナリオ実行

## 1. マスターアプリ作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607651/4f2af681-61eb-3405-4164-be1d06a1ecc3.png)

- EMP表を基にしたEMPページを2ページで作成しています。


## 2. アプリをコピーする

上記の画面の右側の「作業用コピーの作成」をクリックし、表示されたダイアログにて必要情報を入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607651/93b4dbf3-e95f-3b8e-cb95-065f9bc63b91.png)

作成されると、ワーキングコピー名が黄色で強調された状態でコピーアプリが作成されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607651/240b09d2-b7ff-2080-5b24-915714c2d2a5.png)


## 3. マスターアプリでEMPページを更新する

コピーアプリからマスターアプリにスイッチします。
操作は右上のメニューから「メインに切替え」をクリックするのみ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607651/0499e238-3ed3-ba5c-5b37-699d48791e59.png)


スイッチ後に表示されたマスターアプリからEMPページを表示し、
Interactive Gridの列名を日本語化します。日本語化作業後の画面はこの通り。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607651/f5a1f937-0e15-40bf-d68d-dfcc5ff7071d.png)

念のため、EMPページの意図した更新を防ぐためページロックを設定しておきます。
（ページロックは右上のページ番号と実行ボタンの右側にあります）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607651/186f3a53-e742-7758-c827-662cbb3b1129.png)


## 4. コピーアプリでDEPTページを作成する

再度、コピーアプリに再スイッチします。
操作はなぜか上記のようなページ上からはうまくいかなかったので、一度アプリの階層に戻り
スクショ右下の「作業用コピー」からワーキングコピー名を選択して戻りました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607651/353b452b-4109-9276-bc1b-4da74cab0595.png)


念のため、コピーアプリのEMPページを確認します。当然マスター側の更新影響は受けていないので
列名はデフォルトの英名のままであることが確認できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607651/b860a969-c456-19b3-95a4-6d3f6a30fe34.png)

さて、コピーアプリでDEPTページを作成します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607651/93b7c010-5e26-3bf3-7dc2-b7be0dceb099.png)

作成後に、アプリ上で下記のように20ページ目にDEPTページが増えていることが確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607651/ba8b9cee-f475-fd27-8565-0aabac2358d2.png)

## 5. コピーアプリをマージする

さてここからが肝心のマージ作業です。
上部のメニューより「メインにマージ」をクリックします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607651/89787fd0-b017-b6be-ce47-3dafd445d01b.png)

今回EMPページは操作していないのでチェックを外します。

チェック外したEMPを差分確認してみるとこんな感じ。これはメイン側を活かす必要がありますね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607651/84a0f484-a942-81f8-6a7b-e2c7e7c25132.png)

「次へ」をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607651/04f92f88-65ca-52d2-0ca8-8e0a865ed944.png)


対象を確認します。
マージ後にアプリコピーの削除も可能ですが、ここでは念のため残しておきます。
このまま「マージの確認」をぽちっ！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607651/fafe27d0-230f-3c5f-765a-7864e5eadd68.png)

しばらくするとマージが完了します。

## 検証

+ EMPページの更新が維持されていること

⇒OKです！マージの影響を受けずマスターアプリでの更新が維持されてます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607651/909abf3d-131d-1b71-d8f9-2fbd8249d463.png)



+ DEPTページが追加されていること

⇒OKです！コピーアプリで開発したページが正しくマスターアプリに反映されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607651/b5fe17aa-419b-d5c5-86d6-8332cadc29c9.png)


## 後片付け

不要になったワーキングコピーを以下のメニューより削除しておきましょう。
（操作のためにはワーキングコピーに一度スイッチする必要がありそうです）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607651/737627e3-e774-5641-01b8-1f2d30640c00.png)

ワーキングコピー表示がなくなりました。

# 振り返り
- シンプルな実装、シンプルな運用であればマージ機能が利用できます。
- ただしやはり本番運用の場合は対象外のコンポーネントにひっかかることが少なくないかもしれません。
- コードの比較！これはとても便利です。旧来のアプリコピーでのチーム開発を行っている場合はこちらの方式に変更して差分比較のみを利用する運用変更もメリットはあると思います。
- とはいえバックアップがとにかく重要！！不慮の事態に備えてワーキングコピーのExportやコピーは確実にして、インシデントが発生しないように来年も行きましょう！！ 

# 制限事項など

詳細はドキュメントをご確認ください。
[5.7 Creating a Working Copy to Merge, Refresh, or Compare](https://docs.oracle.com/en/database/oracle/apex/23.2/htmdb/creating-a-working-copy-to-merge-refresh-or-compare.html#GUID-A0BE13E9-7BC9-4B45-8A82-D44CA762C166)

APEXの画面上の記載事項は以下の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/607651/b45ce127-5e00-14c4-003b-a81ea6ab1370.png)

> ヒント
> 作業用コピーのあるアプリケーションをエクスポートする場合、作業用コピーはエクスポートの対象になりません
> 作業用コピーは必要に応じて別途エクスポートします
> メインとのリンクを維持するには、「元のID」を使用します
> 作業用コピーをメインからリンク解除するには、「アプリケーションのコピー」タスクを使用します
> アプリケーションを削除する前に作業用コピーを削除します
> 開発者はそれぞれ異なる作業用コピーを使用できます。マージ時の上書きやエラーを回避するには:
> 各開発者が作成する新しいページのページ範囲を予約します
> 各開発者が追加する共有コンポーネントの名前について合意します
> サポートされていないコンポーネント・タイプ
> 次のコンポーネント・タイプは、まだ自動マージではサポートされていません: 翻訳、テーマ、テーマ・テンプレート、サポートするオブジェクト、アプリケーション・プロパティ、および ワークスペースレベル・コンポーネント(アプリケーション・グループ、資格証明、 リモート・サーバーなど)。開発者は、作業用コピーを 削除せずにマージし、追加または変更をこれらのコンポーネント・タイプに手動で適用できます。
>
>制限事項
>作業用コピーには次の制限があります:
>
>作業用コピーの作業用コピーは作成できません
>削除した作業用コピーのページや共有コンポーネントは、メインで手動で削除する必要があります
>欠落としてリストされているコンポーネントは、作業用コピーで削除されたか、メインにのみ存在している可能性があります
>