ProSync๋ ๋๊ธฐํ ๊ณผ์ ์ค์ ์ ๋ฌํ๋ ์ธ๊ทธ๋จผํธ๋ฅผ ํ์ผ์ ์์ฐจ์ ์ผ๋ก ๊ธฐ๋กํ ์ ์๋ค. APPLY ํ๋ก์ธ์ค์์ Target DB์ ๋ฐ์ํ๋ STATEMENT ๋ฅผ ํ์ผ์ ์ ์ฅํ ์ ์๋๋ฐ, ์ด๋ฅผ SAM ๊ธฐ๋ฅ์ด๋ผ๊ณ ํ๋ค.
๋ค์์ SAM ๊ธฐ๋ฅ์ ์ง์ํ๋ ๋ฐ์ดํฐ ํ์ ์ด๋ค.
Tibero
NUMBER, CHAR, VARCHAR, DATE, TIME, TIMESTAMP, INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND, CLOB, TIMESTAMP WITH TIMEZONE, TIMESTAMP WITH LOCAL TIMEZONE, BINARY_FLOAT, BINARY_DOUBLE
[INST_ID]_apply1.cfg ํ์ผ์ ๋ค์์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํด์ผ ํ๋ค.
๋ณธ ์ ์์๋ TX_SAM_TEMPLATE, STMT_SAM_TEMPLATE, COL_SAM_TEMPLATE ํ๋ผ๋ฏธํฐ์์ ์ฌ์ฉํ ํ ํ๋ฆฟ์ ์ค์ ํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์ ํ๋ค.
ํ ํ๋ฆฟ ๊ตฌ์ฑ์์๋ '% + ์ํ๋ฒณ ํ๋(๋์๋ฌธ์ ๊ตฌ๋ถ)"์ผ๋ก ๊ตฌ์ฑํ๋ฉฐ, ์ด๋ ๊ฒ ๊ตฌ์ฑ๋ ํํ๊ฐ์ ์นํํ์ฌ Sam File์ ์ถ๋ ฅํ๋ค.
ProSync์๋ DML ์ด๋ ฅ์ ํ์ธํ ์ ์๋ ๋ค์ํ ๊ธฐ๋ฅ๋ค์ด ์๋ค. configํ์ผ์์ ๋ก๊ทธ ๋ ๋ฒจ์ 5๋ ๋ฒจ๋ก ๋์ด๋ฉด, ๋ฐ์ํ๊ณ ์๋ SQL๊ณผ Bindํ Value๋ค์ด byte array ํํ๋ก ๋จ๊ฒ ๋๋ค. ๋ค๋ง ๋ก๊ทธ ๋ ๋ฒจ์ ๋ฐ๋์ ๋์ฌ์ผ ํ๋ค๋ ์ ๊ณผ, bind value๋ค์ด ๋ณ๋๋ก ๋จ์ผ๋ฏ๋ก ์ค์ SQL๋ก ๋ฐ๋ก ์ฒ๋ฆฌํ ์ ์๋ค๋ ๋จ์ ์ด ์๋ค.
๋ณธ ์ฅ์์๋ ์์ ๊ฐ์ ์ํฉ์์ ํ์ธํ ์ ์๋ SAM(Sequential Access Method) ํ์ผ ๊ธฐ๋ฅ๊ณผ DML ์๋ฌ ๋ฐ์ ์์ report ํ์ผ, DML ์ด๋ ฅ ํ์ธ ๊ธฐ๋ฅ ๋ฑ์ ๋ํ์ฌ ๊ธฐ์ ํ๋ค.
Oracle
NUMBER, CHAR, VARCHAR, DATE, TIME, TIMESTAMP, INTERVAL YEAR TO MONTH, INTERVAL DAY TO SECOND, CLOB
PostgreSQL
SMALLINT, INTEGER, BIGINT, NUMERIC, DECIMAL, REAL, DOUBLE PRECISION, CHARACTER, CHARACTER VARYING, DATE, TIMESTAMP WITHOUT TIMEZONE
APPLY_TO_SAM=[Y|N]
SAM_BIND_VALUE=[Y|N]
SAM_LOG_PREFIX=[Y|N]
SAM_DIR=sam_dir_path
SAM_FILE_SIZE=file_size(1M-1G)
SAM_BACKUP_DIR=sam_backup_dir_path
SAM_BACKUP_SIZE=file_size(0-128G)
SQL_REDO_MODE=[Y|N]
TX_SAM_TEMPLATE=tx_template_file_path
STMT_SAM_TEMPLATE=stmt_template_file_path
COL_SAM_TEMPLATE=col_template_file_pathAPPLY_TO_SAM
APPLY ํ๋ก์ธ์ค์์ DB๋ก ๋ฐ์ํ๋ STATEMENT๋ฅผ SAM ํ์ผ๋ก ๋จ๊ธธ์ง ์ฌ๋ถ๋ฅผ ์ค์ ํ๋ค. (Y/N)
SAM_BIND_VALUE
SAM ํ์ผ์ ๋จ๊ฒจ์ง๋ Query ์ Value ๊ฐ ์ ์ฅ ์ฌ๋ถ๋ฅผ ์ค์ ํ๋ค. (Y/N)
Y : Value ๊ฐ์ ์ ์ฅํ๋ค. (๊ธฐ๋ณธ๊ฐ)
N : Value ๊ฐ์ '?' ๋ก ์นํํ๋ค.
SAM_LOG_PREFIX
*transaction template file ์ค์ *
tx {
xid: %X
stmt count: %C
commit tsn: %T
}
*EXT SAM FILE ์ถ๋ ฅ ์์ *
tx {
xid: 655403
stmt count:
commit tsn: 26362351
}
*APPLY SAM FILE ์ถ๋ ฅ ์์ *
tx {
xid: 655403
stmt count: 100
commit tsn: 26362351
}xid
%X
ํธ๋์ญ์ ์ xid
statement count
%C
*statement template file ์ค์ *
stmt {
op: %O
op code: %o
owner: %W
table name: %N
sgmt id: %I
tsn: %T
wrap no: %R
log seq: %L
set: %s
where: %w
values: %v
ddl/dml string: %D
}
*column template file ์ค์ *
col {
name: %N
values: %V
column count: %n
}
*INSERT STATEMENT ๊ฒฐ๊ณผ ์์ *
INSERT)
stmt {
op:INSERT
op code:0
owner:PRS_TEST
table name:VARCHAR_T
sgmt id:26424
tsn:26362394
wrap no:43
log seq:2102
set:
where:
values:
col {
name:C1
values:1
column count:0
}
col {
name:VCHAR_COL
values:VARCHAR
column count:1
}
ddl/dml string:INSERT INTO "PRS_TEST"."VARCHAR_T" ("C1", "VCHAR_COL") VALUES
(1, VARCHAR)
}
*UPDATE STATEMENT ๊ฒฐ๊ณผ ์์ *
UPDATE)
stmt {
op:UPDATE
op code:2
owner:PRS_TEST
table name:NVARCHAR_T
sgmt id:26436
tsn:26362421
wrap no:87
log seq:2103
set:
col {
name:NVCHAR_COL
values:NVARCHAR2
column count:1
}
where:
col {
name:C1
values:10
column count:0
}
col {
name:NVCHAR_COL
values:NVCHAR
column count:1
}
values:
ddl/dml string:UPDATE "PRS_TEST"."NVARCHAR_T" SET NVCHAR_COL = NVARCHAR2
WHERE C1 = 10 AND NVCHAR_COL = NVCHAR
}
*DELETE STATEMENT ๊ฒฐ๊ณผ ์์ *
DELETE)
stmt {
op:DELETE
op code:1
owner:PRS_TEST
table name:NVARCHAR_T
sgmt id:26436
tsn:26362437
wrap no:175
log seq:2103
set:
where:
col {
name:C1
values:10
column count:0
}
col {
name:NVCHAR_COL
values:NVARCHAR2
column count:1
}
values:
ddl/dml string:DELETE FROM "PRS_TEST"."NVARCHAR_T" WHERE C1 = 10 AND
NVCHAR_COL = NVARCHAR2
}
*DDL STATEMENT ๊ฒฐ๊ณผ ์์ *
DDL)
stmt {
op:DDL
op code:9
owner:PRS_TEST
table name:NVARCHAR_T
sgmt id:
tsn:26362654
wrap no:332
log seq:2103
set:
where:
values:
ddl/dml string:truncate table nvarchar_t
} op(string)
%O
dml : INSERT, UPDATE, DELETE, ddl : DDL
op code
%o
column name
%N
column ์ด๋ฆ
column value
%V
์ฃผ์
SAM_BIND_VALUE ๋ฅผ ์ฌ์ฉํ์ฌ SAM ํ์ผ์ Query์ value ๊ฐ์ ์ ์ฅํ ์, ๋๊ธฐํ๋ฅผ ์งํ์ค์ธ table์ column ์ ํ์ ๋ฐ๋ผ SAM ํ์ผ์ ๊ณผ๋ํ ์ฉ๋ ์ฆ๊ฐ๋ฅผ ์ฃผ์ํด์ผ ํ๋ค.
ํด๋น Query๊ฐ ์ํ๋ ์๊ฐ๊ณผ ์ค๋ ๋ ๋ฐ์ดํฐ ์ ๋ณด๋ฅผ SAM ํ์ผ row์ ์์ ๋ถ๋ถ์ ๋ถ์ด๋ ๊ธฐ๋ฅ์ด๋ค. (Y|N)
Y : ํด๋น ์ ๋ณด๋ฅผ row์ ์์ ๋ถ๋ถ์ ์ฒจ๋ถํ๋ค. (๊ธฐ๋ณธ๊ฐ)
N : ํด๋น ์ ๋ณด๋ฅผ ๋จ๊ธฐ์ง ์๋๋ค.
SAM_DIR
ํ๋ก์ธ์ค์ SAM ํ์ผ์ด ์ ์ฅ๋๋ ๋๋ ํฐ๋ฆฌ ์์น๋ฅผ ๋ํ๋ธ๋ค.
SAM_FILE_SIZE
ํ๋ก์ธ์ค๋ณ SAM ํ์ผ์ ์ต๋ ํฌ๊ธฐ๋ฅผ ์ค์ ํ๋ค.
SAM ํ์ผ์ ํฌ๊ธฐ๊ฐ SAM_FILE_SIZE๋ฅผ ๋์ผ๋ฉด SAM_BACKUP_DIR๋ก ์ฎ๊ธด ํ ์๋ก์ด SAM ํ์ผ์ ์์ฑํ๋ค. (๊ธฐ๋ณธ๊ฐ: 100MB, ๋ฒ์: 1MB ~ 1GB)
SAM_BACKUP_DIR
SAM ํ์ผ์ ๋ฐฑ์ ํ์ผ์ด ์ ์ฅ๋๋ ๋๋ ํฐ๋ฆฌ ์์น๋ฅผ ์ค์ ํ๋ค.
SAM_BACKUP_SIZE
SAM_BACKUP_SIZE๋ SAM_BACKUP_DIR์ ๋ฐฑ์ ๋๋ SAM ํ์ผ๋ค์ ์ต๋ ํฌ๊ธฐ๋ฅผ ์ค์ ํ๋ค. (๊ธฐ๋ณธ๊ฐ: 0 (์ ํ์์), ๋ฒ์: 0 ~ 128GB)
SQL_REDO_MODE
SQL_REDO_MODE ํ๋ผ๋ฏธํฐ๋ Sam File์ ์ ํ๋ ๋ด์ฉ์ full dml/ddl๋ก ์ ์ด์ฃผ๋ ๊ธฐ๋ฅ์ด๋ค. (Y|N)
Y : sam file์ row by row๋ก DML์ด ๋จ๊ฒ ๋๋ค. (๊ธฐ๋ณธ๊ฐ)
N : sam file์ row by row๋ก DML์ด ๋จ์ง ์๋๋ค.
TX_SAM_TEMPLATE
TX_SAM_TEMPLATE ํ๋ผ๋ฏธํฐ๋ ํธ๋์ญ์ ์ Sam File์ ์ถ๋ ฅํ ๋ ์ฌ์ฉํ user_defined_template ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์ค์ ํ๋ ํ๋ผ๋ฏธํฐ์ด๋ค. SQL_REDO_MODE๊ฐ N์ธ ๊ฒฝ์ฐ์ ๋์ํ๋ค.
ProSync๋ ํธ๋์ญ์ ์ด commit์ ๋ง๋ ๋๋ง๋ค ๋ณธ ํ๋ผ๋ฏธํฐ ๊ฒฝ๋ก์ ์๋ ํ ํ๋ฆฟ์ ์ฝ์ด ํด๋น ํ ํ๋ฆฟ ํ์๋๋ก sam file์ ํธ๋์ญ์ ๋ด์ฉ์ ๋จ๊ธด๋ค.
STMT_SAM_TEMPLATE
STMT_SAM_TEMPLATE ํ๋ผ๋ฏธํฐ๋ statement(dml/ddl) ๋ด์ฉ์ Sam File์ ๋จ๊ฒจ์ค ๋ ์ฌ์ฉํ user_defined_template ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์ค์ ํ๋ ํ๋ผ๋ฏธํฐ์ด๋ค. SQL_REDO_MODE๊ฐ N์ธ ๊ฒฝ์ฐ์ ๋์ํ๋ค.
ProSync๋ DDL๊ณผ DML ๋ด์ฉ์ Sam File์ ๋จ๊ฒจ์ค ๋ ๋ณธ ํ๋ผ๋ฏธํฐ ๊ฒฝ๋ก์ ์๋ ํ ํ๋ฆฟ์ ์ฝ์ด ํด๋น ํ ํ๋ฆฟ ํ์๋๋ก sam file์ DDL, DML ๋ด์ฉ์ ๋จ๊ธด๋ค.
COL_SAM_TEMPLATE
COL_SAM_TEMPLATE ํ๋ผ๋ฏธํฐ๋ DML์ ์ถ๋ ฅํ ๋ ์ปฌ๋ผ ๋ด์ฉ์ ๋จ๊ธธ ๋ ์ฌ์ฉํ user_defined_template ํ์ผ์ ๊ฒฝ๋ก๋ฅผ ์ค์ ํ๋ ํ๋ผ๋ฏธํฐ์ด๋ค. SQL_REDO_MODE๊ฐ N์ธ ๊ฒฝ์ฐ์ ๋์ํ๋ค.
ProSync๋ DML์ ํ์ผ์ ๋จ๊ฒจ์ค ๋ COL_SAM_TEMPLATE์ ์ปฌ๋ผ์ ๋ํ ์ ์๊ฐ ๋์ด ์๋ค๋ฉด ํด๋น ํ ํ๋ฆฟ ํ์๋๋ก sam file์ ์ปฌ๋ผ ์ ๋ณด๋ฅผ ๋จ๊ธด๋ค.
ํธ๋์ญ์ ์ statement(dml) ๊ฐ์, ext sam์์๋ ์ถ๋ ฅํ์ง ์๋๋ค.
commit tsn
%T
ํธ๋์ญ์ ์ commit tsn
insert, update, delete, ddl์ ๋ํ opcode
owner
%W
statement์ user name
name
%N
statement์ table name
sgmt id
%I
ํด๋น object์ segment id
tsn
%T
statement๊ฐ ์คํ๋ tsn
wrap no
%R
statement์ wrap number
log seq
%L
statement๊ฐ ๊ธฐ๋ก๋ log sequence number
set
%s
update ๊ตฌ๋ฌธ์ set ์ ์ ๋ํ ๋ด์ฉ (insert์ delete์ ๊ฒฝ์ฐ empty string์ผ๋ก ์นํ)
where
%w
update, delete ๊ตฌ๋ฌธ์ where ์ ์ ๋ํ ๋ด์ฉ (insert์ ๊ฒฝ์ฐ empty string์ผ๋ก ์นํ)
values
%v
insert ๊ตฌ๋ฌธ์ values ์ ์ ๋ํ ๋ด์ฉ (update, delete์ ๊ฒฝ์ฐ empty string์ผ๋ก ์นํ)
ddl/dml string
%D
statement์ full dml/ddl string
column ๊ฐ
column count
%n
column count
APPLY ํ๋ก์ธ์ค์์ DML ๋ฐ์ ์ MAP ํ๋ผ๋ฏธํฐ๋ก ์ง์ ํ History ํ ์ด๋ธ์ ๋ฐ์๋ history ๋ฅผ ๋จ๊ธฐ๋ ๊ธฐ๋ฅ์ด๋ค.
ํด๋น ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๊ธฐ์กด ProSync ๋๊ธฐํ๋ฅผ ์งํํ๋ ์ธ์คํด์ค ์ด์ธ์ DML History ๊ธฐ๋ฅ ์๋์ ์ํ ์ธ์คํด์ค๊ฐ ์ถ๊ฐ๋ก ํ๋ ๋ ํ์ํ๋ค.
APPLY ํ๋ก์ธ์ค์ config ํ์ผ์ธ [inst_id]_apply1.cfg ํ์ผ์ ๋ค์์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํด์ผ ํ๋ค.
RECORD_HISTORY
์ถ๊ฐ์ ์ผ๋ก ๋๊ธฐํ ๋์ ํ ์ด๋ธ์ ์ถ๊ฐ์ ์ธ column๋ค์ด ํ์ํ๋ค.
APPLY ํ๋ก์ธ์ค๊ฐ ๋๊ธฐํ ์งํ ์ค DML ๋ฐ์์ ์คํจ ๋๋ ์ฅ์ ์ํฉ์ด ๋ฐ์ํ์ ๋ ์ผ์ ํ์๋ฅผ ์ฌ์๋ ํ ๋ค report ํ์ผ๋ก writeํ๋ ๊ธฐ๋ฅ์ด๋ค.
DML์ ๊ดํด์๋ง ๊ธฐ๋ก์ด ๊ฐ๋ฅํ๋ฉฐ, APPLY ํ๋ก์ธ์ค์ config ํ์ผ์ธ [inst_id]_apply1.cfg ํ์ผ์ ๋ค์์ ํ๋ผ๋ฏธํฐ๋ฅผ ์ค์ ํด์ผ ํ๋ค.
CLOB
ํด๋น ์ธ์คํด์ค์์ DML history ๊ธฐ๋ฅ์ ์ฌ์ฉ ํ ์ง์ ๋ํ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค. (Y|N)
Y : MAP RULE ๋ก ์ง์ ๋ history ํ ์ด๋ธ์ row by row๋ก DML์ด ๋จ๊ฒ ๋๋ค.
N : MAP RULE ๋ก ์ง์ ๋ history ํ ์ด๋ธ์ row by row๋ก DML์ด ๋จ์ง ์๋๋ค. (๊ธฐ๋ณธ๊ฐ)
ํด๋น ํ๋ผ๋ฏธํฐ๋ฅผ Y ๋ก ์ค์ ํ ๊ฒฝ์ฐ, MAP ํ๋ผ๋ฏธํฐ๋ฅผ history ๋ฅผ ๋จ๊ธธ ํ ์ด๋ธ๋ก ์ค์ ํด ์ฃผ์ด์ผ ํ๋ฉฐ, DDL ํ๋ผ๋ฏธํฐ์ ๊ฒฝ์ฐ exclude all ๋ก ์ค์ ํด ์ฃผ์ด์ผ ํ๋ค.
LEADING_PRS_USER
DML history ๊ธฐ๋ฅ์ ์ํด์ history๋ฅผ ๊ธฐ๋กํ ์ ํ๋๋ PRS_USER๋ฅผ ์ค์ ํ๋ ํ๋ผ๋ฏธํฐ์ด๋ค.
์ ํ๋๋ ์ธ์คํด์ค์ ๋๊ธฐํ๊ฐ ์ด๋ฃจ์ด์ ธ์ผ DML history๊ฐ ๋จ๊ฒ ๋๋ค. 3์ด์ฉ 10๋ฒ ์ด 30์ด ๋์ ๋ฐ๋ผ๋ณด๋ฉฐ, ๊ทธ ์์ ๋๊ธฐํ๊ฐ ์ด๋ฃจ์ด์ง์ง ์์ ๊ฒฝ์ฐ history๋ ๋จ์ง ์๋๋ค.
OLD_{์ปฌ๋ผ ๋ช }
ํด๋น column์ ๊ฒฝ์ฐ UPDATE, DELETE ๊ฐ์ column์ ๊ฐ์ด ๋ณ๊ฒฝ ๋ ๋์ ๊ฐ์ด ๋จ๊ฒ ๋๋ค. ๋ฐ๋ผ์ ๊ธฐ์กด ์ปฌ๋ผ๊ณผ ๋๊ฐ์ ํ์ ์ผ๋ก ์ค์ ํด ์ฃผ์ด์ผ ํ๋ค.
HIST_NO
NUMBER ์ด๋ฉฐ, ์์ฐจ ์ฑ๋ฒ์ ์ํ column์ด๋ค. Target DB SYS User ์ SQ_{HISTORY_TABLE} ์ ์ด๋ฆ์ ๊ฐ์ง sequence์ ์์ฑ์ด ํ์ํ๋ค. ์ด ๋ Sequence table ์ MIN 1 MAX 99999999 ์ ๊ฐ์ง๋ฉฐ, cycle ๋ก ์ํ๋์ด์ผ ํ๋ค.
IUD_FLAG
APPLY_TO_REPORT
Dml Error Report ๊ธฐ๋ฅ์ ์ฌ์ฉ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ค. (Y|N)
Y : report file์ row by row๋ก DML์ด ๋จ๊ฒ ๋๋ค. (๊ธฐ๋ณธ๊ฐ)
N : report file์ row by row๋ก DML์ด ๋จ์ง ์๋๋ค.
VARCHAR(6) ์ด๋ฉฐ, History ๊ฐ ๋จ์ DML ์ ์ ํ์ ๋ปํ๋ column์ด๋ค. INSERT / UPDATE / DELETE๊ฐ ๋จ๋๋ค.
IUD_TIME
TIMESTAMP ์ด๋ฉฐ, DML ์ด ์ํ ๋์ด history ๊ฐ ๋จ์ ์๊ฐ์ ๋ปํ๋ค.
APPLY_DML_ERR_REPORT_CNT
Dml Error Report ๊ธฐ๋ฅ์ ์ํด์ report file write๊ฐ ์์๋๊ธฐ ์ ์ฌ์๋ ํ์๋ฅผ ์ค์ ํ๋ ํ๋ผ๋ฏธํฐ์ด๋ค. (๊ธฐ๋ณธ๊ฐ: 20)
APPLY_REPORT_DIR
report ํ์ผ์ด ๋จ๊ฒจ์ง ๋๋ ํฐ๋ฆฌ๋ฅผ ์ค์ ํ๋ค.
(๊ธฐ๋ณธ๊ฐ: [prosync_directory]/var/[inst_id]/dml_err)
APPLY_REPORT_FILE_SIZE
๊ฐ ํ๋ก์ธ์ค ๋ณ DML error report ํ์ผ์ ์ต๋ ํฌ๊ธฐ๋ฅผ ์ค์ ํ๋ค. report ํ์ผ์ ํฌ๊ธฐ๊ฐ APPLY_REPORT_FILE_SIZE๋ฅผ ๋์ผ๋ฉด APPLY_REPORT_BACKUP_DIR๋ก ์ฎ๊ธด ํ ์๋ก์ด report ํ์ผ์ ์์ฑํ๋ค. (๊ธฐ๋ณธ๊ฐ: 100MB, ๋ฒ์: 1MB ~ 1GB)
APPLY_REPORT_BACKUP_DIR
DML error report ํ์ผ์ ๋ฐฑ์ ํ์ผ์ด ์ ์ฅ๋๋ ๋๋ ํฐ๋ฆฌ ์์น๋ฅผ ์ค์ ํ๋ค.
APPLY_REPORT_BACKUP_SIZE
APPLY_REPORT_BACKUP_DIR ๋ฐฑ์ ๋๋ report ํ์ผ๋ค์ ์ต๋ ํฌ๊ธฐ๋ฅผ ์ค์ ํ๋ค. ๊ฐ ํ๋ก์ธ์ค ๋ณ๋ก ๋ฐฑ์ ๋ ์ด report ํ์ผ์ ํฌ๊ธฐ๊ฐ APPLY_REPORT_BACKUP_SIZE๋ฅผ ๋์ผ๋ฉด ๊ฐ์ฅ ์ค๋๋ ํ์ผ๋ถํฐ ์์ฐจ์ ์ผ๋ก ์ญ์ ํ๋ค. (๊ธฐ๋ณธ๊ฐ: 0, ๋ฒ์: 0 ~ 128GB)