메뉴 건너뛰기

Korea Oracle User Group

23c Free Developer Release

Annotation 사용하기(comment와 유사한)

 

annotation은 comment와 같이

추가 속성 메타데이터이며

이 정보를 관리하기 위해 사용할 수 있을 듯합니다.

 

다만 comment와는 다르게 편의를 위해 애플리케이션, 모듈 및 마이크로서비스 간에

메타데이터 정보를 공유할 수 있으며 

편의를 위해 데이터베이스에서 중앙 집중식으로

저장하여 사용할 수 있다고 합니다.

 

annotation을 사용하여 비즈니스 논리, 사용자 인터페이스의 정보를 지정, 저장하거나

데이터베이스 개체에 대한 정보 메타데이터를 저장소와 같이 활용하여 저장하고

이를 중앙 집중식으로 관리하고 보여주기 위해 사용할 수 있는 거 같습니다. 

 

comment와 annotation의 차이점(아래와 같다고 합니다)

1. 인덱스, 프로시저, 트리거, 도메인등 다른 오브젝트에 사용 가능 여부

2. 내용 추가에 용이하다

3. annotation은 하나의 DDL 문으로 여러 annotation을 생성할 수 있다.

4. annotation은 하나의 뷰에서 모든 내용을 조회할 수 있다.

 

지원하는 오브젝트

1. Tables and Table columns

2. Views and view columns

3. Materialized views and Materialized view columns

4. Indexes

5. Domains and multi-column domain columns

 

annotation을 추가할려면 annotation을 추가하고자 하는 오브젝트에 대해 create, alter 권한이 있어야 합니다.

 

Syntax

 

annotations
         ::= 'ANNOTATIONS' '(' annotations_list ')'
 
annotations_list
         ::= ( 'ADD' | 'DROP' )? annotation ( ',' ( 'ADD' | 'DROP' )? annotation )*
 
annotation
         ::= annotation_name annotation_value?
 
annotation_name
         ::= identifier
 
annotation_value
         ::= character_string_literal

 

사용 방법에 대해서 알아 보겠습니다.

 

먼저 현재 annotation 정보가 있는지 확인합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SQL> set lines 200
SQL> set pages 200
SQL> col object_name format a25
SQL> col object_type format a12
SQL> col column_name format a15
SQL> col annotation_name format a20
SQL> col annotation_value format a25
SQL> 
SQL> select object_name
  2       , object_type
  3       , column_name
  4       , annotation_name
  5       , annotation_value 
  6  from user_annotations_usage
  7  order by annotation_name, annotation_value;
 
선택된 레코드가 없습니다.

 

annotation을 포함한 테이블을 생성합니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
SQL> create table annotation_test
  2  (cd_main varchar2(10) annotations(display '메인 코드')
  3  ,cd_sub varchar2(10) annotations(display 'ㅋㅋㅋ')
  4  ,code_value varchar2(100))
  5  annotations(tabname '메인 코드 테이블');
 
테이블이 생성되었습니다.
 
SQL> select object_name
  2       , object_type
  3       , column_name
  4       , annotation_name
  5       , annotation_value 
  6  from user_annotations_usage
  7  order by annotation_name, annotation_value;
 
OBJECT_NAME               OBJECT_TYPE  COLUMN_NAME     ANNOTATION_NAME      ANNOTATION_VALUE
------------------------- ------------ --------------- -------------------- -------------------------
ANNOTATION_TEST           TABLE        CD_SUB          DISPLAY              ㅋㅋㅋ
ANNOTATION_TEST           TABLE        CD_MAIN         DISPLAY              메인 코드
ANNOTATION_TEST           TABLE                        TABNAME              메인 코드 테이블

 

테이블 레벨에서 annotation을 추가하고 삭제해 봅니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
SQL> alter table annotation_test annotations(created 'kwan');
 
테이블이 변경되었습니다.
 
SQL> select object_name
  2       , object_type
  3       , column_name
  4       , annotation_name
  5       , annotation_value 
  6  from user_annotations_usage
  7  order by annotation_name, annotation_value;
 
OBJECT_NAME               OBJECT_TYPE  COLUMN_NAME     ANNOTATION_NAME      ANNOTATION_VALUE
------------------------- ------------ --------------- -------------------- -------------------------
ANNOTATION_TEST           TABLE                        CREATED              kwan
ANNOTATION_TEST           TABLE        CD_SUB          DISPLAY              ㅋㅋㅋ
ANNOTATION_TEST           TABLE        CD_MAIN         DISPLAY              메인 코드
ANNOTATION_TEST           TABLE                        TABNAME              메인 코드 테이블
 
SQL> alter table annotation_test annotations(drop created);
 
테이블이 변경되었습니다.
 
SQL> select object_name
  2       , object_type
  3       , column_name
  4       , annotation_name
  5       , annotation_value 
  6  from user_annotations_usage
  7  order by annotation_name, annotation_value;
 
OBJECT_NAME               OBJECT_TYPE  COLUMN_NAME     ANNOTATION_NAME      ANNOTATION_VALUE
------------------------- ------------ --------------- -------------------- -------------------------
ANNOTATION_TEST           TABLE        CD_SUB          DISPLAY              ㅋㅋㅋ
ANNOTATION_TEST           TABLE        CD_MAIN         DISPLAY              메인 코드
ANNOTATION_TEST           TABLE                        TABNAME              메인 코드 테이블

 

테이블 레벨의 annotation으로 tabdescription을 추가하고 cd_sub 컬럼에 잘못된 annotation을 변경해 줍니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
SQL> alter table annotation_test annotations(add tabDescription '시스템 메인 코드 테이블');
 
테이블이 변경되었습니다.
 
SQL> alter table annotation_test modify cd_sub annotations(drop display, add display '서브 코드');
 
테이블이 변경되었습니다.
 
SQL> select object_name
  2       , object_type
  3       , column_name
  4       , annotation_name
  5       , annotation_value 
  6  from user_annotations_usage
  7  order by annotation_name, annotation_value;
 
OBJECT_NAME               OBJECT_TYPE  COLUMN_NAME     ANNOTATION_NAME      ANNOTATION_VALUE
------------------------- ------------ --------------- -------------------- -------------------------
ANNOTATION_TEST           TABLE        CD_MAIN         DISPLAY              메인 코드
ANNOTATION_TEST           TABLE        CD_SUB          DISPLAY              서브 코드
ANNOTATION_TEST           TABLE                        TABDESCRIPTION       시스템 메인 코드 테이블
ANNOTATION_TEST           TABLE                        TABNAME              메인 코드 테이블

 

뷰를 생성하면서 뷰 레벨과 뷰컬럼 레벨에서 annotation을 추가해 봅니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
SQL> create or replace view empdept_annotation_test
  2  (employee_id annotations (Identity, display 'employee Id', category 'emp info')
  3  ,first_name annotations (display 'employee name', category 'emp info')
  4  ,last_name
  5  ,department_name annotations (category 'emp info'))
  6  annotations (title 'employee view')
  7  as
  8  select e.employee_id, e.first_name, e.last_name, d.department_name 
  9  from employees e, departments d
 10  where e.department_id = d.department_id
 11  and salary>1000;
 
뷰가 생성되었습니다.
 
SQL> select object_name
  2       , object_type
  3       , column_name
  4       , annotation_name
  5       , annotation_value 
  6  from user_annotations_usage
  7  order by annotation_name, annotation_value;
 
OBJECT_NAME               OBJECT_TYPE  COLUMN_NAME     ANNOTATION_NAME      ANNOTATION_VALUE
------------------------- ------------ --------------- -------------------- -------------------------
EMPDEPT_ANNOTATION_TEST   VIEW         EMPLOYEE_ID     CATEGORY             emp info
EMPDEPT_ANNOTATION_TEST   VIEW         DEPARTMENT_NAME CATEGORY             emp info
EMPDEPT_ANNOTATION_TEST   VIEW         FIRST_NAME      CATEGORY             emp info
EMPDEPT_ANNOTATION_TEST   VIEW         EMPLOYEE_ID     DISPLAY              employee Id
EMPDEPT_ANNOTATION_TEST   VIEW         FIRST_NAME      DISPLAY              employee name
ANNOTATION_TEST           TABLE        CD_MAIN         DISPLAY              메인 코드
ANNOTATION_TEST           TABLE        CD_SUB          DISPLAY              서브 코드
EMPDEPT_ANNOTATION_TEST   VIEW         EMPLOYEE_ID     IDENTITY
ANNOTATION_TEST           TABLE                        TABDESCRIPTION       시스템 메인 코드 테이블
ANNOTATION_TEST           TABLE                        TABNAME              메인 코드 테이블
EMPDEPT_ANNOTATION_TEST   VIEW                         TITLE                employee view
 
11 행이 선택되었습니다.

 

인덱스를 생성하면서 인덱스에 annotaion 정보를 줍니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
SQL> create index annotation_test_idx1 
  2  on annotation_test(cd_main, cd_sub)
  3  annotations(Index_Description 'annotation_test Index');
 
인덱스가 생성되었습니다.
 
SQL> select object_name
  2       , object_type
  3       , column_name
  4       , annotation_name
  5       , annotation_value 
  6  from user_annotations_usage
  7  order by annotation_name, annotation_value;
 
OBJECT_NAME               OBJECT_TYPE  COLUMN_NAME     ANNOTATION_NAME      ANNOTATION_VALUE
------------------------- ------------ --------------- -------------------- -------------------------
EMPDEPT_ANNOTATION_TEST   VIEW         DEPARTMENT_NAME CATEGORY             emp info
EMPDEPT_ANNOTATION_TEST   VIEW         FIRST_NAME      CATEGORY             emp info
EMPDEPT_ANNOTATION_TEST   VIEW         EMPLOYEE_ID     CATEGORY             emp info
EMPDEPT_ANNOTATION_TEST   VIEW         EMPLOYEE_ID     DISPLAY              employee Id
EMPDEPT_ANNOTATION_TEST   VIEW         FIRST_NAME      DISPLAY              employee name
ANNOTATION_TEST           TABLE        CD_MAIN         DISPLAY              메인 코드
ANNOTATION_TEST           TABLE        CD_SUB          DISPLAY              서브 코드
EMPDEPT_ANNOTATION_TEST   VIEW         EMPLOYEE_ID     IDENTITY
ANNOTATION_TEST_IDX1      INDEX                        INDEX_DESCRIPTION    annotation_test Index
ANNOTATION_TEST           TABLE                        TABDESCRIPTION       시스템 메인 코드 테이블
ANNOTATION_TEST           TABLE                        TABNAME              메인 코드 테이블
EMPDEPT_ANNOTATION_TEST   VIEW                         TITLE                employee view
 
12 행이 선택되었습니다.

 

위와 같이 새로운 Feature인 annotation을 확인해 봤습니다.

 

정리하며

오라클의 매뉴얼에는 어플리케이션에서 표시할 수 있는 정보를 관리할 수 있는 용도를 예로 줬습니다.

그렇듯 개발자나 관리자가 해당 정보를 유용하게 사용할 수 있는 내용으로 사용하면 좋을 듯합니다.

그리고 한 곳(dba_annotations_usage)에서 모든 정보를 확인할 수 있어

개발자가 쉽게 참고해서 사용할 수 있을 거 같습니다. 

위로